您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

C有gdb,Python也有pdb

时间:2022-07-30 18:46:11  来源:  作者:VT漫步

写过C语言的同学们想必都很怀念(读者:¿)gdb调试器,使用gdb可以随意在程序运行过程中暂停流程、查看变量。

很多时候,我们单纯分析代码流程和日志信息无法定位的问题,都得靠调试器来帮忙;可以说有了调试器,程序员才是代码世界完整的上帝。

Python/ target=_blank class=infotextkey>Python当然也不示弱,同样存在这样的巴别塔可以让人升天

——不过阿酱必须承认的是,现代IDE集成的图形化调试功能已经很好使了,一般情况下使用命令行工具的场景并不多。

但是也确实存在无法使用图形化IDE的情况,因此对pdb工具略作了解还是很有必要的。毕竟谁也不知道可能被扔给一个什么样的环境啊哈哈

pdb的使用

作为解释型语言,Python调试工具的使用跟gdb毕竟还是有区别的。

比如Python的调试就不需要什么符号表之类的东西,说到底,最终Python虚拟机执行的逻辑也是自带符号的。

也正是由于Python的这种特殊性,所有pdb其实有两种不太一样的使用方式,即侵入式和非侵入式。

其实按字面意思就很容易理解在两种方式的使用。类比一下脑机接口,也分为侵入式和非侵入式。侵入式就表示要将电极、芯片植入大脑皮层,“侵入”人体;而非侵入式则是在头骨外收集脑电波进行分析。

同样地,侵入式pdb调用就是将调用pdb的代码直接写入Python脚本当中;而非侵入式则是从命令行调用pdb,执行相应被调试脚本。

侵入式pdb

使用方式如下代码所示,在代码中途插入一行调用:

import pdb; # pdb.set_trace()      a = "just"b = "do"   pdb.set_trace()   c = ['p', 'y', 't', 'h', 'o', 'n']print(a)

运行脚本,会进入这样一个交互式界面:

D:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)00-GitHubpython-examplesxuanyuanyulong020-11-04-python-pdb>python test_pdb_intrusive.py> d:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)00-githubpython-examplesxuanyuanyulong020-11-04-python-pdbtest_pdb_intrusive.py(21)<module>()-> c = ['p', 'y', 't', 'h', 'o', 'n'](Pdb)

到这里已经启动了pdb,并且打印内容中-> c = ['p', 'y', 't', 'h', 'o', 'n']行首的箭头,表示当前程序执行流到了这一行代码,如果继续执行,将首先执行该行。

非侵入式pdb

非侵入式要xue微简单一些,最大的好处是不需要改动代码。

我们在控制台执行以下命令:

D:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)00-GitHubpython-examplesxuanyuanyulong020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:D:00-GitHubpython-examplesxuanyuanyulong2020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py> d:00-githubpython-examplesxuanyuanyulong2020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)00-githubpython-examplesxuanyuanyulong020-11-04-python-pdbtest_pdb_intrusive.py(1)<module>()-> import pdb; # pdb.set_trace()(Pdb)

可以看到,通过这种方式进入调试,程序执行流停在了程序开头。

通过分析进入调试时代码执行流的位置,我们可以发现,实际上侵入式的插入pdb.set_trace()调用,等价于我们从命令行启动pdb,然后在这个调用的下一行打了一个断点,然后直接运行程序。

简单命令

gdb中有一些常用的简单命令,本节阿酱带大家熟悉一下,后续会做更深入的讨论。

h(elp)

在pdb界面下输入h或help命令,即可列出pdb中支持的各种命令:

(Pdb) h   Documented commands (type help <topic>):========================================EOF    c          d        h         list      q        rv       undisplaya      cl         debug    help      ll        quit     s        untalias  clear      disable  ignore    longlist  r        source   untilargs   commands   display  interact  n         restart  step     upb      condition  down     j         next      return   tbreak   wbreak  cont       enable   jump      p         retval   u        whatisbt     continue   exit     l         pp        run      unalias  where   Miscellaneous help topics:==========================exec  pdb

