目次
はじめに
先日、Pythonにおけるテスト手法を説明しましたが、
どんなに上手くテストを組んでも、
ソフトウェアは急におかしい振る舞いをするものです笑
そんな時は、デバッガを使って、
ソフトウェアがどこでおかしい挙動をしているのかをチェックしたくなります。
以前、C++におけるGNUデバッガ(gdb)を使ったデバック手法を説明しましたが、
今回は、Pythonの標準モジュールであるデバッガpdbを使った
Pythonソフトのデバック方法や、
その他の関連ツールを使ったデバックの方法について説明したいと思います。
pdbの使い方
各変数の値を見る
あるスクリプトの挙動を確認するために、
各変数の値をチェックしたい時は下記のようにしましょう。
まず初めに目的のプログラムをデバックモードで起動します。
デバックしたいプログラムをtest.pyとした場合、
下記のようにすれば、デバックモードでプログラムを起動することができます。
python -m pdb test.py
あとはnでプログラミングのステップ実行をしつつ、
lで現在のコードの位置を確認しながら、
“p 変数名”で変数の中身を確認することができます。
確認したい場所まで実行するコードが多い場合は、
事前にその場所の行数を確認しておいて、
“b 行数” でブレークポイントを指定し、
cでブレークポイントまで実行することもできます。
qでデバックモード終了です。
アサーションと組み合わせる
もしプログラムがおかしくなってしまう場所が
事前にわかっているのであれば、
プログラムの中にpdbを組み込んでおき、
その場所からデバックモードをスタートすることもできます。
その場合は、
import pdb; pdb.set_trace()
という一行を問題の箇所に入れると、
そこからデバックモードを始めることができます。
異常終了したプログラムを解析する場合
例外などで終了してしまったプログラムを解析して、
終了間際のプログラムの状況を知りたい場合は、
トレースバックを使うと即座に解析できます。
>>> import pdb >>> import mymodule >>> mymodule.test() Traceback (most recent call last): File "<stdin>", line 1, in ? File "./mymodule.py", line 4, in test test2() File "./mymodule.py", line 3, in test2 print(spam) NameError: spam >>> pdb.pm() > ./mymodule.py(3)test2() -> print(spam) (Pdb)
pudbを使ったデバック方法
pdbでもデバックは出来ますが、
完全にCUIツールなので、少し使いづらいと感じるかもしれません。
このpdbをもう少し使いやすくしたのが、pudbです。
インストール方法
pipで一発です。
$ pip install pudb
pudbの起動方法
pudbの起動方法は非常に簡単で、
$ python hoge.py
としてスクリプトを起動する所を、
$ pudb hoge.py
とゆう風にすればOKです。
すると、下記のような一昔前の画面が表示されます。
あとは、先程説明したpdbの機能を使いながら、
下記の画面のように、コードの位置や変数の値などを
わかりやすく同時に確認することができます。
詳しい使い方は冒頭の記事をこちらの記事を参照下さい。
cProfileによるプロファイリング
作ったコードが、何か遅いなーと思った時は、
PythonのデフォルトプロファイラであるcProfileを使って、
下記のように簡単にプロファイリングを実施することができます。
$ python -m cProfile -s cumulative main.py
-s cumulativeは計算の累積時間でソートして、
結果を表示するオプションです。
コードのホットスポット順に上から表示されるので、
見やすくて便利です。
最後に
下記の記事のこの言葉が響きました。
自作のスクリプトの場合は、普通は pdb を使うよりも、いかに良くテストを書くかの方が重要な気がしている。pdbを使わなければいけないのはテストが下手だと思った方が良い。
紹介マニアどらふと版: Python で標準添付の Debuggerのpdb を利用してデバッグするメモ
参考資料
27.3. pdb — Python デバッガ — Python 3.3.6 ドキュメント
Pythonの標準デバッガpdbの使い方 | adamrocker
Pythonデバッガ(pdb)とテスト(tox,pytest)についてのメモ - Programming Log
pudbを利用したPythonスクリプトのデバッグ - TIMEZONE PST Hatena Branch
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。
https://gumroad.com/l/myenigmasupportersgumroad.com