前の関連記事:PyCharm(4)デバックツールウィンドウのボタン
PyCharmではブレークポイントにいろいろ条件が設定できます。
指定の値になったらブレークする
4行目にブレークポイントを設定してデバッガを起動します。
特に他に設定しないときは初めて4行目に到達したときにブレークするのでiは1になります。
for文などのループのデバッグをするときはiが特定の値になったときの状態をみたいときがよくあります。
そこでiが2になったときにブレークするように設定します。
ブレークポイントの赤丸を右クリックしてConditionの欄に「i == 2」と入力して「Done」をクリックして閉じます。
デバッグボタンをクリックするとiが2のときに止まります。
この機能はとても重宝しそうです。
いままではその条件になるまでひたすらステップオーバーボタンをクリックしていましたので、、、
プログラムを止めることなく指定の値になったときの状態を出力する
ブレークポイントの赤丸を右クリックしたときの出てくるダイアログにある「More」をクリックするとさらに詳しい条件設定ができます。
プログラムを止めることなくiが2になったときのlstの値をコンソールに出力してみましょう。
Suspendのチェックをはずすとブレークポイントになってもプログラムは止まりません。
SuspendのチェックをはずしていてもConditionに入力した条件は有効です。
Log evaluated expressionにチェックを入れて出力したい式を入力するとそれがコンソールに出力されます。
「Done」をクリックしてこのダイアログを閉じた後に、デバッグボタンをクリックするとプログラムは止まることなく終了します。
Consoleタブをみるとi == 2のときのlstの値が出力されています。
複数の値を出力する
ループで複数回成立する条件でブレークポイントを設定してみます。
リストlstの要素に2があるときにiとlstのタプルをコンソールに出力します。
再使用不可の使い捨てブレークポイント
Remove once hitにチェックすることで再使用不可の使い捨てブレークポイントを設定できます。
Remoe once hitにチェックをつければ使い捨てブレークポイントになります。
ただしこの機能が働くのはSuspendにチェックが入っているときだけです。
使い捨てブレークポイントは赤丸の中に1が出現したアイコンになります。
1回目の条件成立後にリズームボタンをクリックするとブレークポイントは消失しプログラムは最後まで実行されて終了します。
ループ内の例外のデバッグは例外が出た状態でブレークすると便利
プログラム実行時にエラー(例外)があるとTraceback (most recent call last):とでてエラーを発生したファイル名と行番号を表示してくれます。
Traceback (most recent call last): File "C:/Users/user/AppData/Roaming/LibreOffice/4/user/Scripts/python/LibreOffice/libreoffice57.py", line 56, in <module> libreoffice57() File "C:/Users/user/AppData/Roaming/LibreOffice/4/user/Scripts/python/LibreOffice/libreoffice57.py", line 51, in libreoffice57 line = f.readline() # 次の行を読み込む。 File "C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\fileinput.py", line 354, in readline self._buffer = self._file.readlines(self._bufsize) UnicodeDecodeError: 'cp932' codec can't decode byte 0x9d in position 2829: illegal multibyte sequenceこの場合6行目でfileinput.pyの354行目でエラーがでているとわかります。
そしてそれを呼び出したのはlibreoffice57.pyの51行目ということが4行目をみるとわかります。
fileinput.pyはPythonのライブラリなので自分の書いたものではなく、バグは自分の書いたlibreoffice57.pyあるということになります。
そしてその51行目が5行目にline = f.readline()と表示されています。
デバッグするにはこの変数fが何なのかを知りたいわけなのですが、この行がループの中にあるときはコードをみただけではなかなか把握できません。
ここにブレークポイントを仕掛けてもエラーが発生する状態までループをたどらないといけません。
そこでエラーがでたときにブレークさせるようにします。
libreoffice57.pyの51行目にブレークポイントを設定したらそれを右クリックします。
「More」をクリックして詳細画面を出します。
この左側の欄で「Python Line Breakpoint」のチェックをはずします。
これでエラーが起こった状態でブレークするようになります。
ブレークポイントのアイコンがと無効の状態のアイコンになりますがエラーのときはちゃんと止まります。
例外発生時にデバッガで表示されるのはTraceback (most recent call last):で最後に表示されているfileinput.pyの354行目です。
libreoffice57.pyの51行目にはデバッグツールウィンドウのフレーム枠で移動できます。
私がデバッガで一番やりたかったのはこれなのですけど、この方法に気がつくまでだいぶ時間を浪費してしまいました。
参考にしたサイト
Breakpoints - PyCharm - Confluence
ブレークポイントのいろいろな機能の解説。
0 件のコメント:
コメントを投稿