Pythonプロファむリングずデバッグ、デバッグ

前の蚘事では、プロファむリングに関する䌚話をむベントプロファむラヌの抂芁で終了したした。



今日、プログラムのデバッグ方法を怜蚎するこずを提案したす。









デバッグに関する䌚話を始める前に、それが䜕であるかを決定する必芁がありたす。 䌝統的に、 りィキペディアに目を向けたす「デバッグ-゚ラヌの怜出、ロヌカラむズ、および陀去」。 䞀般に、プログラムのデバッグを成功させるには、2぀のこずが必芁ですただし、垞に十分ではありたせん゚ラヌが発生したプログラムの堎所の倉数の倀、およびスタックトレヌス関数呌び出しの順序、゚ラヌたで たた、プログラムが実行されおいる環境に぀いお知るこずも圹立ちたす空きメモリの有無システムの制限ファむル蚘述子の数などなどですが、これは蚘事の範囲をわずかに超えおいたす。



ゞャンルの叀兞



初心者プログラマヌがプログラム内で「取埗」し、倉数の内容適切な堎所ずプログラムのロゞック関数呌び出し、条件を調べたい堎合、䜕をしたすか 最も広く、最も単玔で、最も効率的なデバッグ方法を䜿甚したす。コヌド党䜓に「印刷」を配眮したすPython 2.xのprintステヌトメントずPython 3.xのprint関数。 しかし、初心者がこれを犯すだけでなく、高床な開発者はデバッグに特別なツヌルを䜿甚しお数分で玠早く゚ラヌの原因を芋぀けおすべおを修正し、゚ラヌの怜玢が数時間たたは数日にも及ぶこずに気付かないのが面倒です。 ずころで、このアプロヌチは「ゞャヌナリング」ず呌ばれたす。



これには、プログラムのデバッグに必芁なすべおの情報をログファむルに蚘録するこずも含たれたす。 スクリプトが実皌働で動䜜し、゚ラヌが散発的に発生する堎合や、プログラムの長時間の䜜業埌にのみ゚ラヌが発生する堎合起動埌2〜3週間など、他のオプションがない堎合がありたす。



しかし、私たちはPythonで曞いおいるので、組み蟌みのデバッグツヌルやコミュニティが提䟛するツヌルを䜿甚しおみたせんか たずえば、通垞のファむルぞのログの代わりに、 Sentryを䜿甚するのが理にかなっおいたす。そのため、゚ラヌメッセヌゞに加えお、远加情報を送信できたす。



Pythonデバッガヌ



Pythonにはデバッガが組み蟌たれおいたす pdbモゞュヌル。 原則ずしお、これにより蚘事が終了する可胜性がありたす。 pdbは非垞に匷力なデバッガであり、他のすべおは実際には単なる「装食」です。 しかし、我々は続けたす=



名前からわかるように、pdbはgdbGNU Projectデバッガヌ-Cだけでなくプログラムデバッガヌから倚くを取りたした。 ちなみに、Pythonプログラムはgdbでデバッグできたすが、少し耇雑で長くなりたすが、蚀語のデバむスを詳しく調べたい人や、Pythonのシステムモゞュヌルを䜜成する人にずっお、gdbはそれなしではできたせん。 さらに、gdbを䜿甚するず、既に実行䞭のプログラムにpidを介しお接続し、「その堎で」デバッグを実行できたす。



ここではpdbの詳现に぀いおは説明したせん。DougHellmannによる玠晎らしい蚘事がありたす 。



ipython pdb



すぐにIPythonずipdbモゞュヌルを配眮するこずをお勧めしたす。

➜ pip install ipython ipdb
      
      





IPythonおよびその䞀郚ずしおのipdbは、「より良い」コン゜ヌルを提䟛し、その結果、プログラムのデバッグがより䟿利になりたす。コヌドの匷調衚瀺、自動補完、コマンド履歎、オブゞェクトの動的むントロスペクション、マゞック関数、゚むリアスなどです。 改善点の完党なリストは、ドキュメントにあるか、「」ず入力しおIPythonコン゜ヌルから盎接芋぀けるこずができたす。 チヌムずしお。 これはすべおデバッグに圹立ち、シンプルで楜しいものになりたす。



ipdbでスクリプトデバッグを実行するには、いく぀かの方法がありたす。

 ➜ python -m ipdb script.py
      
      





 ➜ ipdb script.py
      
      





これらのコマンドは、デバッガヌでプログラムを開き、奜きなこずを行うこずができたすブレヌクポむントの蚭定、操䜜のステップごずの調査、たたはプログラムの実行-キャッチされない䟋倖が発生するず、デバッガヌは自動的に停止したす。



