设为首页 收藏本站
查看: 1425|回复: 0

[经验分享] Python -- pdb调试工具

[复制链接]

尚未签到

发表于 2018-8-7 12:11:32 | 显示全部楼层 |阅读模式
  诗歌是一种忧郁的媒体,而诗人的使命是孤独的;     -- 北岛《时间的玫瑰》
  学习是一首深邃的民谣,而我们的任务是享受他。     -- 小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样式
DSC0000.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  //程序在第一个断点处停止,如下
DSC0001.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选项可以解决此问题
DSC0002.png

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

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

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

  8、动态分配变量
  在调试期间,可以分配变量帮助进行调试,
  (Pdb) !n=5
  (Pdb) p n
  5
  9、结束 -> q/exit
  在调试过程,想退出结束调试,可直接运行“q”或“exit”回车即可
  --------------------------------------------------------------------------------------------------
  PDB文档:https://docs.python.org/2/library/pdb.html
  而ipdb用法和pdb类似,只是更友好,更直观,如下:
DSC0006.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548195-1-1.html 上篇帖子: Python:***测试开源项目 下篇帖子: python中打开文件区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表