【Python】debug工具-pdb(转)

Debug功能对于developer是非常重要的,python提供了相应的模块pdb让你可以在用文本编辑器写脚本的情况下进行debug. pdb是python debugger的简称。

常用的一些命令如下:

命令 用途
break 或 b 设置断点
continue 或 c 继续执行程序
list 或 l 查看当前行的代码段
step 或 s 进入函数
return 或 r 执行代码直到从当前函数返回
exit 或 q 中止并退出
next 或 n 执行下一行
pp 打印变量的值
help 帮助

开始介绍如何使用pdb。

使用的测试代码1: epdb1.py

import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
关于set_trace()
pdb.
set_trace()

Enter the debugger at the calling stack frame. This is useful to hard-code abreakpoint at a given point in a program, even if the code is not otherwisebeing debugged (e.g. when an assertion fails).

1 开始调试:

[[email protected] ~]#  python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> c = "ccc"
(Pdb)
> /root/epdb1.py(6)?()
-> final = a + b + c
(Pdb) list
  1     import pdb
  2     a = "aaa"
  3     pdb.set_trace()
  4     b = "bbb"
  5     c = "ccc"
  6  -> final = a + b + c
  7     print final
[EOF]
(Pdb)
[EOF]
(Pdb) n
> /root/epdb1.py(7)?()
-> print final
(Pdb)

  1. 使用n+enter表示执行当前的statement,在第一次按下了n+enter之后可以直接按enter表示重复执行上一条debug命令。

If you press ENTER without entering anything, pdb will re-execute the last command that you gave it.

  1. quit或者q可以退出当前的debug,但是quit会以一种非常粗鲁的方式退出程序,直接crash

[[email protected] ~]#  python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> c = "ccc"
(Pdb) q
Traceback (most recent call last):
  File "epdb1.py", line 5, in ?
    c = "ccc"
  File "epdb1.py", line 5, in ?
    c = "ccc"
  File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

  • 在使用过程中打印变量的值,可以直接使用p加上变量名,但是需要注意的是打印仅仅在当前的statement已经被执行了之后才能看到具体的值,否则会报 NameError: <exceptions.NameError 。。> 错误。

[[email protected] ~]#  python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> c = "ccc"
(Pdb) p b
‘bbb‘
(Pdb)
‘bbb‘
(Pdb) n
> /root/epdb1.py(6)?()
-> final = a + b + c
(Pdb) p c
‘ccc‘
(Pdb) p final
*** NameError: <exceptions.NameError instance at 0x1551b710>
(Pdb) n
> /root/epdb1.py(7)?()
-> print final
(Pdb) p final
‘aaabbbccc‘
(Pdb)

使用c可以停止当前的debug使得程序继续执行。如果在下面的程序中继续有set_statement()的申明,则又会重新进入到debug的状态。
[[email protected] ~]#  python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> c = "ccc"
(Pdb) c
aaabbbccc

可以在代码print final之前再加上set_trace()验证。

  • 如果代码过程,在debug的时候不一定能记住当前的代码快,则可以通过使用list或者l命令在显示。list会用箭头->指向当前debug的语句

[[email protected] ~]#  python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) list
  1     import pdb
  2     a = "aaa"
  3     pdb.set_trace()
  4  -> b = "bbb"
  5     c = "ccc"
  6     final = a + b + c
  7     pdb.set_trace()
  8     print final
[EOF]
(Pdb) c
> /root/epdb1.py(8)?()
-> print final
(Pdb) list
  3     pdb.set_trace()
  4     b = "bbb"
  5     c = "ccc"
  6     final = a + b + c
  7     pdb.set_trace()
  8  -> print final
[EOF]
(Pdb)

对于使用函数的情况下进行debug:

 epdb2.py --import pdb

def combine(s1,s2):      # define subroutine combine, which...
    s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ...
    s3 = ‘"‘ + s3 +‘"‘   # encloses it in double quotes,...
    return s3            # and returns it.

a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combine(a,b)
print final

