网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月30日漏签0天
c语言吧 关注:801,363贴子:4,372,317
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 9回复贴,共1页
<<返回c语言吧
>0< 加载中...

# [原创] 我对于gdb调试工具的理解

  • 只看楼主
  • 收藏

  • 回复
  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
程序的调试是一个很复杂的论题。一些人喜欢使用printf,一些人喜欢使用打日志,一些人喜欢使用调试器。
这其实是要看场合的。我的看法是,简单的程序除错就用printf就行了!
而打日志和使用调试器不是竞争关系,你可以既打日志也使用调试器!
目前看起来很多人不喜欢用调试器,而是打日志,
他们认为调试器手动一行一行运行太慢了,又或者是调试器使用太麻烦了。
在我看来其实调试器的功能是很强的!因为使用调试器可以打印几乎所有变量,甚至是打印寄存器,打印栈调用,甚至是查看对应的汇编代码!并且你可以在运行的时候直接打印变量,
而不是先运行一遍,然后发现想看看另一个变量,然后在写上另外一条Log语句,再编译运行。
如果你写的程序比较复杂,变量很多,那么调试器是很重要的!
这一点在我之前用c++写红黑树的时候,感受颇深。要么你的代码要么全都是Log了,
要么有很多变量你没办法跟踪!想想看你的树在旋转的时候要打印多少东西。


  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在linux平台开发,我的调试器就是GDB,而不是图形界面的调试器。
我能理解IDE会附带调试器功能,比如vs studio看起来很强。
但我讨厌大部分编辑器的调试功能,比如vscode,
我发现大部分编辑器试图把GDB集成到编辑器当中,可是大部分都因为复杂,
要安装各种插件,进行大量的配置,以至于使用者过于痛苦,horrble!
并且因为过度封装导致缺少了调试的灵魂。
我的建议是如果你使用IDE就用自带的调试器,如果你使用编辑器,那么gdb命令行就可以了!


2025-11-30 17:21:36
广告
不感兴趣
开通SVIP免广告
  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如何使用gdb调试器,网上都已经有很多教程了,
但是他们的用法看起来就像是原始人一样。
我的使用方法核心 是在你的开始gdb xxx的时候准备一个gdbinit文件。
通过gdb -x gdbinit xxx来调试命令。
这是因为gdb调试是不记忆断点的,不像图形界面的调试器。
-x 选项可以在调试前先执行后面的文件,在这个文件里设置断点!


  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
gdb打开程序后程序还没运行,可以使用run命令运行,注意这里是可以加参数的,
比如你的程序可以接收命令行参数 a b c你可以使用run a b c 。
这样配置才简单,而不是写什么启动json!
在这里你甚至可以使用命令的重定向命令将程序日志输出到log文件中。
写在gdbinit是最方便的!不要每次打开gdb都要输一大堆!
gdbinit文件可以写任何调试命令。


  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果一切顺利,那么你的程序会运行到断点,这里有一个误区,
我们的gdb是有图形的,使用tui enable,可以打开tui,
或者使用 Ctrl-X A,切换 tui 是开启还是关闭,


  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一般使用者无脑按n就可以一步步执行了,如果这样太慢了,按c来直接到达下一个断点。
使用p xxx 来查看变量。
这个的p代表print,它很牛的!你可 p a 查看a的值,如果a是个类的指针,
那么你可以p a->xxx来查看成员, 并且可以 print *a,来打印a对象所有字段!
还有一个常用功能是bt (backtrace),可以打印当前的函数调用栈。
甚至是你的程序已经崩溃了,你也可以用这个命令
如果你的代码奔溃了,比如因为引用空指针,可以用bt命令
来查看哪里出错了,而不是看着segment fault毫无头绪!


  • c是世界最好的语言
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上文有一个细节,我在run 命令的时候将程序输出定向到了一个stdout.log文件中,
因为我不喜欢gdb在它内部打印程序的输出!ugly!
我可以使用linux的tail命令来监控这个stdout.log来监控程序的输出,为此我的tmux命令行窗口管理工具可以帮大忙,我在左边运行gdb,右边用tail命令查看程序输出,这才是我想要的调试效果,强力推荐tmux,点赞!


  • 送给小女孩的
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好文,爱了!


2025-11-30 17:15:36
广告
不感兴趣
开通SVIP免广告
  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很多时候打log不是因为不会用调试器,而是因为用不了,程序跑在k8s容器里面,连gdb都没有


  • Dawn
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你要理解流程而不是纯打log,二分法查关键位置


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示