LoginSignup
2
2

More than 3 years have passed since last update.

【ipdb】Web開発初心者がPythonでのデバッグについてまとめてみた

Last updated at Posted at 2019-11-11

はじめに

 Web開発初心者が学んだ内容の整理も込めてipdbを用いたデバッグについてまとめていきます。

ipdbとは?

 Pythonに標準で備わったデバッガであるpdbの拡張機能を提供している。

使い方

 デバッガを始めたい位置に以下のコードを記入し、プログラムを実行する。

import ipdb; ipdb.set_trace()

実行すると、標準入力待ちになるので、コマンドを入力することでデバッガを操作できる。以下にはよく使う(らしい)コマンドをまとめる。

コマンド 動作
n 次の行まで実行
s 次の関数まで実行
p 変数名 変数の値を表示 
a 実行中の関数の引数を表示
h ヘルプ
q 終了

使ってみる

 POJ No.3468のAggressive Cowsのプログラムを用いて、実際にipdbを使ってみる。

Aggressive.py
import ipdb
n = 5
m = 3
x = [1, 2, 8, 4, 9]

def C(d):
    last = 0
    for _ in range(1, m):
        crt = last + 1
        while crt<n and x[crt]-x[last]<d:
            crt += 1
        if crt == n:
            return False
        last = crt
    return True

x.sort()
lb, ub = 0, max(x)

while ub-lb > 1:
    ipdb.set_trace()
    mid = int( (lb+ub)/2 )
    if C(mid):
        lb = mid
    else:
        ub = mid

print(lb)

実行する。

$ python Aggressive.py
>c:/users/~/aggressive.py(21)<module>()
     20     import ipdb; ipdb.set_trace()
---> 21     mid = int( (lb+ub)/2 )
     22     if C(mid):

設定したブレークポイントが矢印で出力される。

ipdb> h

Documented commands (type help <topic>):
========================================
EOF    cl         disable  interact  next    psource  rv         unt
a      clear      display  j         p       q        s          until
alias  commands   down     jump      pdef    quit     source     up
args   condition  enable   l         pdoc    r        step       w
b      cont       exit     list      pfile   restart  tbreak     whatis
break  continue   h        ll        pinfo   return   u          where
bt     d          help     longlist  pinfo2  retval   unalias
c      debug      ignore   n         pp      run      undisplay

Miscellaneous help topics:
==========================
exec  pdb

使えるコマンド一覧が出力される。

ipdb> p mid
*** NameError: name 'mid' is not defined

まだ21行目が実行されていないので変数midは定義されていない。

ipdb> n
> c:/users/~/aggressive.py(22)<module>()
     21     mid = int( (lb+ub)/2 )
---> 22     if C(mid):
     23         lb = mid

ブレークポイントを示す矢印が1つ下にずれる。

ipdb> p mid
4

21行目を実行したので変数midの値が表示される。

ipdb> s
--Call--
> c:/users/~/aggressive.py(6)C()
      5 
----> 6 def C(d):
      7     last = 0

次の関数の呼び出しまで実行されたらしい。

ipdb> a
d = 4

次の関数の呼び出しはすぐ下だったので、先ほど確認した変数midの値が引数として表示される。

ipdb> q
Exiting Debugger.

デバッガを終了する。

まとめ

 ipdbでよく使われる(らしい)コマンドを一通り使ってた。デバッガを使用するのは初めてだったのですが、プログラムを途中まで実行し、その都度変数の中身を確認したり、プログラムを書き変えなくても望む位置まで実行して確認していけるのは非常に便利だと感じた。
 プログラム書いててやっぱしんどいのはデバッグなので、デバッガをうまく利用して効率的に、かつミスのないプログラムを書いていきたいな~

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2