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

print

输出变量的值

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调试利器详解相关推荐

  1. [转]PDB——Python调试利器详解

    python 2.7 pdb官方文档:https://docs.python.org/2.7/library/pdb.html pdb是ptyhon内置的一个调试库,是调试python代码的好帮手,本 ...

  2. python命令窗口在哪里_详解如何在cmd命令窗口中搭建简单的python开发环境

    详解如何在cmd命令窗口中搭建简单的python开发环境 1.快捷键win+r输入cmd回车调出cmd界面,在命令行输入python回车,显示python命令无法识别 2.登陆python官网http ...

  3. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  4. python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  5. 怎么打开python shell_Python之使用adb shell命令启动应用的方法详解

    一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具有局限性,尤其是ID的内容不便于区分 具有重复性时,后面又发 ...

  6. python调用adb shell命令_Python之使用adb shell命令启动应用的方法详解

    Python之使用adb shell命令启动应用的方法详解 一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具 ...

  7. python镜像下载包_python包详解

    干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...

  8. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...

  9. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

最新文章

  1. 获得汉字字符串拼音首字母
  2. Python中常用的内值方法
  3. 用php生成html文件,怎样用PHP生成html文件
  4. nodejs模块笔记
  5. java创建树结构_Java学习之XML-017
  6. centos7安装flink集群_《从0到1学习Flink》—— Flink 写入数据到 Kafka
  7. 设计灵感|色彩叠加在海报设计中的妙用!
  8. cubemx spi 中断_STM32 SPI在使用中断时丢弃数据
  9. 单证票据识别之关键信息提取
  10. ViewStub详解
  11. 打开SVN server图形化管理界面
  12. 如何做好项目进度管理
  13. 人脸识别眨眼张嘴软件_手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非...
  14. 商业智能和分析软件市场现状及发展趋势分析-
  15. 优化概率神经网络_贝叶斯神经网络BNN(推导+代码实现)
  16. 视频播放库Vitamio的使用以及功能扩展
  17. 01 公众号与公众平台
  18. 大数据的学习需要预先了解哪些基础知识?
  19. 手把手教你备份 nvidia jetson agx xavier 系统(亲测有效、超详细)
  20. 基于javaweb+SSM农产品水果店销售管理系统

热门文章

  1. 人生苦短,我用Manjaro
  2. 基于vue实现钉钉审批流程(仿)
  3. 3D游戏编程与设计作业4-Skybox_牧师与魔鬼进阶版
  4. 【新书推荐】【2019.03】赤川次郎作品系列(套装共五册)
  5. github修改描述
  6. 水下图像——不平衡衰减相关文献阅读
  7. 一次Spring技术的面试,被面试官怼的怀疑人生。。
  8. [好好笑] 万峰语录3月26日
  9. YOLOV3中Darknet中cfg文件说明和理解
  10. 计算机设备中不属于输入设备的是什么,以下设备不属于计算机系统输入设备的是()...