pdb调试方式

本文介绍了使用pdb在Python中进行调试的方法,包括命令行启动、Python交互环境启用及硬编码断点三种方式,并详细说明了常用调试命令的使用。

来源:http://blog.youkuaiyun.com/redhat7890/article/details/5703617


用pdb调试有多种方式可选:

 

1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
python -m pdb myscript.py

2. 在Python交互环境中启用调试
>>> import pdb
>>> import mymodule
>>> pdb.run(‘mymodule.test()’)

3. 比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的

 

[c-sharp]  view plain copy
  1. if __name__ == "__main__":  
  2.     a = 1  
  3.     import pdb  
  4.     pdb.set_trace()  
  5.     b = 2  
  6.     c = a + b  
  7.     print (c)  

 

然后正常运行脚本,到了pdb.set_trace()那就会定下来,就可以看到调试的提示符(Pdb)了

常用的调试命令

  • h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:“h l” — 查看list命令
  • l(ist),可以列出当前将要运行的代码块

(Pdb) l
497 pdb.set_trace()
498 base_data = {}
499 new_data = {}
500 try:
501 execfile(base_file_name,{},base_data)
502 -> execfile(new_file_name,{},new_data)
503 except:
504 logger.writeLog(“error! load result log error!”)
505 print “load cmp logs error!”
506 raise Exception, “load cmp logs error!”
507

  • b(reak), 设置断点,例如 “b 77″,就是在当前脚本的77行打上断点,还能输入函数名作为参数,断点就打到具体的函数入口,如果只敲b,会显示现有的全部断点

(Pdb) b 504
Breakpoint 4 at /home/jchen/regression/regressionLogCMP.py:504

  • condition bpnumber [condition],设置条件断点,下面语句就是对第4个断点加上条件“a==3”

(Pdb) condition 4 a==3
(Pdb) b
Num Type Disp Enb Where
4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504
stop only if a==3

  • cl(ear),如果后面带有参数,就是清除指定的断点(我在Python2.4上从来没成功过!!!);如果不带参数就是清除所有的断点

(Pdb) cl
Clear all breaks? y

  • disable/enable,禁用/激活断点

(Pdb) disable 3
(Pdb) b
Num Type Disp Enb Where
3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505

  • n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的

 

  • s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中
  • c(ont(inue)),让程序正常运行,直到遇到断点
  • j(ump),让程序跳转到指定的行数

(Pdb) j 497
> /home/jchen/regression/regressionLogCMP.py(497)compareLog()
-> pdb.set_trace()

  • a(rgs),打印当前函数的参数

(Pdb) a
_logger =
_base = ./base/MRM-8137.log
_new = ./new/MRM-8137.log
_caseid = 5550001
_toStepNum = 10
_cmpMap = {‘_bcmpbinarylog’: ‘True’, ‘_bcmpLog’: ‘True’, ‘_bcmpresp’: ‘True’}

  • p,最有用的命令之一,打印某个变量

(Pdb) p _new
u’./new/MRM-8137.log’

  • !,感叹号后面跟着语句,可以直接改变某个变量
  • q(uit),退出调试

发现在命令行下调试程序也是一件挺有意思的事情,记录下来分享一下


### 使用 Python PDB 进行调试方法 #### 1. 启动方式 可以通过多种方式启动 PDB 调试器。一种常见的方法是在代码中插入 `pdb.set_trace()` 来手动设置断点[^3]。当执行到该语句时,程序会暂停并进入交互式调试环境。 另一种方法是从命令行直接运行脚本,并附加 `-m pdb` 参数。这种方式可以在发生异常时自动触发调试模式[^2]。例如: ```bash python -m pdb script.py ``` 此命令允许开发者在异常被捕获后立即查看上下文信息,如变量状态和调用堆栈。 --- #### 2. 常见调试命令 以下是 PDB常用调试指令及其功能说明: - **c (continue)**: 继续执行直到遇到下一个断点或完成整个程序[^1]。 - **n (next)**: 执行下一行代码而不深入函数内部。 - **s (step)**: 执行下一步操作,如果当前行为是一个函数调用,则跳入其中。 - **r (return)**: 执行至当前帧返回为止。 - **bt (backtrace)**: 显示完整的调用堆栈信息。 - **l (list)**: 列出源码中的当前位置以及周围的几行代码。 - **p (print)**: 输出指定表达式的值。 - **q (quit)**: 结束调试过程并退出 PDB。 这些基本命令足以满足大多数场景下的需求。 --- #### 3. 实际应用案例 下面展示了一个简单的例子,用于演示如何利用 PDB 对一段代码进行逐步分析。 假设有一个计算两个数之差的函数如下所示: ```python import pdb def subtract_numbers(a, b): pdb.set_trace() return a - b result = subtract_numbers(7, 3) print(result) ``` 在此情况下,当你运行这段代码时,PDB 将停止于 `pdb.set_trace()` 行处。此时可以输入上述提到的各种命令来探索局部变量的状态、跟踪控制流路径等细节。 另外,在某些特殊场合下还可以考虑采用 `pdb.post_mortem(sys.last_value)` 的形式来进行事后审查工作[^4]。这种方法特别适合处理那些难以重现崩溃错误的情况。 --- ### 总结 综上所述,Python 自带的 PDB 是一款强大而灵活的调试工具,能够帮助开发人员快速定位问题所在并通过一系列内置的功能实现高效排查目的。无论是嵌入式激活还是外部加载均提供了极大的便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值