在pdb后带一个命令作为参数,还可进一步看到相应的使用说明:

(Pdb) h hh(elp)        Without argument, print the list of available commands.        With a command name as argument, print help about that command.        "help pdb" shows the full pdb documentation.        "help exec" gives help on the ! command.

相信我,help其实才是pdb里面最重要的命令。别的什么都可以记不住,但是help一定要记住。在以结果为导向的职场生活中也是一样,遇到问题要及时求助哟~

l(ist)

打印当前文件的源代码。不带参数的话,默认打印当前行前后共计11行代码。继续执行该命令的话,则会继续往后打印最多11行代码,直到遇上文件结束符EOF。

用.作为参数则限定要强一点,只会打印当前行前后11行代码。

(Pdb) l  1  -> import pdb; # pdb.set_trace()  2  3  4     def addStr(a, b):  5         return a + b  6  8         return ''.join(l)  9 10     def getSlogan(a, b, c): 11         result = addStr(a, b) + mergeChar(c)

当指定两个参数时,则打印这个区间内的代码:

(Pdb) l 3, 7  3  4     def addStr(a, b):  5         return a + b  6  7  -> def mergeChar(l: list):

而当第二个参数b比第一个参数a小的时候,则表示“从第a行开始,继续往后打印b行”,也就是总共打印(1+b)行:

(Pdb) l 7, 3  7  -> def mergeChar(l: list):  8         return ''.join(l)  9 10     def getSlogan(a, b, c):

p/pp

打印某个对象的值。区别在于pp调用的是pprint函数,打印更加美观。

(Pdb) p a'just'(Pdb) p addStr<function addStr at 0x000002087B0F9C80>