如果直接使用n进行debug则到final=combine这句的时候会将其当做普通的赋值语句处理,进入到print final。如果想要对函数进行debug如何处理?可以直接使用s进入函数块。

[[email protected] ~]# python epdb2.py
> /root/epdb2.py(10)?()
-> b = "bbb"
(Pdb) n
> /root/epdb2.py(11)?()
-> c = "ccc"
(Pdb) n
> /root/epdb2.py(12)?()
-> final = combine(a,b)
(Pdb) s
--Call--
> /root/epdb2.py(3)combine()
-> def combine(s1,s2):      # define subroutine combine, which...
(Pdb) n
> /root/epdb2.py(4)combine()
-> s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ...
(Pdb) list
  1     import pdb
  2
  3     def combine(s1,s2):      # define subroutine combine, which...
  4  ->     s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ...
  5         s3 = ‘"‘ + s3 +‘"‘   # encloses it in double quotes,...
  6         return s3            # and returns it.
  7
  8     a = "aaa"
  9     pdb.set_trace()
 10     b = "bbb"
 11     c = "ccc"
(Pdb) n
> /root/epdb2.py(5)combine()
-> s3 = ‘"‘ + s3 +‘"‘   # encloses it in double quotes,...
(Pdb) n
> /root/epdb2.py(6)combine()
-> return s3            # and returns it.
(Pdb) n
--Return--
> /root/epdb2.py(6)combine()->‘"aaabbbaaa"‘
-> return s3            # and returns it.
(Pdb) n
> /root/epdb2.py(13)?()
-> print final
(Pdb)

如果不想在函数里单步调试可以在断点出直接按r退出到调用的地方。

在调试的时候动态改变值 。注意下面有个错误,原因是b已经被赋值了,如果想重新改变b的赋值,则应该使用!b

[[email protected] ~]# python epdb2.py
> /root/epdb2.py(10)?()
-> b = "bbb"
(Pdb) var = "1234"
(Pdb) b = "avfe"
*** The specified object ‘= "avfe"‘ is not a function
or was not found along sys.path.

(Pdb) !b="afdfd"
(Pdb)

再贴一篇好文章:http://onlamp.com/pub/a/python/2005/09/01/debugger.html?page=1

Debugger Module Contents

The pdb module contains the debugger. pdb containsone class, Pdb, which inherits from bdb.Bdb. Thedebugger documentation mentions six functions, which create an interactivedebugging session:

pdb.run(statement[, globals[, locals]]) pdb.runeval(expression[, globals[, locals]]) pdb.runcall(function[, argument, ...]) pdb.set_trace() pdb.post_mortem(traceback) pdb.pm()

All six functions provide a slightly different mechanism for dropping a userinto the debugger.

pdb.run(statement[, globals[, locals]])

pdb.run() executes the string statement under thedebugger‘s control. Global and local dictionaries are optional parameters:

#!/usr/bin/env python import pdb def test_debugger(some_int): print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int if __name__ == "__main__": pdb.run("test_debugger(0)")

pdb.runeval(expression[,globals[, locals]])

pdb.runeval() is identical to pdb.run(), exceptthat pdb.runeval() returns the value of the evaluated stringexpression:

#!/usr/bin/env python import pdb def test_debugger(some_int): print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int if __name__ == "__main__": pdb.runeval("test_debugger(0)")

pdb.runcall(function[,argument, ...])

pdb.runcall() calls the specified function andpasses any specified arguments to it:

#!/usr/bin/env python import pdb def test_debugger(some_int): print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int if __name__ == "__main__": pdb.runcall(test_debugger, 0)

pdb.set_trace()

pdb.set_trace() drops the code into the debugger when executionhits it:

#!/usr/bin/env python import pdb def test_debugger(some_int): pdb.set_trace() print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int if __name__ == "__main__": test_debugger(0)

pdb.post_mortem(traceback)

pdb.post_mortem() performs postmortem debugging of thespecified traceback:

#!/usr/bin/env python import pdb def test_debugger(some_int): print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int if __name__ == "__main__": try: test_debugger(0) except: import sys tb = sys.exc_info()[2] pdb.post_mortem(tb)

