pdb python 命令_PDB——Python调试利器详解
pdb是ptyhon内置的一个调试库,是调试python代码的好帮手,本文是对其用法的详细介绍。
QuickStart
待调试的代码内容
文件名:test.py:
# coding:utf-8
import pdb
s1 = 'aaa'
pdb.set_trace()
s2 = 'bbb'
s3 = 'ccc'
pdb.set_trace()
s = s1 + s2 + s3
print s
可以看出在代码的第4、7行分别打了一个断点,使用的是pdb.set_trace()函数。
开始调试
在和代码文件相同路径下打开命令行窗口,输入命令:python test1.py
接着就进入了调试状态:
(.env) E:\code\python-basic\tools\pdb\sample>python test1.py
> e:\code\python-basic\tools\pdb\sample\test1.py(5)()
-> s2 = 'bbb'
(Pdb)
可以看出直接执行到了第一个断点所在的下一行,并停在了这里。
这时可以执行命令:n进行下一步:
(Pdb) n
> e:\code\python-basic\tools\pdb\sample\test1.py(6)()
-> s3 = 'ccc'
(Pdb)
使用p 命令打印已经出现过的变量的值:
(Pdb) p s1
'aaa'
(Pdb) p s2
'bbb'
(Pdb) p s3
*** NameError: NameError("name 's3' is not defined",)
(Pdb)
因为当前变量s3还没有被赋值,所以打印s3的时候提示NameError异常。
使用l命令打印出当前的代码段:
(Pdb) l
1 # coding:utf-8
2 import pdb
3 s1 = 'aaa'
4 pdb.set_trace()
5 s2 = 'bbb'
6 -> s3 = 'ccc'
7 pdb.set_trace()
8 s = s1 + s2 + s3
9 print s
[EOF]
(Pdb)
退出调试:q命令
(Pdb) q
Traceback (most recent call last):
File "test1.py", line 6, in
s3 = 'ccc'
File "test1.py", line 6, in
s3 = 'ccc'
File "d:\programs\python27\Lib\bdb.py", line 49, in trace_dispatch
return self.dispatch_line(frame)
File "d:\programs\python27\Lib\bdb.py", line 68, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
(.env) E:\code\python-basic\tools\pdb\sample>
PDB调试的另一种方式
QuickStart中使用的调试方式不够优雅,因为是通过修改代码的方式打断点的,用起来不太方便。那么能不能动态打断点呢?答案是当然可以,请接着往下看。
准备待调试的代码
删除掉QuickStart中代码中的pdb.set_trace(),剩下的代码如下:
文件名:test2.py
# coding:utf-8
s1 = 'aaa'
s2 = 'bbb'
s3 = 'ccc'
s = s1 + s2 + s3
print s
开始调试
在test2.py相同路径下打开命令行,输入命令:python -m pdb test2.py
(.env) E:\code\python-basic\tools\pdb\sample>python -m pdb test2.py
> e:\code\python-basic\tools\pdb\sample\test2.py(2)()
-> s1 = 'aaa'
(Pdb) l
1 # coding:utf-8
2 -> s1 = 'aaa'
3 s2 = 'bbb'
4 s3 = 'ccc'
5 s = s1 + s2 + s3
6 print s
[EOF]
(Pdb)
可以看到当前代码中我们还没有打任何断点,代码默认停在了第1行。
执行一个命令n:
(Pdb) n
> e:\code\python-basic\tools\pdb\sample\test2.py(3)()
-> s2 = 'bbb'
(Pdb) l
1 # coding:utf-8
2 s1 = 'aaa'
3 -> s2 = 'bbb'
4 s3 = 'ccc'
5 s = s1 + s2 + s3
6 print s
[EOF]
(Pdb)
可以看到单步执行到了下一行。
如果我们想在第5行打一个断点,该怎么打呢?用b 命令在某一行打一个断点:
(Pdb) b 5
Breakpoint 1 at e:\code\python-basic\tools\pdb\sample\test2.py:5
(Pdb) l
[EOF]
(Pdb) n
> e:\code\python-basic\tools\pdb\sample\test2.py(4)()
-> s3 = 'ccc'
(Pdb) l
1 # coding:utf-8
2 s1 = 'aaa'
3 s2 = 'bbb'
4 -> s3 = 'ccc'
5 B s = s1 + s2 + s3
6 print s
[EOF]
(Pdb)
这样就成功地在第5行打了一个断点。
查看当前打了哪些断点:b命令
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at e:\code\python-basic\tools\pdb\sample\test2.py:5
(Pdb)
PDB调试命令汇总
高级命令
以上的示例只是展示了最简单的顺序结构的代码的调试方法,而实际应用中遇到的大多数代码都有着较为复杂的逻辑结构,比如循环结构、分支结构、调用函数、调用其他模块的函数、使用类和对象等等。
针对这些场景还有很多更高级的调试命令,其实掌握了前面的几个简单的命令的用法后,下面的这些更高级的命令就都很容易上手了,多用几遍就能很快掌握了。
命令
命令全称
功能
h
help
查看帮助
n
next
执行下一条语句
s
step
执行下一条语句,如果是函数,则会执行到函数的第一句
b
break
列出当前的所有断点
b
/
在某一行打一个断点
b :
/
在某个文件的某行打一个断点
b
/
在某个函数的第一行打一个断点
cl
clear
清除所有断点
cl n1 n2 ...
/
清除编号为n1、n2...的断点
cl
/
清除某行的断点
cl :
/
清除某个文件某行的断点
r
return
执行当前函数到结束
c
continue
执行到下一个断点
l
list
列出源码(前后11行代码)
l
/
列出某行周围11行代码
l
/
列出两个行号范围内的代码
p
输出变量的值
pp
/
好看一点的输出
q
quit
退出debug
unt
until
退出循环或当期堆栈
run
/
重新启动debug
a
args
列出当前执行的函数的参数
w
where
打印当前执行堆栈
注:平时使用的时候通常用的都是各个命令的简写形式,当然用全称也是可以的(如果不嫌麻烦的话)。
补充
在命令行中进入调试模式的方法:python -m pdb demo.py
在调试模式中按一下Enter键表示执行一下上一条命令。
在ipython中使用PDB(体验更好):%run -d demo.py
pdb python 命令_PDB——Python调试利器详解相关推荐
- [转]PDB——Python调试利器详解
python 2.7 pdb官方文档:https://docs.python.org/2.7/library/pdb.html pdb是ptyhon内置的一个调试库,是调试python代码的好帮手,本 ...
- python命令窗口在哪里_详解如何在cmd命令窗口中搭建简单的python开发环境
详解如何在cmd命令窗口中搭建简单的python开发环境 1.快捷键win+r输入cmd回车调出cmd界面,在命令行输入python回车,显示python命令无法识别 2.登陆python官网http ...
- python命令行大全-用什么库写 Python 命令行程序(示例代码详解)
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...
- python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...
- 怎么打开python shell_Python之使用adb shell命令启动应用的方法详解
一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具有局限性,尤其是ID的内容不便于区分 具有重复性时,后面又发 ...
- python调用adb shell命令_Python之使用adb shell命令启动应用的方法详解
Python之使用adb shell命令启动应用的方法详解 一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具 ...
- python镜像下载包_python包详解
干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...
- python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解
问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
最新文章
- 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出
- 服务器显示AL024是什么意思,中牟县家具木工机械维修台达驱动器al024故障分分钟修复...
- Rest之一-什么是REST?以及RESTful的实现
- webbench windows_linux下的web并发测试工具汇总:ab, siege和webbench
- NetBeans IDE 8.0和Java 8的新功能
- python图例重复显示_matplotlib中的图例中有重复项?
- websphere Error 404:SRVE0190E: File not found: index.action
- Docker安装稳定版及指定版本
- [paper reading] CenterNet (Object as Points)
- BZOJ 4503 两个串 ——FFT
- (8)二进制文件方式部署Kubernetes高可用集群----------部署高可用ETCD集群
- Pawn Storm网络间谍行动再度现身
- 微生物组对肥胖影响的最新研究分析
- 场景一:刮刮卡,大转盘等抽奖算法
- 全球及中国军用海岸雷达行业研究及十四五规划分析报告
- markdown无法显示图片的问题
- python扫雷 高级算法_Python玩转算法—扫雷
- EEPROM介绍及与Flash区别
- 教你快速高效接入SDK——Unity统一接入渠道SDK(Android篇)
- 中国地质大学(北京) 研究生 数学课《机器学习》期末考试 考试范围+考试题目+参考答案 2022秋
热门文章
- 多文件上传并且需要添加其他参数,formData上传报错,Caused by: org.apache.tomcat.util.http.fileupload.FileUploadException:
- aac格式怎么转换成mp3?
- 牧师与魔鬼动作分离版
- Kafka Streams(三十)
- centos 开机后提示failed to initialize packaging backend
- 【4】牛客网BC3 有容乃大
- Android操作系统中11种传感器的介绍【转】
- RocketMQ同步消息、异步消息、单向消息详解
- 东邪西毒终极版经典台词
- php获取查找字符串下标,PHP利用stripos()查找字符串位置