您的位置:首页 > 编程语言 > Python开发

使用PDB(The Python Debugger)命令行调试Python代码

2015-03-21 22:04 656 查看
1. 简单的程序

import sys

def add(num1 = 0, num2 = 0):
return int(num1) + int(num2)

def sub(num1 = 0, num2 = 0):
return int(num1) - int(num2)

def main():
# Assuming our inputs are valid numbers
print sys.argv
addition = add(sys.argv[1], sys.argv[2])
print addition
subtraction = sub(sys.argv[1], sys.argv[2])
print subtraction

if __name__ == "__main__":
main()


2. PDB模块

Python提供了一个有用的PDB模块,它是一个交互式源代码调试器。

使用此模块设置断点需要如下两行代码:

import pdb
pdb.set_trace()


下面是增加了断点的程序:

import sys, pdb

def add(num1 = 0, num2 = 0):
return int(num1) + int(num2)

def sub(num1 = 0, num2 = 0):
return int(num1) - int(num2)

def main():
# Assuming our inputs are valid numbers
print sys.argv
pdb.set_trace()
addition = add(sys.argv[1], sys.argv[2])
print addition
subtraction = sub(sys.argv[1], sys.argv[2])
print subtraction

if __name__ == "__main__":
main()


3. 程序执行触发调试器

python pdb_example.py 1 2

程序将会在第一个断点处停止执行。

['pdb_example.py', '1', '2']

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(13)main()

-> addition = add(sys.argv[1], sys.argv[2])

(Pdb)

我们在第12行设置了一个断点,所以我们能看到将要执行的下一行是第12行。可以看到,在执行到第13行之前程序已经停止。

4. 下一行->n(ext)

在你的调试器提示中,输入n运行到下一行。

['pdb_example.py', '1', '2']

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(13)main()

-> addition = add(sys.argv[1], sys.argv[2])

(Pdb) n

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(14)main()

-> print addition

(Pdb) next

3

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(15)main()

-> subtraction = sub(sys.argv[1], sys.argv[2])

(Pdb)

我们可以使用n来逐行执行整个程序,但这其实没有什么用处。

可能你已经看到,PDB实际上并没有进入我们的add函数中。下面,就让我们看看其他几个令调试更加有趣的选项。

备注:可以通过c(ontinue)使PDB跳到下一个断点或者程序末尾。

5. 打印->p(print)

使用p可以相当方便地查看变量中实际存储着什么值。

如果我们想知道sys.argv中包含什么内容,我们可以输入以下命令:

['pdb_example.py', '1', '2']

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(13)main()

-> addition = add(sys.argv[1], sys.argv[2])

(Pdb) p sys.argv[1]

'1'

(Pdb) print sys.argv[2]

2

(Pdb) p sys.argv[3]

*** IndexError: IndexError('list index out of range',)

(Pdb)

6. 单步->s(tep)

我们可以使用s进入函数内部。

这将把我们带入加法函数的内部,现在我们可以在加法函数内部使用n、p和其他的操作指令。

使用r(eturn)将会把我们带到前面进入函数的返回语句。

['pdb_example.py', '1', '2']

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(13)main()

-> addition = add(sys.argv[1], sys.argv[2])

(Pdb) s

--Call--

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(3)add()

-> def add(num1 = 0, num2 = 0):

(Pdb) print num1

1

(Pdb) r

--Return--

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(4)add()->3

-> return int(num1) + int(num2)

(Pdb)

如果你想快速跳转到一个函数的结尾处,那么这个指令将很有用。

7. 动态添加断点->b(reak)

前面,在程序运行之前,我们使用pdb.set_trace()设置了一个断点。

不过,经常在调试会话已经开始之后,我们想要在程序中特定的地方添加断点。

这里我们就可以使用命令b来实现这种目的。

我们重新开始执行程序。

['pdb_example.py', '1', '2']

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(13)main()

-> addition = add(sys.argv[1], sys.argv[2])

(Pdb) b 14

Breakpoint 1 at /Users/user/Documents/Code/Python/pdb_example/pdb_example.py:14

(Pdb) break 15

Breakpoint 2 at /Users/user/Documents/Code/Python/pdb_example/pdb_example.py:15

(Pdb) c

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(14)main()

-> print addition

(Pdb) continue

3

> /Users/user/Documents/Code/Python/pdb_example/pdb_example.py(15)main()

-> subtraction = sub(sys.argv[1], sys.argv[2])

(Pdb)

此时我在第14,15行设置一个断点。

同时,PDB还为断点分配了号码。为了以后的执行,我们可以通过开启或禁用断点号码来启用或停用对应的断点。

8. 列表->l(ist)

有时在调试的时候,你可能会忘记此时你处在代码的什么地方。在这种情况下,使用l将会打印出一个友好的总结,它能够显示出此刻你在代码中的位置。

-> subtraction = sub(sys.argv[1], sys.argv[2])

(Pdb) l

10 # Assuming our inputs are valid numbers

11 print sys.argv

12 pdb.set_trace()

13 addition = add(sys.argv[1], sys.argv[2])

14 B print addition

15 B-> subtraction = sub(sys.argv[1], sys.argv[2])

16 print subtraction

17

18 if __name__ == "__main__":

19 main()

[EOF]

(Pdb)

9. 动态分配变量

(Pdb) print addition

3

(Pdb) addition = 'nothing'

(Pdb) p addition

'nothing'

(Pdb)

10. 结束->q(uit)

最后,在代码的任何地方如果你想结束调试,可以使用q,那么正在执行的程序将会终止。

11. Reference
https://docs.python.org/2/library/pdb.html https://pypi.python.org/pypi/ipdb
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: