> 文章列表 > python命令行调试工具pdb的基本用法

python命令行调试工具pdb的基本用法

python命令行调试工具pdb的基本用法

实际工作过程中都是采用linux远程ssh模式进行无界面开发,代码出问题需要调试,一般有两种解决方案

  • 使用print("")控制开输出信息
  • 使用log.debug(“”),写日志到控制台或则文件

然而但是这些通过修改源码的方式,侵入性太高,每次调试完可能还要删除,比较麻烦,那么我们就需要一个能够进行无侵入式的调试方式

简介

pdb是ptyhon内置的一个调试库,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

开启调试方式

  • 侵入式方法 (需要在被调试的代码中添加以下代码然后再正常运行代码)
import pdb
pdb.set_trace()
  • 非侵入式方法 (不用额外修改源代码,在命令行下直接运行就能调试)
python -m pdb demo.py

为了不修改源码,我们推荐第一种非侵入方案

简单使用

  • 待调试代码demo.py
print(111)
print(222)
a = 1
b = 2
c = a + bfor i in range(100, 106):print("index:", i)print("hello")
  • 进入调试
python -m pdb demo.py
d:\\>python -m pdb demo.py
> d:\\demo.py(1)<module>()
-> print(111)

-> 表示当前要执行的位置

  • 查看代码
    执行ll命令查看代码
    可以看到所有的代码,以及->指向当前要执行的代码行
(Pdb) ll1  -> print(111)2     print(222)3     a = 14     b = 25     c = a + b67     for i in range(100, 106):8         print("index:", i)9         print("hello")
(Pdb)
  • 执行下一行
    执行n命令,进入下一行,可以看到命令行打印出当前要执行的行的代码-> print(222)
(Pdb) n
111
> d:\\demo.py(2)<module>()
-> print(222)
(Pdb) ll1     print(111)2  -> print(222)3     a = 14     b = 25     c = a + b67     for i in range(100, 106):8         print("index:", i)9         print("hello")
(Pdb)
  • 设置断点
    执行b 3命令,给第3行设置断点,可以看到第三行多了一个大写的B
(Pdb) b 3
Breakpoint 1 at d:\\demo.py:3
(Pdb) ll1     print(111)2  -> print(222)3 B   a = 14     b = 25     c = a + b67     for i in range(100, 106):8         print("index:", i)9         print("hello")
  • 查看所有断点
    执行b命令,查看所有断点
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at d:\\demo.py:3
(Pdb)
  • 删除断点
    执行clear 1命令,删除Num为1的第一个断点
(Pdb) clear 1
Deleted breakpoint 1 at d:\\demo.py:3
(Pdb) ll1     print(111)2  -> print(222)3     a = 14     b = 25     c = a + b67     for i in range(100, 106):8         print("index:", i)9         print("hello")
  • 下一个断点
    先给第三行和第七行打上断点,然后执行c命令,可以看到代码执行到第三行,再次执行c命令,代码执行到第七行
(Pdb) b 3
Breakpoint 2 at d:\\demo.py:3
(Pdb) b 7
Breakpoint 3 at d:\\demo.py:7
(Pdb) ll1     print(111)2  -> print(222)3 B   a = 14     b = 25     c = a + b67 B   for i in range(100, 106):8         print("index:", i)9         print("hello")
(Pdb) c
222
> d:\\demo.py(3)<module>()
-> a = 1
(Pdb) c
> d:\\demo.py(7)<module>()
-> for i in range(100, 106):
  • 查看变量值
    使用p a命令,查看a的值,执行p b,c查看b,c的值
(Pdb) p a
1
(Pdb) p b,c
(2, 3)
(Pdb)