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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnjoyCodingAndGame

愿我的知识,成为您的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值