Python -- pdb调试工具

诗歌是一种忧郁的媒体,而诗人的使命是孤独的;     -- 北岛《时间的玫瑰》

学习是一首深邃的民谣,而我们的任务是享受他。     -- 小Q 《20161203》

------------------------------------------------------------------------------------------------

学c++时,老师教我们有gdb调试工具,在工作中会经常用到;

学shell时,经理让我见到了"-x"跟踪调试参数,我每天都会用到;

学python后,我就在寻找类似的参数和工具,谷歌给了我pdb工具;

【简介调试工具】

pdb
使用如下代码就相当于添加断点了:
import pdb    
pdb.set_trace()  #设置断点的地方,放置于程序中

ipdb
相对于python,我们更趋向于ipython,有漂亮的颜色,和<tab>补全提示,以及bash混用;

相对于python内置的pdb,ipdb的优势也正在于此,其实就是对ipython的调用:

import ipdb
ipdb.set_trace()

pudb
是全屏的基于控制台的可视化调试器,有点像c语言中的Turbo C样式

为了支持pudb,需要在代码中插入
from pudb import set_trace; set_trace()  or  import pudb

rpdb
上面的两种方案要求有终端输出的情况下可行,有时候我们需要以后台形式执行python,此时是没有输出交互的,比如django开发,程序由uwsgi管理执行,标准输出已重定向,通常只能通过日志输出信息。这个时候我们就需要一个远程调试工具。
rpdb会开启一个socket连接,用于远程调试,默认端口是4444:
import rpdb
rpdb.set_trace(port=12345)
这样当程序被hang住之后,会监听该端口,可远程连接进行调试:
nc 127.0.0.1 12345

ripdb
rpdb只是pdb的远程版本,而ripdb就是将rpdb和ipdb的功能进行了整合,既有远程调试功能,又有漂亮的代码颜色:
import ripdb
ripdb.set_trace(port=12345)
如果还需要<Tab>自动补全功能,还需要对终端进行一下设置:
SAVED_STTY=`stty -g`; stty -icanon -opost -echo -echoe -echok -echoctl -echoke; nc 127.0.0.1 12345; stty $SAVED_STTY

【详解pdb/ipdb】

试验程序:传两个参数,进行加法和减法

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():
    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()

1、进入PDB调试,其实就是一个交互式源代码调试器;修改程序:

import pdb   # 添加模块
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():
    print sys.argv
    pdb.set_trace()  # <-- Break point added here,设置的断点
    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、程序执行触发调试器 
执行:python 3_pdb.py  1 3  //程序在第一个断点处停止,如下

此时我们可以看到程序在print sys.argv 处出了一个断点

并显示下一步将要执行 addition = add(sys.argv[1], sys.argv[2])

3、下一行  -> n 
输入“n”回车,将会执行addition = add(sys.argv[1], sys.argv[2]),然后打印出下一步操作;
但是会有一个问题,pdb没有进入到add函数中,下面的s选项可以解决此问题

4、打印 -> p 
在执行过程中我们想看,某个变量的打印值,除了c可以直接跳到下一个断点,打印期间所有值
“p”可以打印出某个变量的值,但前提是已经执行过这个变量。如下:

5、单步 -> s 
“s”可以进入某个函数内部,然后再函数内使用n/p/b/c等
“r”将返回前面进入函数的返回语句

6、添加动态断点 -> b 
在程序里,我们设置了一个断点,但当我们执行很长的代码时,忘了在脚本中设置断点

我们就可以直接用“b”在此环境下设置下一个断点位置
格式:b  行数
7、列表 -> l 
有时再调试时,不知道自己运行到哪,也不知道下面代码是什么了,为了不退出去去记某一行是什么,便可以执行小写“L”查看后面程序

8、动态分配变量 
在调试期间,可以分配变量帮助进行调试,
(Pdb) !n=5
(Pdb) p n
5

9、结束 -> q/exit 
在调试过程,想退出结束调试,可直接运行“q”或“exit”回车即可
--------------------------------------------------------------------------------------------------
PDB文档:https://docs.python.org/2/library/pdb.html 
而ipdb用法和pdb类似,只是更友好,更直观,如下:

