1. 简单的程序
2. PDB模块
Python提供了一个有用的PDB模块,它是一个交互式源代码调试器。
使用此模块设置断点需要如下两行代码:
下面是增加了断点的程序:
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
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