pdb调试工具
调试--pdb
pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++)。
命令 | 简写命令 | 作用 |
---|---|---|
break | b | 设置断点 |
continue | c | 继续执行程序 |
list | l | 查看当前行的代码段 |
step | s | 进入函数 |
return | r | 执行代码直到从当前函数返回 |
quit | q | 中止并退出 |
next | n | 执行下一行 |
p | 打印变量的值 | |
help | h | 帮助 |
args | a | 查看传入参数 |
回车 | 重复上一条命令 | |
break | b | 显示所有断点 |
break lineno | b lineno | 在指定行设置断点 |
break file:lineno | b file:lineno | 在指定文件的行设置断点 |
clear num | 删除指定断点 | |
bt | 查看函数调用栈帧 |
执行时调试
程序启动,停止在第一行等待单步调试。
- python -m pdb some.py
交互调试
进入python或ipython解释器
- import pdb
- pdb.run('testfun(args)') #此时会打开pdb调试,注意:先使用s跳转到这个testfun函数中,然后就可以使用l看到代码了
程序里埋点
当程序执行到pdb.set_trace() 位置时停下来调试
- 代码上下文
- ...
- import pdb
- pdb.set_trace()
- ...
日志调试
demo 1
- import pdb
- a = "aaa"
- pdb.set_trace()
- b = "bbb"
- c = "ccc"
- final = a + b + c
- print final
- #调试方法
- # 《1 显示代码》
- # l---->能够显示当前调试过程中的代码,其实l表示list列出的意思
- #如下,途中,-> 指向的地方表示要将要执行的位置
- # 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
- # 《2 执行下一行代码》
- # n---->能够向下执行一行代码,然后停止运行等待继续调试 n表示next的意思
- # 《3 查看变量的值》
- # p---->能够查看变量的值,p表示prit打印输出的意思
- #例如:
- # p name 表示查看变量name的值
demo 2
- import pdb
- a = "aaa"
- pdb.set_trace()
- b = "bbb"
- c = "ccc"
- pdb.set_trace()
- final = a + b + c
- print final
- # 《4 将程序继续运行》
- # c----->让程序继续向下执行,与n的区别是n只会执行下面的一行代码,而c会像python xxxx.py一样 继续执行不会停止;c表示continue的意思
- # 《5 set_trace()》
- # 如果程序中有多个set_trace(),那么能够让程序在使用c的时候停留在下一个set_trace()位置处
demo 3
- #coding=utf-8
- import pdb
- def combine(s1,s2):
- s3 = s1 + s2 + s1
- s3 = '"' + s3 +'"'
- return s3
- a = "aaa"
- pdb.set_trace()
- b = "bbb"
- c = "ccc"
- final = combine(a,b)
- print final
- # 《6 设置断点》
- # b---->设置断点,即当使用c的时候,c可以在遇到set_trace()的时候停止,也可以在遇到标记有断点的地方停止;b表示break的意思
- #例如:
- #b 11 在第11行设置断点,注意这个11可以使用l来得到
- # (Pdb) l
- # 4 s3 = s1 + s2 + s1
- # 5 s3 = '"' + s3 +'"'
- # 6 return s3
- # 7 a = "aaa"
- # 8 pdb.set_trace()
- # 9 -> b = "bbb"
- # 10 c = "ccc"
- # 11 final = combine(a,b)
- # 12 print final
- # [EOF]
- # (Pdb) b 11
- # Breakpoint 1 at /Users/wangmingdong/Desktop/test3.py:11
- # (Pdb) c
- # > /Users/wangmingdong/Desktop/test3.py(11)<module>()
- # -> final = combine(a,b)
- # (Pdb) l
- # 6 return s3
- # 7 a = "aaa"
- # 8 pdb.set_trace()
- # 9 b = "bbb"
- # 10 c = "ccc"
- # 11 B-> final = combine(a,b)
- # 12 print final
- # 《7 进入函数继续调试》
- # s---->进入函数里面继续调试,如果使用n表示把一个函数的调用当做一条语句执行过去,而使用s的话,会进入到这个函数 并且停止
- #例如
- # (Pdb) l
- # 6 return s3
- # 7 a = "aaa"
- # 8 pdb.set_trace()
- # 9 b = "bbb"
- # 10 c = "ccc"
- # 11 B-> final = combine(a,b)
- # 12 print final
- # [EOF]
- # (Pdb) s
- # --Call--
- # > /Users/wangmingdong/Desktop/test3.py(3)combine()
- # -> def combine(s1,s2):
- # (Pdb) l
- # 1 import pdb
- # 2
- # 3 -> def combine(s1,s2):
- # 4 s3 = s1 + s2 + s1
- # 5 s3 = '"' + s3 +'"'
- # 6 return s3
- # 7 a = "aaa"
- # 8 pdb.set_trace()
- # 9 b = "bbb"
- # 10 c = "ccc"
- # 11 B final = combine(a,b)
- # (Pdb)
- # 《8 查看传递到函数中的变量》
- # a---->调用一个函数时,可以查看传递到这个函数中的所有的参数;a表示arg的意思
- #例如:
- # (Pdb) l
- # 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"
- # (Pdb) a
- # s1 = aaa
- # s2 = bbb
- # 《9 执行到函数的最后一步》
- # r----->如果在函数中不想一步步的调试了,只是想到这个函数的最后一条语句那个位置,比如return语句,那么就可以使用r;r表示return的意思
demo 4
- In [1]: def pdb_test(arg):
- ...: for i in range(arg):
- ...: print(i)
- ...: return arg
- ...:
- In [2]: #在python交互模式中,如果想要调试这个函数,那么可以
- In [3]: #采用,pdb.run的方式,如下:
- In [4]: import pdb
- In [5]: pdb.run("pdb_test(10)")
- > <string>(1)<module>()
- (Pdb) s
- --Call--
- > <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
- -> def pdb_test(arg):
- (Pdb) l
- 1 -> def pdb_test(arg):
- 2 for i in range(arg):
- 3 print(i)
- 4 return arg
- [EOF]
- (Pdb) n
- > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
- -> for i in range(arg):
- (Pdb) l
- 1 def pdb_test(arg):
- 2 -> for i in range(arg):
- 3 print(i)
- 4 return arg
- [EOF]
- (Pdb) n
- > <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
- -> print(i)
- (Pdb)
- 0
- > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
- -> for i in range(arg):
- (Pdb)
- > <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
- -> print(i)
- (Pdb)
- 1
- > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
- -> for i in range(arg):
- (Pdb)
- demo 5 运行过程中使用pdb修改变量的值
- In [7]: pdb.run("pdb_test(1)")
- > <string>(1)<module>()
- (Pdb) s
- --Call--
- > <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
- -> def pdb_test(arg):
- (Pdb) a
- arg = 1
- (Pdb) l
- 1 -> def pdb_test(arg):
- 2 for i in range(arg):
- 3 print(i)
- 4 return arg
- [EOF]
- (Pdb) !arg = 100 #!!!这里是修改变量的方法
- (Pdb) n
- > <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
- -> for i in range(arg):
- (Pdb) l
- 1 def pdb_test(arg):
- 2 -> for i in range(arg):
- 3 print(i)
- 4 return arg
- [EOF]
- (Pdb) p arg
- 100
- (Pdb)
使用所学的pdb调试技巧对其进行调试出bug
- #coding=utf-8
- import pdb
- def add3Nums(a1,a2,a3):
- result = a1+a2+a3
- return result
- def get3NumsAvarage(s1,s2):
- s3 = s1 + s2 + s1
- result = 0
- result = add3Nums(s1,s2,s3)/3
- if __name__ == '__main__':
- a = 11
- # pdb.set_trace()
- b = 12
- final = get3NumsAvarage(a,b)
- print final
pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。
pdb调试工具的更多相关文章
- pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
初学时大多使用print或log调试程序,这在小规模的程序下很方便 但是更好的方法是一边运行一边检查里面的变量和方法 1.Pdb Pdb是一个交互式的调试工具,集成于Python标准库中 Pdb能让你 ...
- python调试工具pdb
pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的代码段 step ...
- python执行命令行调试工具pdb
调试 pdb pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点(用法,b <数字>:在第数字行设置断点....... ...
- pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用
参考深度学习框架pytorch:入门和实践一书第六章 以深度学习框架PyTorch一书的学习-第六章-实战指南为前提 在pytorch中Debug pytorch作为一个动态图框架,与ipdb结合能为 ...
- python 内置调试工具 pdb
除了 pycharm 可以调试python外,python自带的内置工具pdb 也可以调试 python.其命令方式类似于 gdb. pdb 常用的调试命令见下表. 命令 解释 break 或 b 设 ...
- 12、python单步调试工具pdb
pdb 第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态.我们先准备好程序: # err.py s = '0' n = int(s) print(10 / n) ...
- Python自带又好用的代码调试工具Pdb学习笔记
返璞归真 这几天项目有一个linux下部署数据库的操作,数据库使用python进行初始化安装.然后问题来了,由于linux服务器涉及安全要求,除了代码以来的Python3.6版本外不允许安装其他插件与 ...
- Python原生调试工具pdb实践小结
使用python -m pdb xxx.py进入单步调试模式,默认会在脚本的第一行可执行命令处停止.此时,通过 b function设置之后的函数断点会提示出错,从出错异常栈中可以看出,pdb是将fu ...
- Microsoft Visual Studio PDB文件相关事宜
Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...
随机推荐
- C# Dictionary源码剖析
参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719 ...
- setsebool命令详解与SELinux管理
setsebool命令是用来修改SElinux策略内各项规则的布尔值.setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组.SELinux的策略与规则管理相关命令 ...
- CentOS升级Python2.6到Python2.7并安装pip
原文:http://ruter.sundaystart.net/2015/12/03/Update-python/ 貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多 ...
- day23 python学习 类 人狗大战
面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 面向过程 优点是:极大的降低了 ...
- Java调用.NET webservice方法的几种方式
最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...
- greasemonkey修改网页url
// ==UserScript== // @name JSHE_ModifyFunction // @namespace jshe // @include http://localhost/* // ...
- 优化Django ORM中的性能问题(含prefetch_related 和 select_related)
Django是个好工具,使用的很广泛. 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了.当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码. 怎么查问题 W ...
- View绘制基本知识点
!通过阅读Android开发艺术探索整理 底层工作原理:测量流程.布局流程.绘制流程 常见回调方法:构造方法 onAttach onVisiblityChanged onDetach Vi ...
- Ionic 3 自定义组件的使用
1. 创建组件 ionic g component myComponent myComponent为组件名称 创建好后,生成的文件如下图 2. 在Page 中使用 使用的是home 在home.htm ...
- bzoj2656 数列
Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A[0]=0 A[1]=1 A[2n]=A[n] A[2n+1]=A[n]+A[n+1] 小白作为 ...