调试--pdb

pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++)。

命令 简写命令 作用
break b 设置断点
continue c 继续执行程序
list l 查看当前行的代码段
step s 进入函数
return r 执行代码直到从当前函数返回
quit q 中止并退出
next n 执行下一行
print p 打印变量的值
help h 帮助
args a 查看传入参数
  回车 重复上一条命令
break b 显示所有断点
break lineno b lineno 在指定行设置断点
break file:lineno b file:lineno 在指定文件的行设置断点
clear num   删除指定断点
bt   查看函数调用栈帧

执行时调试

程序启动,停止在第一行等待单步调试。

  1. python -m pdb some.py

交互调试

进入python或ipython解释器

  1. import pdb
  2. pdb.run('testfun(args)') #此时会打开pdb调试,注意:先使用s跳转到这个testfun函数中,然后就可以使用l看到代码了

程序里埋点

当程序执行到pdb.set_trace() 位置时停下来调试

  1. 代码上下文
  2. ...
  3. import pdb
  4. pdb.set_trace()
  5. ...

日志调试

demo 1

  1. import pdb
  2. a = "aaa"
  3. pdb.set_trace()
  4. b = "bbb"
  5. c = "ccc"
  6. final = a + b + c
  7. print final
  8.  
  9. #调试方法
  10.  
  11. # 《1 显示代码》
  12. # l---->能够显示当前调试过程中的代码,其实l表示list列出的意思
  13. #如下,途中,-> 指向的地方表示要将要执行的位置
  14. # 2 a = "aaa"
  15. # 3 pdb.set_trace()
  16. # 4 b = "bbb"
  17. # 5 c = "ccc"
  18. # 6 pdb.set_trace()
  19. # 7 -> final = a + b + c
  20. # 8 print final
  21.  
  22. # 《2 执行下一行代码》
  23. # n---->能够向下执行一行代码,然后停止运行等待继续调试 n表示next的意思
  24.  
  25. # 《3 查看变量的值》
  26. # p---->能够查看变量的值,p表示prit打印输出的意思
  27. #例如:
  28. # p name 表示查看变量name的值

demo 2

  1. import pdb
  2. a = "aaa"
  3. pdb.set_trace()
  4. b = "bbb"
  5. c = "ccc"
  6. pdb.set_trace()
  7. final = a + b + c
  8. print final
  9.  
  10. # 《4 将程序继续运行》
  11. # c----->让程序继续向下执行,与n的区别是n只会执行下面的一行代码,而c会像python xxxx.py一样 继续执行不会停止;c表示continue的意思
  12.  
  13. # 《5 set_trace()》
  14. # 如果程序中有多个set_trace(),那么能够让程序在使用c的时候停留在下一个set_trace()位置处