pdb.pm()

pdb.pm() performs postmortem debugging of the tracebackcontained in sys.last_traceback:

#!/usr/bin/env python import pdb import sys def test_debugger(some_int): print "start some_int>>", some_int return_int = 10 / some_int print "end some_int>>", some_int return return_int def do_debugger(type, value, tb): pdb.pm() if __name__ == "__main__": sys.excepthook = do_debugger test_debugger(0)
时间: 2025-01-05 12:04:01

【Python】debug工具-pdb(转)的相关文章

Python 代码使用pdb调试技巧

Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 python debug 相关工具进行 debug. 使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,详情见表

Python 日志工具(logging) 基础教程

什么是 logging ? 日志是跟踪软件运行时发生的事件,软件的开发人员可以通过日志快速的定位问题的位置.事件也分重要性即事件的严重程度. 什么时候使用日志? logging 提供了一组方便操作日志记录的功能,这些是 debug(), info(),warning(),error(),critical(). 通过想要执行的任务确定使用日志记录的方法. 你想要执行的任务 日志记录的最佳方法 一个脚本或程序显示在终端上 print() 程序正常运行过程中发生的事件 logging.info() o

Yii2的Debug工具

yii2的Debug工具 调用   r=debug 可以对程序进行性能分析,从而对程序进行改良 (1)数据库某条sql语句的执行时间 (2)debug的profiling标签 \YII::beginProfile('profile1'); //代码片段 \YII::endProfile('profile1'); 查看中间代码的执行时间

Cordova 3.x 基础(3) -- 调试Debug工具

Cordova 3.x 基础(3) -- 调试Debug工具 (1)Ripple Emulator 是基于Google Chrome的移动应用模拟器,已经捐赠给了ASF.Apache Ripple:http://ripple.incubator.apache.org/ Chrome Webstore安装地址: https://chrome.google.com/webstore/detail/geelfhphabnejjhdalkjhgipohgpdnoc 安装Ripple Emulator 引

Python 图论工具

networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了常用的图与复杂网络分析算法, 可以方便的进行复杂网络数据分析.仿真建模等工作. 依赖工具: numpy  pyparsing  datautil  matplotlib  networkx  采用随机图做个实验: from random import random, choice import networkx as nx import matplotlib.pyplot as plt def dist(a, b):

[转]Python打包工具

作者:Tarek Ziadé,翻译:张吉 原文:http://www.aosabook.org/en/packaging.html 转载地址:http://www.ituring.com.cn/article/19090 14.1 简介 对于如何安装软件,目前有两种思想流派.第一种是说软件应该自给自足,不依赖于其它任何部件,这点在Windows和Mac OS X系统中很流行.这种方式简化了软件的管理:每个软件都有自己独立的“领域”,安装和卸载它们不会对操作系统产生影响.如果软件依赖一项不常见的类

Python开发工具PyCharm个性化设置(图解)

Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧. JetBrains PyCharm Pro 4.5.3 中文汉化专业版 授权:特别软件 类型:国外软件 语言:简体中文 大小:197.79 MB 日期:2015-07-10 环境:WinXP, Win2008, Win7, Win8 下载 1.设置默认PyCharm解析器: 操作如下: Python–>Preferences–>Project Interp

常用的十大Python开发工具

据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉你. 1.Micro Python Micro Python基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器.编译器.虚拟机和类库等.目前支持基于32-bit的ARM处理器,比如说STM32F405. 借助它,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,如控制LED

Python开发工具PyCharm v2016.2发布,新增线程暂停功能,可定制IDE外观|附下载

[点击下载最新版PyCharm] vmprof Profiler支持(仅专业版) 对于大家关心的性能,PyCharm提供性能分析支持 Pandas Dataframes Viewer PyCharm 2016.2带来了Pandas Dataframes支持--一个开发商和数据科学必备的功能. 线程暂停选项 新增暂停选项:ALL和Thread."ALL"让所有线程在遇到断点时停止."Thread"选项,只有相应的线程才会停止. 在调试器中的函数返回值 Debug工具窗