Python 必备 debug 神器:pdb

深度掌握 Python 调试:使用 pdb 高效定位并修复代码问题!! pdb提供了许多调试工具,可以帮助开发者深入分析程序执行,查找问题。通过断点、单步执行、查看变量等操作,你可以快速定位问题并解决。在调试过程中,合理使用这些命令,能够高效地进行调试,提升代码质量。通过pdb设置断点,暂停程序的执行。检查变量的值,发现了程序中的问题。单步执行代码,分析问题的根本原因。修复问题并重新运行程序。pdb是一个强大的调试工具,能帮助我们在程序出现错误时,快速定位和修复问题,提升开发效率。使用在程序崩溃后迅速进入调试状态,分析错误发生的地方。 阅读详情

我的小程序【编程面试题库】

目录

  • 叨逼叨
  • 使用介绍
  • 举个简单的栗子

叨逼叨

首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调试代码了,我们先不说这个)

使用介绍

如何添加断点?

说到 debug,肯定是要添加断点的,这里有两种方式添加断点:

  • 在想要断点代码后添加 一行
pdb.set_trace()

若是使用这种方式,直接运行 Python 文件即可进入断点调试。

  • 用命令行来添加断点
b line_number(代码行数)

若是使用这种方式,需要 python -m pdb xxx.py 来启动断点调试。

常用命令

先简单介绍一下使用命令,这里不用记住,等用到的时候回来查就行。

  • 1 进入命令行Debug模式,python -m pdb xxx.py

  • 2 h:(help)帮助

  • 3 w:(where)打印当前执行堆栈

  • 4 d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)

  • 5 u:(up)执行跳转到当前堆栈的上一层

  • 6 b:(break)添加断点

           b 列出当前所有断点,和断点执行到统计次数
    
           b line_no:当前脚本的line_no行添加断点
    
           b filename:line_no:脚本filename的line_no行添加断点
    
           b function:在函数function的第一条可执行语句处添加断点
    
  • 7 tbreak:(temporary break)临时断点

           在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
    
  • 8 cl:(clear)清除断点

          cl 清除所有断点
    
          cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
    
          cl lineno 清除当前脚本lineno行的断点
    
          cl filename:line_no 清除脚本filename的line_no行的断点
    
  • 9 disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用

  • 10 enable:激活断点,参数为bpnumber

  • 11 s:(step)执行下一条命令

          如果本句是函数调用,则s会执行到函数的第一句
    
  • 12 n:(next)执行下一条语句

          如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
    
  • 13 r:(return)执行当前运行函数到结束

  • 14 c:(continue)继续执行,直到遇到下一条断点

  • 15 l:(list)列出源码

           l 列出当前执行语句周围11条代码
    
           l first 列出first行周围11条代码
    
           l first second 列出first--second范围的代码,如果second<first,second将被解析为行数
    
  • 16 a:(args)列出当前执行函数的函数

  • 17 p expression:(print)输出expression的值

  • 18 pp expression:好看一点的p expression

  • 19 run:重新启动debug,相当于restart

  • 20 q:(quit)退出debug

  • 21 j lineno:(jump)设置下条执行的语句函数

          只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
    
  • 22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束

  • 23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效

举个简单的栗子

为了验证一下 pdb 的用法,我写了个简单的 Python 代码,如下:

__author__ = 'zone'
__gzh__ = '公号:zone7'
import pdb

class MyScrapy:
    urls = []

    def start_url(self, urls):
        pdb.set_trace()
        for url in urls:
            print(url)
            self.urls.append(url)

    def parse(self):
        pdb.set_trace()
        for url in self.urls:
            result = self.request_something(url)

    def request_something(self, url):
        print('requesting...')
        data = '''<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
</html>'''
        return data


scrapy= MyScrapy()
scrapy.start_url(["http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", ])
scrapy.parse()

运行实例:(这里为了方便大家阅读,我添加了中文注释,实际运行时不会有注释的)

D:\work\venv\Scripts\python.exe D:/work_test/test/pdb_test/pdb_test.py
> d:\work_test\test\pdb_test\pdb_test.py(11)start_url()
-> for url in urls:


(Pdb) n  注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(12)start_url()
-> print(url)


(Pdb) l  注释: l(list)列出当前代码
  7  	    urls = []
  8  	
  9  	    def start_url(self, urls):
 10  	        pdb.set_trace()
 11  	        for url in urls:
 12  ->	            print(url)
 13  	            self.urls.append(url)
 14  	
 15  	    def parse(self):
 16  	        pdb.set_trace()
 17  	        for url in self.urls:


(Pdb) c  注释:c(continue),继续执行,知道遇到下一个断点
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
> d:\work_test\test\pdb_test\pdb_test.py(17)parse()
-> for url in self.urls:


(Pdb) n  注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(18)parse()
-> result = self.request_something(url)


(Pdb) l 注释: l(list)列出当前代码
 13  	            self.urls.append(url)
 14  	
 15  	    def parse(self):
 16  	        pdb.set_trace()
 17  	        for url in self.urls:
 18  ->	            result = self.request_something(url)
 19  	
 20  	    def request_something(self, url):
 21  	        print('requesting...')
 22  	        data = '''<!DOCTYPE html>
 23  	<html lang="en">


(Pdb) s 注释: s(step)这里是进入 request_something() 函数的意思
--Call--
> d:\work_test\test\pdb_test\pdb_test.py(20)request_something()
-> def request_something(self, url):


(Pdb) n  注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(21)request_something()
-> print('requesting...')


(Pdb) l 注释: l(list)列出当前代码
 16  	        pdb.set_trace()
 17  	        for url in self.urls:
 18  	            result = self.request_something(url)
 19  	
 20  	    def request_something(self, url):
 21  ->	        print('requesting...')
 22  	        data = '''<!DOCTYPE html>
 23  	<html lang="en">
 24  	<head>
 25  	    <meta charset="UTF-8">
 26  	    <title>Title</title>


(Pdb) p url  注释:p(print)打印出 url 变量的数据
'http://www.zone7.cn'


(Pdb) n  注释:n(next)执行下一步
requesting...
> d:\work_test\test\pdb_test\pdb_test.py(31)request_something()
-> </html>'''


(Pdb) p data  注释:p(print)打印出指定变量的数据,这里由于赋值还没完成,所以报错
*** NameError: name 'data' is not defined


(Pdb) n  注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(32)request_something()
-> return data


(Pdb) p data  注释:p(print)打印出指定变量的数据
'<!DOCTYPE html>\n<html lang="en">\n<head>\n    <meta charset="UTF-8">\n    <title>Title</title>\n</head>\n<body>\n\n</body>\n</html>'

(Pdb) q  注释:q(quit)退出

总结

按照上面的例子一套下来,基本的用法就可以学会了,关键还是得自己多实践,今天就写到这,还想写一篇关于性能调试的文章,不知道这两天有没有时间了。

python:pdb --- Python 的调试器 阅读详情

相关推荐

Docker启动安装nacos(详情讲解,全网最细)

docker安装nacos保姆级教程

ilvjiale的博客 8万+

python学习-代码调试器pdb的使用教程

因此,如果插入符号位于已执行的行,则程序将恢复以进一步执行,因为无法回滚到以前的断点。:如果选择此检查命令,则单独(异步)加载调试器中的变量。在这种情况下,如果加载变量需要很长时间,调试器会显示消息,如果变量太慢,则只有在调试器之后才会显示其值或消息。第二个方式优雅了一些,但有的时候就是写的小脚本,不需要保存日志,比较麻烦。单击此按钮可执行程序,直到当前方法或文件中的下一行,跳过当前执行点引用的方法(如果有)。这两个还有一些缺点,例如,打印的不够多时,还需要添加print或log,然后再次运行。

关注网络安全、云原生安全 8098

解决Word中英文混排的5个常见排版问题(含单词换行、间距调整等)

本文详细解析Word中英文混排的5大常见排版问题,包括单词换行、间距调整、标点混用等,提供专业解决方案。通过设置段落格式、调整兼容性选项和使用字体组合等技巧,帮助用户轻松解决文档排版难题,提升专业性和阅读体验。

vim8coder的博客 1336

Python内置debug库: pdb用法详解

本文详细介绍python的pdb库的用法,用于python代码的debug。

日常学习与专研的记录 4619

【自动驾驶】汽车智能驾驶计算芯片

本文介绍汽车智能驾驶计算芯片的软硬件要求、 可靠性和安全性要求、 性能要求,和相应的试验方法。除了用于汽车智能驾驶, 其他领域的计算芯片可参照执行。

Mr.Cssust的博客 2631

Android13无重力感应系统修改触摸屏跟随屏幕显示旋转方向旋转

在实际产品中设计时会移除重力传感器。当设备缺少重力传感器时,系统无法使用该传感器提供的方向数据来确定屏幕旋转的方向。Android 系统中由于移除重力传感器导致的默认显示方向旋转引起触摸屏与屏幕显示不一致问题,主要是由于缺乏方向检测和触摸坐标的正确转换。通过使用替代传感器(如陀螺仪)、手动配置方向、调整触摸事件坐标和 UI 布局,可以解决这个问题。开发者需要确保在设备没有重力传感器的情况下,能够通过其他方法推测方向,并确保触摸事件和 UI 动作能够正确响应设备的旋转。

weixin_35723192的博客 803

debug命令_Python 必备 debug 神器:pdb

目录叨逼叨使用介绍举个简单的栗子叨逼叨首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调试代码了,我们先不说这个)使用介绍如何添加断点?说到 debug...

weixin_39980298的博客 258

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别

多模态情感识别是人工智能领域的重要研究方向,旨在通过结合多种感知模态(如音频、视频、文本等)来更准确地识别人类情感状态。与传统单模态方法相比,多模态方法能够利用不同模态间的互补信息,提高情感识别的鲁棒性和准确性。 RAVDESS(Ryerson Audio-Visual Database of Emotional Speech and Song)是一个常用的多模态情感识别数据集,包含24位专业演员(12名男性,12名女性)表达的8种情感状态(中性、平静、快乐、悲伤、愤怒、恐惧、厌恶和惊讶)的音视频数据。

max500600的博客 497

学Python 必备的debug 神器-pdb

学Python 必备的debug 神器-pdb 目录 叨逼叨 使用介绍 举个简单的栗子 叨逼叨 首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调...

chen801090的博客 317

数据治理路径之辩:从“先治后用”到“边用边治”,企业如何选择最优路径?

数据治理是企业在数智化建设中的核心挑战,主要涉及三种时序策略:先治理后使用、先用后治理和边用边治。先治理后使用强调在数据应用前建立完整的治理框架,适合高合规要求的行业,但可能响应滞后。先用后治理则优先释放数据价值,适合快速变化的业务环境,但可能累积数据质量问题。边用边治寻求动态平衡,通过持续改进实现治理与应用的同步迭代,适合复杂数据环境。技术选型决策矩阵和实施方法论提供了具体的操作指南,建议根据组织特性和业务需求选择适配方案,并通过渐进式演进路径实现治理与业务的共生演进。

石榴姐yyds 405

NVIDIA Omniverse 技术浅析(二):USD

例如,一个用户可以负责场景的几何体设计,另一个用户可以负责材质和灯光的调整。USD 的开放性和可扩展性,结合 Omniverse 的 Kit 扩展框架,使得用户和开发者可以创建自定义的应用程序和工具,以满足特定的需求。USD 的材质和物理属性系统,结合 Omniverse 的 RTX 实时渲染技术,使得用户可以在虚拟环境中看到逼真的光影效果和物理模拟。USD 的时间轴和动画功能,结合 Omniverse 的物理属性系统,使得用户可以为虚拟环境中的元素创建复杂的动画和物理模拟。

m0_75253143的博客 444

debug跳出循环_学Python 必备的debug 神器-pdb

学Python 必备的debug 神器-pdb目录叨逼叨使用介绍举个简单的栗子叨逼叨首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调试代码了,今天先不...

weixin_39759182的博客 915

【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究

本文探讨了存内计算及其面向的架构优化,尤其侧重于图算法优化和存内计算存储介质。文章介绍了存内计算的概念和意义,着重强调了存内计算解决了内存墙问题,提高了计算效率。针对图算法的优化,提出了基于位运算的创新方法,重塑了单源最短路径算法,并介绍了基于局部重叠度的链路预测算法优化设计。接着,文章详细讨论了存内计算存储介质,特别是非易失性存储器,比较了不同类型存储器的性能,并重点介绍了基于ReRAM的存内计算技术,包括其物理模型和交叉阵列结构。

一键难忘的博客 7066

python调试工具 -- pdb

pdb是python的内置模块,类似c++中的gdb的存在,可用于在命令行中对代码进行调试。

Onwaier的博客 825

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python自带的编程调试环境包括了什么_Python自带的调试及性能分析神器

工具可以大大提升效率,节省时间,能自己掌控的时间越多,越自由。Python 也是效率工具,使用的越多,你省下来的时间就越多,你就会越觉得自由,因为一切尽在你的代码掌控中。但有一种情况,可能会耗费你很多时间,那就是调试和性能分析,说到这里,有人可能会说,调试不就是 print 下变量,性能分析不就是加个耗时统计么,有多耗费时间呢?没错,简单的程序,怎么弄都是简单的,如果是复杂的程序,比如上千行的代码...

weixin_39966465的博客 404

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

调试结果不弹出_Python自带的调试及性能分析神器

工具可以大大提升效率,节省时间,能自己掌控的时间越多,越自由。Python 也是效率工具,使用的越多,你省下来的时间就越多,你就会越觉得自由,因为一切尽在你的代码掌控中。但有一种情况,可能会耗费你很多时间,那就是调试和性能分析,说到这里,有人可能会说,调试不就是 print 下变量,性能分析不就是加个耗时统计么,有多耗费时间呢?没错,简单的程序,怎么弄都是简单的,如果是复杂的程序,比如上千行的代码...

weixin_36184985的博客 167

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Python breakpoint() 调试范式升级:从print到可配置断点

`breakpoint()` 是 Python 3.7 引入的标准化调试入口,本质是可配置的断点调用机制,其核心原理在于解耦‘触发位置’与‘执行行为’,通过 `sys.breakpointhook` 和 `PYTHONBREAKPOINT` 环境变量实现运行时策略切换。这一设计显著提升了调试行为的可移植性、环境适应性与工程可控性,技术价值体现在无缝支持本地开发(ipdb/pudb)、CI/CD禁用、容器远程调试(remote_pdb)及框架集成(VS Code/Jupyter/FastAPI)。典型应用场景

weixin_34059951的博客 447

python 如何边改代码边调试_Python 代码调试神器:PySnooper

给大家推荐本我自己写的电子书《PyCharm中文指南》,把各种 PyCharm 的高效的使用技巧用GIF动态图的形式展示出来。有兴趣的可以看它的在线文档:http://pycharm.iswbm.com对于每个程序开发者来说,调试几乎是必备技能。代码写到一半卡住了,不知道这个函数执行完的返回结果是怎样的?调试一下看看代码运行到一半报错了,什么情况?怎么跟预期的不一样?调试一下看看调试的方法多种多样...

weixin_39548832的博客 758

推荐一款面试神器:编程面试题库

介绍一下这款小程序咱们这款小程序记录了当前主流语言的一些常见面试题,包括常见问题和大厂面经。大厂面经数量还有待增加。别看小程序名称是「编程面试题库」,平时也可以翻阅,涨知识。如果你也有...

算法channel 625
上一篇: 推荐一款神器:提高你的搜索效率
下一篇: Python线上环境如何优雅地使用日志?
zone7_
博客等级 码龄10年 144粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值