前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python -- pdb调试工具

Python -- pdb调试工具

作者头像
py3study
发布2020-01-14 01:15:37
1.2K0
发布2020-01-14 01:15:37
举报
文章被收录于专栏:python3python3

【简介调试工具】

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

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

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

import ipdb ipdb.set_trace()

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

wKioL1hCYYHRI1AAAACFZHN1Rc0206.png
wKioL1hCYYHRI1AAAACFZHN1Rc0206.png

为了支持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  //程序在第一个断点处停止,如下

wKioL1hCYsmQWwQkAAAUkoyAtno306.png
wKioL1hCYsmQWwQkAAAUkoyAtno306.png

此时我们可以看到程序在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选项可以解决此问题

wKiom1hCYzXSfvTeAAAhQqpbBnA422.png
wKiom1hCYzXSfvTeAAAhQqpbBnA422.png

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

wKiom1hCY2WCTYo_AAAm3dLANS0678.png
wKiom1hCY2WCTYo_AAAm3dLANS0678.png

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

wKioL1hCY4_R6jV6AAA6AukGwK0704.png
wKioL1hCY4_R6jV6AAA6AukGwK0704.png

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

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

wKiom1hCY-Din4hJAABvn5xA7H8570.png
wKiom1hCY-Din4hJAABvn5xA7H8570.png

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

9、结束 -> q/exit  在调试过程,想退出结束调试,可直接运行“q”或“exit”回车即可

而ipdb用法和pdb类似,只是更友好,更直观,如下: 

wKiom1hCZDGzIyVIAABRuVQqSMo534.png
wKiom1hCZDGzIyVIAABRuVQqSMo534.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
远程调试
远程调试(Remote Debugging,RD)在云端为用户提供上千台真实手机/定制机/模拟器设备,快速实现随时随地测试。运用云测技术对测试方式、操作体验进行了优化,具备多样性的测试能力,包括随时截图和记录调试日志,稳定的支持自动化测试, 设备灵活调度,用例高效执行, 快速定位产品功能和兼容性问题。云手机帮助应用、移动游戏快速发现和解决问题,节省百万硬件费用,加速敏捷研发流程。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档