demo 3

  1. #coding=utf-8
  2. import pdb
  3.  
  4. def combine(s1,s2):
  5. s3 = s1 + s2 + s1
  6. s3 = '"' + s3 +'"'
  7. return s3
  8.  
  9. a = "aaa"
  10. pdb.set_trace()
  11. b = "bbb"
  12. c = "ccc"
  13. final = combine(a,b)
  14. print final
  15.  
  16. # 《6 设置断点》
  17. # b---->设置断点,即当使用c的时候,c可以在遇到set_trace()的时候停止,也可以在遇到标记有断点的地方停止;b表示break的意思
  18. #例如:
  19. #b 11 在第11行设置断点,注意这个11可以使用l来得到
  20. # (Pdb) l
  21. # 4 s3 = s1 + s2 + s1
  22. # 5 s3 = '"' + s3 +'"'
  23. # 6 return s3
  24. # 7 a = "aaa"
  25. # 8 pdb.set_trace()
  26. # 9 -> b = "bbb"
  27. # 10 c = "ccc"
  28. # 11 final = combine(a,b)
  29. # 12 print final
  30. # [EOF]
  31. # (Pdb) b 11
  32. # Breakpoint 1 at /Users/wangmingdong/Desktop/test3.py:11
  33. # (Pdb) c
  34. # > /Users/wangmingdong/Desktop/test3.py(11)<module>()
  35. # -> final = combine(a,b)
  36. # (Pdb) l
  37. # 6 return s3
  38. # 7 a = "aaa"
  39. # 8 pdb.set_trace()
  40. # 9 b = "bbb"
  41. # 10 c = "ccc"
  42. # 11 B-> final = combine(a,b)
  43. # 12 print final
  44.  
  45. # 《7 进入函数继续调试》
  46. # s---->进入函数里面继续调试,如果使用n表示把一个函数的调用当做一条语句执行过去,而使用s的话,会进入到这个函数 并且停止
  47. #例如
  48. # (Pdb) l
  49. # 6 return s3
  50. # 7 a = "aaa"
  51. # 8 pdb.set_trace()
  52. # 9 b = "bbb"
  53. # 10 c = "ccc"
  54. # 11 B-> final = combine(a,b)
  55. # 12 print final
  56. # [EOF]
  57. # (Pdb) s
  58. # --Call--
  59. # > /Users/wangmingdong/Desktop/test3.py(3)combine()
  60. # -> def combine(s1,s2):
  61. # (Pdb) l
  62. # 1 import pdb
  63. # 2
  64. # 3 -> def combine(s1,s2):
  65. # 4 s3 = s1 + s2 + s1
  66. # 5 s3 = '"' + s3 +'"'
  67. # 6 return s3
  68. # 7 a = "aaa"
  69. # 8 pdb.set_trace()
  70. # 9 b = "bbb"
  71. # 10 c = "ccc"
  72. # 11 B final = combine(a,b)
  73. # (Pdb)
  74.  
  75. # 《8 查看传递到函数中的变量》
  76. # a---->调用一个函数时,可以查看传递到这个函数中的所有的参数;a表示arg的意思
  77. #例如:
  78. # (Pdb) l
  79. # 1 #coding=utf-8
  80. # 2 import pdb
  81. # 3
  82. # 4 -> def combine(s1,s2):
  83. # 5 s3 = s1 + s2 + s1
  84. # 6 s3 = '"' + s3 +'"'
  85. # 7 return s3
  86. # 8
  87. # 9 a = "aaa"
  88. # 10 pdb.set_trace()
  89. # 11 b = "bbb"
  90. # (Pdb) a
  91. # s1 = aaa
  92. # s2 = bbb
  93.  
  94. # 《9 执行到函数的最后一步》
  95. # r----->如果在函数中不想一步步的调试了,只是想到这个函数的最后一条语句那个位置,比如return语句,那么就可以使用r;r表示return的意思

demo 4

  1. In [1]: def pdb_test(arg):
  2. ...: for i in range(arg):
  3. ...: print(i)
  4. ...: return arg
  5. ...:
  6.  
  7. In [2]: #在python交互模式中,如果想要调试这个函数,那么可以
  8.  
  9. In [3]: #采用,pdb.run的方式,如下:
  10.  
  11. In [4]: import pdb
  12.  
  13. In [5]: pdb.run("pdb_test(10)")
  14. > <string>(1)<module>()
  15. (Pdb) s
  16. --Call--
  17. > <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
  18. -> def pdb_test(arg):
  19. (Pdb) l
  20. 1 -> def pdb_test(arg):
  21. 2 for i in range(arg):
  22. 3 print(i)
  23. 4 return arg
  24. [EOF]
  25. (Pdb) n
  26. > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
  27. -> for i in range(arg):
  28. (Pdb) l
  29. 1 def pdb_test(arg):
  30. 2 -> for i in range(arg):
  31. 3 print(i)
  32. 4 return arg
  33. [EOF]
  34. (Pdb) n
  35. > <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
  36. -> print(i)
  37. (Pdb)
  38. 0
  39. > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
  40. -> for i in range(arg):
  41. (Pdb)
  42. > <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
  43. -> print(i)
  44. (Pdb)
  45. 1
  46. > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
  47. -> for i in range(arg):
  48. (Pdb)
  49. demo 5 运行过程中使用pdb修改变量的值
  50. In [7]: pdb.run("pdb_test(1)")
  51. > <string>(1)<module>()
  52. (Pdb) s
  53. --Call--
  54. > <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
  55. -> def pdb_test(arg):
  56. (Pdb) a
  57. arg = 1
  58. (Pdb) l
  59. 1 -> def pdb_test(arg):
  60. 2 for i in range(arg):
  61. 3 print(i)
  62. 4 return arg
  63. [EOF]
  64. (Pdb) !arg = 100 #!!!这里是修改变量的方法
  65. (Pdb) n
  66. > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
  67. -> for i in range(arg):
  68. (Pdb) l
  69. 1 def pdb_test(arg):
  70. 2 -> for i in range(arg):
  71. 3 print(i)
  72. 4 return arg
  73. [EOF]
  74. (Pdb) p arg
  75. 100
  76. (Pdb)