时间: 2024-08-24 08:56:20

Python -- pdb调试工具的相关文章

python pdb调试

python -m pdb myscript.py #注意这会重启myscript.py 可以在程序中这么设置断点:import pdb; pdb.set_trace() 可以修改变量的值,但是要注意,前面加上!比如要修改final的值,应该这样!final="newvalue" 支持的命令:    p 打印变量    n next    step 细点运行    c continue    l list    a args 打印当前函数的参数    condition bpnumbe

Python原生调试工具pdb实践小结

使用python -m pdb xxx.py进入单步调试模式,默认会在脚本的第一行可执行命令处停止.此时,通过 b function设置之后的函数断点会提示出错,从出错异常栈中可以看出,pdb是将function当做行号来识别,而函数名是字符串,转换成整形会失败,因此会提示出错.在处理转换整形失败异常时,会尝试执行 function,如果当前解析器还执行到该函数(由于是刚开始调试,相关函数尚未解析),那么在该函数上设置断点又会触发异常.那么,通过单步调试,如何开始呢? 经过多番尝试,总结这样的工

python pdb模块

参考文件http://pythonconquerstheuniverse.wordpress.com/category/Python-debugger/ 翻译不是一一对应 Debug功能对于developer是非常重要的,python提供了相应的模块pdb让你可以在用文本编辑器写脚本的情况下进行debug. pdb是python debugger的简称. 常用的一些命令如下: 命令 用途 break 或 b 设置断点 continue 或 c 继续执行程序 list 或 l 查看当前行的代码段

python 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

Python pdb lib

在python中使用pdb模块可以进行调试import pdbpdb.set_trace() 也可以使用python -m pdb mysqcript.py这样的方式 (Pdb)                           会自动停在第一行,等待调试,这时你可以看看 帮助(Pdb) h                      #说明下这几个关键 命令 >断点设置(Pdb)b 10                  #断点设置在本py的第10行或(Pdb)b ots.py:20    

Python: PDB命令

1. where(w) 找出当前代码运行位置 2. list(l) 显示当前代码的部分上下文 3. list <line number> 显示指定行的上下文 4. list <line number1, line number2> 显示指定开始行到结束行的代码 5. up(u) 返回上个调用点 6. down(d) 返回下个调用点 7. args(a) 显示当前所有变量 8. print(p) 打印表达式结果 9 ! 运行python命令,比如!test='hello' 将会把te

sublime text 3 为配置Python开发环境所做的一些个人设置

我们都知道,ST3(Sublime Text 3)自带的build python可以直接运行.py文件,但是若涉及input()函数需要输入时,就不能用这个了. 下面是我个人所作的一些对我来说算是够用的配置,由于本人还处于初学python的阶段,所以相关配置比较基础与简单. 第一步:下载Sublime Text 下载请去官网下载,下载请视自己的操作系统而定,由于鄙人的系统是Windows,以下皆是以Windows为例展开介绍的. 第二步:Windows 下安装Sublime Text 1. 64

Sublime Text 3 安装 Python 插件

1. SublimeCodeIntel 插件 作用:代码补全,变量.函数跳转 这个插件包含代码提示.补全插件(可以跳转到变量.函数定义的地方),根据 python.java 等自动代码提示,可以实现语法自动完成功能 2. Autopep8  插件 作用:PEP8检查及格式化 1.在编写代码的文件中,鼠标右键-->AutoPEP8-->Format 2.Preferences->Package Settings->AutoPep8-->Settings - User 输入下面的

Python - 命令式编程与符号编程

原文链接:https://zh.d2l.ai/chapter_computational-performance/hybridize.html本文是对原文内容的摘取和扩展. 命令式编程(imperative style programs) 使用编程语句改变程序状态,明确输入变量,并根据程序逻辑逐步运算. 易于理解:在Python里使用命令式编程时,大部分代码编写起来都很直观. 容易调试:可以很方便地进行单步跟踪,获取并分析所有中间变量,或者使用Python的调试工具. 虽然使用命令式编程很方便,