1. 程式人生 > >pdb-不需要IDE也能調試

pdb-不需要IDE也能調試

int pan trace 進行 command trac 返回 有效 style

python中有個pdb模塊,使python代碼也可以像gdb那樣進行調試,一般情況下pdb模塊可以在代碼內直接使用,也可以通過命令行參數的形式添加該模塊進行調試(python -m pdb file.py)。在代碼中直接使用pdb模塊調試時,import pdb模塊後,然後在需要調試的代碼出添加pdb.set_trace()命令即可,運行程序後,在運行到次代碼處會自動停止,進入調試模式。

一般常用的調試命令有如下:

q  退出debug
h  打印可用的調試命令
b  設置斷點,b 5 在第五行設置斷點
h command  打印command的命令含義
disable codenum  使某一行斷點失效
enable codenum   使某一行的斷點有效
condition codenum xxx  針對斷點設置條件
c    繼續執行程序,直到下一個斷點
n    執行下一行代碼,如果當前語句有函數調用,則不會進入函數體中,當前行直接返回(單步跳過)
s    執行下一行代碼,但是s會進入函數,並停在第一個能停的地方(相當於單步進入)
w 打印當前執行點的位置 j codenum 讓程序跳轉到指定的行 l 列出附近的源碼 p 打印一個參數的值  a 打印當前函數及參數的值
回車  重復執行上一行

其中p 這個命令很關鍵,可以查看參數的值,很好!

測試代碼如下sum.py:

#/usr/bin/python

def add_t( ):
    i=1
    sum=0
    for i in range(1,5):
        sum=sum+i
        print sum
if __name__ == __main__:
    add_t()

調試過程如下:python -m pdb sum.py

n調試

1 > /opt/sum.py(3)<module>()
  2 -> def add_t( ):
  3 (Pdb) n
  4 > /opt/sum.py(9)<module>()
  5 -> if __name__ == __main__:
  6 (Pdb) n
  7 > /opt/sum.py(10)<module>()
  8 -> add_t()
  9 (Pdb) n
 10 1
 11 3
 12 6
 13 10
 14 --Return--
 15 > /opt/sum.py(10)<module>()->None
 
16 -> add_t() 17 (Pdb) q

n表示執行下一行代碼,但是不陷入函數內部,可以看第3、6、9行,在執行add_t函數時並未陷入函數內部。

s調試

1 > /opt/sum.py(3)<module>()
  2 -> def add_t( ):
  3 (Pdb) s
  4 > /opt/sum.py(9)<module>()
  5 -> if __name__ == __main__:
  6 (Pdb) s
  7 > /opt/sum.py(10)<module>()
  8 -> add_t()
  9 (Pdb) s
 10 --Call--
 11 > /opt/sum.py(3)add_t()
 12 -> def add_t( ):
 13 (Pdb) s
 14 > /opt/sum.py(4)add_t()
 15 -> i=1
 16 (Pdb) s
 17 > /opt/sum.py(5)add_t()
 18 -> sum=0
 19 (Pdb) s
 20 > /opt/sum.py(6)add_t()
 21 -> for i in range(1,5):
 22 (Pdb) s
 23 > /opt/sum.py(7)add_t()
 24 -> sum=sum+i
 25 (Pdb) s
 26 > /opt/sum.py(8)add_t()
 27 -> print sum
 28 (Pdb) p i
 29 1
 30 (Pdb) p sum
 31 1
 32 (Pdb) s
 33 1
 34 > /opt/sum.py(6)add_t()
 35 -> for i in range(1,5):
 36 (Pdb) s
 37 > /opt/sum.py(7)add_t()
 38 -> sum=sum+i
 39 (Pdb) s
 40 > /opt/sum.py(8)add_t()
 41 -> print sum
 42 (Pdb) p i
 43 2
 44 (Pdb) p sum
 45 3
 46 (Pdb)

s調試和n調試一樣,只不過s在遇到函數時會進入函數進行調試,9、12、13表示進入add_t函數內部進行調試,後面使用p命令打印相關函數內參數的值,後面輸入r即可退出函數內部的調試。

也可以在py文件裏加pdb.set_trace()

例如:

import pdb

def make_bread():
    pdb.set_trace()
    return "I don‘t have time"

print(make_bread())

pdb-不需要IDE也能調試