使用所学的pdb调试技巧对其进行调试出bug

  1. #coding=utf-8
  2. import pdb
  3.  
  4. def add3Nums(a1,a2,a3):
  5. result = a1+a2+a3
  6. return result
  7.  
  8. def get3NumsAvarage(s1,s2):
  9. s3 = s1 + s2 + s1
  10. result = 0
  11. result = add3Nums(s1,s2,s3)/3
  12.  
  13. if __name__ == '__main__':
  14.  
  15. a = 11
  16. # pdb.set_trace()
  17. b = 12
  18. final = get3NumsAvarage(a,b)
  19. print final

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。

pdb调试工具的更多相关文章

  1. pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明

    初学时大多使用print或log调试程序,这在小规模的程序下很方便 但是更好的方法是一边运行一边检查里面的变量和方法 1.Pdb Pdb是一个交互式的调试工具,集成于Python标准库中 Pdb能让你 ...

  2. python调试工具pdb

    pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的代码段 step ...

  3. python执行命令行调试工具pdb

    调试 pdb pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点(用法,b <数字>:在第数字行设置断点....... ...

  4. pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用

    参考深度学习框架pytorch:入门和实践一书第六章 以深度学习框架PyTorch一书的学习-第六章-实战指南为前提 在pytorch中Debug pytorch作为一个动态图框架,与ipdb结合能为 ...

  5. python 内置调试工具 pdb

    除了 pycharm 可以调试python外,python自带的内置工具pdb 也可以调试 python.其命令方式类似于 gdb. pdb 常用的调试命令见下表. 命令 解释 break 或 b 设 ...

  6. 12、python单步调试工具pdb

    pdb 第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态.我们先准备好程序: # err.py s = '0' n = int(s) print(10 / n) ...

  7. Python自带又好用的代码调试工具Pdb学习笔记

    返璞归真 这几天项目有一个linux下部署数据库的操作,数据库使用python进行初始化安装.然后问题来了,由于linux服务器涉及安全要求,除了代码以来的Python3.6版本外不允许安装其他插件与 ...

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

    使用python -m pdb xxx.py进入单步调试模式,默认会在脚本的第一行可执行命令处停止.此时,通过 b function设置之后的函数断点会提示出错,从出错异常栈中可以看出,pdb是将fu ...

  9. Microsoft Visual Studio PDB文件相关事宜

    Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...

随机推荐

  1. C# Dictionary源码剖析

    参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719 ...

  2. setsebool命令详解与SELinux管理

    setsebool命令是用来修改SElinux策略内各项规则的布尔值.setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组.SELinux的策略与规则管理相关命令 ...

  3. CentOS升级Python2.6到Python2.7并安装pip

    原文:http://ruter.sundaystart.net/2015/12/03/Update-python/ 貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多 ...

  4. day23 python学习 类 人狗大战

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 面向过程 优点是:极大的降低了 ...

  5. Java调用.NET webservice方法的几种方式

    最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...

  6. greasemonkey修改网页url

    // ==UserScript== // @name JSHE_ModifyFunction // @namespace jshe // @include http://localhost/* // ...

  7. 优化Django ORM中的性能问题(含prefetch_related 和 select_related)

    Django是个好工具,使用的很广泛. 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了.当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码. 怎么查问题 W ...

  8. View绘制基本知识点

    !通过阅读Android开发艺术探索整理   底层工作原理:测量流程.布局流程.绘制流程   常见回调方法:构造方法 onAttach onVisiblityChanged onDetach   Vi ...

  9. Ionic 3 自定义组件的使用

    1. 创建组件 ionic g component myComponent myComponent为组件名称 创建好后,生成的文件如下图 2. 在Page 中使用 使用的是home 在home.htm ...

  10. bzoj2656 数列

    Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A[0]=0 A[1]=1 A[2n]=A[n] A[2n+1]=A[n]+A[n+1] 小白作为 ...