MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Pythonにおける効率的なデバック方法入門

目次

はじめに

先日、Pythonにおけるテスト手法を説明しましたが、

myenigma.hatenablog.com

どんなに上手くテストを組んでも、

ソフトウェアは急におかしい振る舞いをするものです笑

そんな時は、デバッガを使って、

ソフトウェアがどこでおかしい挙動をしているのかをチェックしたくなります。

デバッガ - Wikipedia

 

以前、C++におけるGNUデバッガ(gdb)を使ったデバック手法を説明しましたが、

myenigma.hatenablog.com

今回は、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です。

 

すると、下記のような一昔前の画面が表示されます。 

f:id:meison_amsl:20160917063926p:plain

 

あとは、先程説明したpdbの機能を使いながら、

下記の画面のように、コードの位置や変数の値などを

わかりやすく同時に確認することができます。

f:id:meison_amsl:20160917064233p:plain

 

詳しい使い方は冒頭の記事をこちらの記事を参照下さい。

 

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

pdbのデバッガコマンド - kk6のメモ帳*

pudbを利用したPythonスクリプトのデバッグ - TIMEZONE PST Hatena Branch

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

https://gumroad.com/l/myenigmasupportersgumroad.com