Tags:gdb   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
写过C语言的同学们想必都很怀念(读者:&iquest;)gdb调试器,使用gdb可以随意在程序运行过程中暂停流程、查看变量。很多时候,我们单纯分析代码流程和日志信息无法定位的问题,都得靠...【详细内容】
2022-07-30  Tags: gdb  点击:(73)  评论:(0)  加入收藏
前言:在程序出现bug的时候,最好的解决办法就是通过 GDB 调试程序,然后找到程序出现问题的地方。比如程序出现 段错误(内存地址不合法)时,就可以通过 GDB 找到程序哪里访问了不合...【详细内容】
2022-04-08  Tags: gdb  点击:(163)  评论:(0)  加入收藏
一、软件包管理器yum1.什么是软件包在Linux下安装软件, 通常的办法是下载程序的源代码、编译、得到可执行程序。但是这样麻烦、不便于操作,于是一些人把常用的软件提前编译好...【详细内容】
2022-04-07  Tags: gdb  点击:(144)  评论:(0)  加入收藏
虽然技术在进步,Linux各发行版本已经更新迭代的很多了,目前Centos、Redhat已经出到8了,Ubuntu已经到21.04了,但我相信一定有很多朋友跟我一样因为各种各样的问题还在使用老久的2...【详细内容】
2021-11-30  Tags: gdb  点击:(551)  评论:(0)  加入收藏
MongoDB作为一款NoSQL数据库,常应用在游戏开发领域。 作为一个后端程序,进行CRUD操作是家常便饭,但如果不看源码,便不会知道MongoDB底层是如何实现的,对自己写的CRUD代码,心里就没...【详细内容】
2020-09-23  Tags: gdb  点击:(274)  评论:(0)  加入收藏
码农需要开花大量时间调试和维护项目代码。代码调试是每个码农的最基础技能之一。大多数人都喜欢IDE给你带来的便利的可视化调试体验,少数人则喜欢GDB式命令行的高效调试,...【详细内容】
2020-07-17  Tags: gdb  点击:(274)  评论:(0)  加入收藏
gdb这个debug工具,应该无人不知吧。服务器开发和客户端开发人员应该都或多或少的通过这个工具排查问题。但有没有想过它的实现原理,为什么打断点能够在断点处停止运行?为什么能...【详细内容】
2019-08-29  Tags: gdb  点击:(413)  评论:(0)  加入收藏
https://typecodes.com/cseries/multilprocessthreadgdb.htmlLinux C/C++开发中gdb进行多进程和多线程的调试一直比较麻烦,在CSDN上看到高科的一篇文章《gdb调试多进程和多线...【详细内容】
2019-08-15  Tags: gdb  点击:(410)  评论:(0)  加入收藏
▌简易百科推荐
嵌入式开发,离不开 C 语言,C语言中有很多语法会直接或间接影响你代码的质量,下面就来讲讲__attribute__ 关键字的用法。1. 什么是 __attribute__GNU C 编译器增加了一个 __attr...【详细内容】
2022-11-03  嵌入式胖胖  今日头条  Tags:嵌入式   点击:(5)  评论:(0)  加入收藏
前两天,有读者私信发我一篇文章,说里面提到的 Intellij IDEA 插件真心不错,基本上可以一站式开发了,希望能分享给更多的小伙伴,我在本地装了体验了一下,觉得确实值得推荐,希望小伙...【详细内容】
2022-11-03  会写代码的猴子  今日头条  Tags:IDEA   点击:(1)  评论:(0)  加入收藏
一、查看 github 热门趋势 查看全类:https://github.com/trending JAVA类:https://github.com/trending/java点击右上角切换,查看每天、每周、每月热点项目。 二、查看 gith...【详细内容】
2022-11-01  JEECG  今日头条  Tags:github   点击:(5)  评论:(0)  加入收藏
作为一个天天都在CRUD的程序员,你有没有想过,数据库是如何工作的?我猜,你曾经无数次的翻开讲数据库的书籍和文章,但总是看着看着就被劝退,太多的专业术语把人头都搞大了。等等,看这...【详细内容】
2022-11-01  小小怪下士的架构攻略    Tags:Github   点击:(6)  评论:(0)  加入收藏
时隔一年多终于又冒泡了,哎,随着工作越来越忙,自己踏实坐下来写点东西真是越来越费劲,这篇文章也是准备了好久好久才打算发表出来(不瞒大家,东西做完好久了,文章憋了一年了,当真“高...【详细内容】
2022-10-31  jicheng0622  电子技术应用  Tags:LittleVgl   点击:(10)  评论:(0)  加入收藏
大家都知道tp5的数据库配置在config/database.php中,如果这个数据库配置正式服的数据,要再配置一个测试服的数据就需要在config中再创建一个database_test.php的配置文件。但...【详细内容】
2022-10-31  莣夢忧醒  今日头条  Tags:数据库   点击:(7)  评论:(0)  加入收藏
本文主要介绍Qt中线程类QThread的用法在这篇文章中,将写一个获取热点新闻的程序,每隔2秒发送一个关键字,从服务器获得与该关键字相关的一条热点新闻。我们的目标是实现以下几个...【详细内容】
2022-10-31  音视频开发老舅    Tags:Qt开发   点击:(7)  评论:(0)  加入收藏
一、分区存储Git分区存储 存储区 描述 工作区 (workspace) 我们的开发代码目录 暂存区 (Index) .git目录下的index文件 ...【详细内容】
2022-10-30  全栈旅行  今日头条  Tags:Git   点击:(6)  评论:(0)  加入收藏
大家好,我是皮皮。一、前言前几天在Python最强王者交流群【WYM】问了一个pandas处理的问题,提问截图如下:原始数据如下图所示:后来还提供了一个小文件。二、实现过程这里【郑煜...【详细内容】
2022-10-25  Python学习交流     Tags:json   点击:(11)  评论:(0)  加入收藏
机器之心报道编辑:杜伟 想要了解自己的 PyTorch 项目在哪些地方分配 GPU 内存以及为什么用完吗?不妨试试这个可视化工具。 近日,PyTorch 核心开发者和 FAIR 研究者 Zachary DeV...【详细内容】
2022-10-24  机器之心Pro   网易号  Tags:PyTorch   点击:(12)  评论:(0)  加入收藏
站内最新
站内热门
站内头条