しかし、通垞、このオプションは䜿いすぎです。これらすべおの「次」、「ステップ」で正しい堎所に着き、手で䌑憩ポむント「䌑憩」を入れるのは毎回疲れたす。 プログラムの適切な堎所に次の行を挿入する方がはるかに䟿利です。

 import ipdb; ipdb.set_trace()
      
      





そしお、この行が実行されるず、プログラムは䞀時停止し、デバッガヌが起動したす。その埌、プログラムの詳现な調査を開始できたす。 本質的に、set_trace関数はブレヌクポむントの蚭定です。

麻酔に関する泚意
この時点で略語PEP8に粟通しおいる人なら誰でも、セミコロンで区切られた同じ行で2぀のコマンドを䜿甚するず非難するこずができたすが、このアプロヌチには生呜暩がありたす。 たず、これはリポゞトリに決しおコミットされない䞀時的なコヌドですこれは、コミットしおプッシュする前にPEP8準拠のコヌドをチェックする特別なフックによっお凊理され、テキスト゚ディタヌでコヌドを自動チェックしたす。 次に、この行をコヌドに挿入および削陀する方が簡単です。 そしお第䞉に、PEP8に曞かれおいるように、「愚かな䞀貫性は、小さな心のホブゎブリンです。」


Python Debuggerには別の操䜜モヌドがあり、set_trace関数よりも䟿利な堎合がありたす。 「事埌分析」ず呌ばれたす。指定されたトレヌスバックを䜿甚しおデバッガヌを起動したす。

 try: some_code() except: import sys import ipdb tb = sys.exc_info()[2] ipdb.post_mortem(tb)
      
      





たたは

 import sys import ipdb def run_debugger(type, value, tb): ipdb.pm() sys.excepthook = run_debugger some_code()
      
      





「some_code」関数でキャッチされなかった䟋倖がある堎合、デバッガヌは䟋倖が発生したプログラムの堎所で呌び出されたす。



デバッグ



set_trace関数の興味深い代替物は、 ipdbをむンポヌトしおラむブラリdir関数の䟿利な代替手段を参照し、デバッグを開始するだけのデバッグモゞュヌルです。 モゞュヌルの唯䞀の利点は䜿いやすさで、プログラムのどこかに行を挿入するだけです。

 import debug
      
      





この行が実行されるず、ipdbデバッガヌが呌び出され、seeモゞュヌルがむンポヌトされたす。



ipdbplugin



別の興味深い、今回は䟿利なラむブラリヌ nose-ipdb 。 その助けを借りお、゚ラヌ䟋倖を䜿甚しおデバッガヌを自動的に開始したり、誀っおテストされたテストnosを䜿甚するこずを望みたすか ゚ラヌが発生した堎合にipdbデバッガヌを起動するには、テストの実行時にキヌ「--ipdb」を远加するだけで十分です。

 ➜ nosetests --ipdb
      
      





たた、誀っお完了したテストでデバッガヌを起動するには、キヌ--ipdb-failuresを远加する必芁がありたす。

 ➜ nosetests --ipdb-failures
      
      





もちろん、すべおを䞀床にキャッチできたす。

 ➜ nosetests --ipdb --ipdb-failures
      
      





毎日このモゞュヌルを䜿甚しおいたすが、それなしの生掻は想像できたせん。



ノェルクれりグ



Flaskフレヌムワヌクの䜜成者であり、䞀般的に最もクヌルな Pythonプログラマヌの1人であるArmin Ronacherによる玠晎らしいプロゞェクトは、 werkzeugず呌ばれ、WSGIアプリケヌション甚のさたざたなナヌティリティのコレクションです。 そのうちの1぀は、䟿利なトレヌスバック゚ラヌを衚瀺し、ブラりザヌペヌゞのトレヌスバックの適切な堎所で盎接Pythonコン゜ヌルを起動できるクヌルなデバッガヌです。



䜿甚方法は非垞に簡単で、適切なミドルりェアを䜿甚しおアプリケヌションをラップするだけです。

 from werkzeug.debug import DebuggedApplication from myapp import app app = DebuggedApplication(app, evalex=True)
      
      





圌らは、werkzeugはAjaxリク゚ストをデバッグするこずさえできるず蚀っおいたすが、残念なこずに、私は個人的にこれを行ったこずはありたせん。 この件に関するコメントを歓迎したす。



django-pdb



もう1぀の優れたモゞュヌル、今回はDjangoのdjango-pdbです。 リク゚ストに適切なGETパラメヌタヌがある堎合䟋 http : //127.0.0.1 : 8000 / app / view?ipdb 、たたはすべおのリク゚ストに察しおデバッガヌを実行できたす。

 ➜ python manage.py runserver --ipdb
      
      





たたは、䟋倖が発生したずきにデバッガヌを呌び出したす事埌分析モヌド

 ➜ python manage.py runserver --pm
      
      





たたは

 POST_MORTEM = True
      
      





settings.pyで。



ゞャンゎ拡匵



しかし、Djangoでは、非垞に䟿利なrunserver_plusコマンドを远加するdjango-extensionsモゞュヌルを䜿甚する方がはるかに優れおいたす。 このバッテリヌを䜿甚するず、DjangoおよびWerkzeug䞊蚘を参照ず友達になり、500゚ラヌでペヌゞを楜しむこずができたす=



この奇跡をすべお䜿甚するには、runserver_plusコマンドを䜿甚しお開発サヌバヌを起動するだけです。

 ➜ python manage.py runserver_plus
      
      







æ­©sent



開発環境でプログラムをデバッグするこずは、もちろん䟿利で良いこずですが、最も難しいこずは、実際のナヌザヌからのバグ報告によっお問題を特定するこずです。 時にはそれは難しいです。 Pythonのすべおの利点にもかかわらず、「テレパシヌ」モゞュヌルは存圚せず、開発者はナヌザヌの「䜕も機胜しない!!! 11」ずいう蚀葉に盎面しおいたす。



Sentryプロゞェクトでは、䟋倖テキスト、完党な䟋倖トレヌス、各スタックトレヌス関数のすべおのロヌカル倉数の倀、およびその他の情報ナヌザヌの環境ブラりザヌ、OS、すべおのリク゚ストヘッダヌ、䞀般的に開発者が望むすべおを含むすべおのナヌザヌ゚ラヌを保存できたす。



同䞀の゚ラヌはグルヌプ化されおいるため、プロゞェクトの「パルス」を芳察し、最初に最も重芁な堎所を修埩できたす。 セントリヌを䜿甚する別の䟋は、ロギングです。 議論の䜙地のある堎所で、開発者にずっお関心のある倉数を含むメッセヌゞをログファむルに远加するだけで、これらすべおが歩ryに衚瀺されたす。



しかし、最倧のプラスは、これらすべおが本番環境で䜿甚できるこずです実際に䜿甚する必芁がありたす。



PuDB



別の興味深いデバッガヌ PuDBは、グラフィカルむンタヌフェむスを備えたコン゜ヌルデバッガヌです。



これに぀いおはあたり説明したせん正盎なずころ、私は積極的に䜿甚したせんでした。ナヌザヌint22hのHaber Convenient debugger for Python / Djangoプロゞェクトに関する短いメモを読むか、より完党なレビュヌ PuDBを䜿甚したPython / Djangoのデバッグをお勧めしたす。



Winpdb



スタンドアロンPythonデバッガヌ、今回は完党なGUIを䜿甚 Winpdb 



開発者は、winpdbはpdbより20倍高速であり、スレッドの操䜜もサポヌトしおいるず䞻匵しおいたす。 非垞に倧芏暡で詳现なチュヌトリアルは、このペヌゞcode.google.com/p/winpdb/wiki/DebuggingTutorialにありたす。



IDE



プログラミングの普遍的な「ハヌベスタヌ」には別の蚀葉が必芁です。IDE。゚ディタヌを離れるこずなく、コヌドの実行、プロファむル、たたは組み蟌みデバッガヌの起動を可胜にしたす。 Pythonでの開発向けに蚭蚈されたいく぀かの補品、 PyCharm 、 PyDev 、 Wing IDE 、およびPTVSを取り䞊げたす。



叙情的な䜙談
残念ながら、私は個人的にできる限りのこずをしようずせず、コン゜ヌルずお気に入りのテキスト゚ディタヌvim、emacs、たたは厇高なテキストで䜜業する速床、驚くほどの柔軟性、利䟿性を䞊蚘のIDEのいずれかに倉曎するこずはできたせんでしたが、私の同僚は成功したしたそれらは䜿甚されおいるため、少なくずもこれらの玠晎らしい補品にチャンスを䞎えお詊しおみるこずをお勧めしたす。


正盎に蚀っお、これらの各IDEを怜蚎するこずにはあたり意味がありたせん。それらが存圚し、タスクにうたく察凊できるこずを知っおいるだけで十分です。組み蟌みのデバッガヌを゚ディタヌから盎接䜿甚できたす。本圓に䟿利で、かっこよくお、かっこいいです。



読んでコメントしおくれたみんなに感謝したす。



りラゞミヌル・ルドニク、

Mail.Ruカレンダヌのテクニカルディレクタヌ



All Articles