首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

python pdb调试方法

  • 25-03-03 18:21
  • 4527
  • 6539
blog.csdn.net

文章目录

  • 一、pdb的使用方法
    • 1.1 非侵入式方法
    • 1.2 侵入式方法
  • 二、pdb的内部指令
    • 2.1 逐行调试命令
    • 2.2 查看源代码
    • 2.3 添加断点
    • 2.4 添加临时断点
    • 2.5 清除断点
    • 2.6 打印变量值
    • 2.7 非逐行调试命令
      • 命令1:
      • 命令2:
      • 命令3:
    • 2.8 查看函数参数
    • 2.9 打印变量类型
    • 2.10 启动交互式解释器
    • 2.11 打印堆栈信息
    • 2.12 退出pdb
    • 2.13 帮助
  • 三、注意问题和解决
    • 注意点1:
    • 注意点2:
    • 注意点3:
  • Last、参考文献
  • Last and Need to Read、还没看有参考价值的文献

一、pdb的使用方法

当你在命令行看到下面这个提示符时,说明已经正确打开了pdb

(Pdb) 
  • 1

然后就可以在交互界面,输入pdb命令,进行调试

下面是pdb的调用使用方法

1.1 非侵入式方法

不用额外修改源代码,在命令行下直接运行就能调试

python3 -m pdb filename.py
  • 1

举个例子

pdb_test.py 文件内容如下

print('hello world')
  • 1

运行指令如下

python3 -m pdb pdb_test.py
  • 1

运行结果如下

image-20200729200626574

1.2 侵入式方法

需要在被调试的代码中添加一行代码然后再正常运行代码

import pdb;pdb.set_trace()
  • 1

pdb.set_trace()这里就是一个断点,程序运行之后,会停留在pdb.set_trace()这里。

之后就进入了pdb调试部分,可以通过调试指令进行代码的调试

举个例子

pdb_test.py 文件内容如下

import pdb;pdb.set_trace()
print('hello world')
  • 1
  • 2

运行指令如下

python3 pdb_test.py
  • 1

运行结果如下

image-20200729200752462

继续运行后,如果在下面的程序中继续有 set_trace() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

二、pdb的内部指令

2.1 逐行调试命令

包括s,n , r这3个相似的命令,区别在如何对待函数上。说明:

  • s执行下一行(能够进入函数体)

  • n执行下一行(不会进入函数体)

  • r执行下一行(在函数中时会直接执行到函数返回处)

举个例子

pdb_test.py 文件内容如下

def add_1(a):
    print('进入函数')
    a = a+1
    return a
if __name__ == '__main__':
    print('hello world')
    a = 1
    a = add_1(a)
    print(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行指令如下

python3 -m pdb pdb_test.py
  • 1

s运行结果如下

image-20200729202225575

n运行结果如下

image-20200729202509672

r运行结果如下

image-20200729202530502

2.2 查看源代码

命令:l

说明:

查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>这个符号标出来

命令:ll

说明:

查看当前函数或框架的所有源代码

2.3 添加断点

命令:

b
b lineno
b filename:lineno 
b functionname
  • 1
  • 2
  • 3
  • 4

说明与参数:

不带参数表示查看断点设置

带参则在指定位置设置一个断点

lineno =》断点添加到哪一行(当前文件)

filename:lineno =》文件名和行号,断点添加到哪个文件的哪一行 如:train:44 (即为train.py的44行)

functionname =》函数名,在该函数执行的第一行设置断点

2.4 添加临时断点

命令:

tbreak
tbreak lineno
tbreak filename:lineno
tbreak functionname
  • 1
  • 2
  • 3
  • 4

说明与参数:

执行一次后时自动删除(这就是它被称为临时断点的原因)

参数的设置同b

2.5 清除断点

命令:

cl
cl filename:lineno
cl bpnumber [bpnumber ...]
  • 1
  • 2
  • 3

参数:

bpnumber 断点序号(多个以空格分隔)

说明:

1.不带参数用于清除所有断点,会提示确认(包括临时断点)
2.带参数则清除指定文件行或当前文件指定序号的断点

2.6 打印变量值

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名。

但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … …> 错误。

命令:

p expression
  • 1

参数:

expression 即为 Python表达式

2.7 非逐行调试命令

命令1:

c 
  • 1

说明:

停止调试,持续执行下去,直到遇到一个断点

命令2:

unt lineno
  • 1

说明:

持续执行直到运行到指定行(或遇到断点)

命令3:

j lineno
  • 1

说明:

直接跳转到指定行(注意,被跳过的代码不执行)

2.8 查看函数参数

命令:

a
  • 1

说明:

在函数中时打印函数的参数和参数的值

2.9 打印变量类型

命令:

whatis expression
  • 1

说明:

打印表达式的类型,常用来打印变量值

2.10 启动交互式解释器

interact
  • 1
import pdb;pdb.set_trace()
print("1")
print("2")
print("3")
print("4")
a = 100
pdb.set_trace()
print("5")
print("6")
print("7")
print("8")
print(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

说明:

启动一个python的交互式解释器,使用当前代码的全局命名空间(使用ctrl+d返回pdb)

image-20210303102715373

2.11 打印堆栈信息

w
  • 1

说明:

打印堆栈信息,最新的帧在最底部。箭头表示当前帧。

2.12 退出pdb

q
  • 1

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

2.13 帮助

help
  • 1

三、注意问题和解决

注意点1:

选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。

注意点2:

输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行

注意点3:

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是a已经被赋值了,如果想重新改变a的赋值,则应该使用!a。

import pdb;pdb.set_trace()
print("1")
print("2")
print("3")
print("4")
a = 100
pdb.set_trace()
print("5")
print("6")
print("7")
print("8")
print(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

image-20210303102536599

Last、参考文献

python pdb查看变量值_使用pdb模块调试Python_weixin_39587029的博客-CSDN博客

Python 代码调试技巧

10分钟教程掌握Python调试器pdb - 知乎

Last and Need to Read、还没看有参考价值的文献

pdb — Python的调试器 — Python 3.7.10 說明文件

Python,告别Print? - 知乎

Python ipdb 调试大法[视频] - 知乎

DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧 - 知乎

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览416632 人正在系统学习中
注:本文转载自blog.csdn.net的呆呆象呆呆的文章"https://blog.csdn.net/qq_41554005/article/details/114301729"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top