gdb调试知识积累——真·详解

本文介绍了使用GDB进行程序调试的方法,包括通过`infothreads`查看线程信息,使用`sudogdbattach`命令附加到进程进行调试,利用`bt`命令查看调用堆栈以定位程序卡死的原因,以及`thread`命令切换调试线程。这些技巧在解决多线程程序的卡死问题时非常实用。
摘要由CSDN通过智能技术生成

1、info threads

命令功能:查看程序的线程数量及其详细信息

2、sudo gdb attach 进程号

该命令可以调试目标进程号的程序。常用于多线程程序卡死了,但是不知道卡在了哪里。此时,使用该命令进入gdb,然后再使用1、中的命令查看线程信息,就能够分析个大概了。

注意使用这个命令的时机。得是程序已经运行起来了,然后你再用这个命令 突然杀进去调试。其实这都是废话,程序不运行起来哪里来的进程号??(注:使用ps -u命令查看进程号)

第一次见到这个调试方法(指sudo gdb attach 进程号+info threads)是在写微型聊天室项目的时候。当时客户端程序卡死在一个地方,我自己用cout输出打法,试了好长时间,才大致明白问题出在哪了。然后教程上讲了这个方法。其实,本文的1、到4、全都是从这个例子里认识到的。

3、bt

命令功能:列出当前线程的调用堆栈。

什么是线程的调用堆栈?我发现很多博客都写个打印调用堆栈,那啥是调用堆栈,都不解释一下,这和没写有啥区别?

调用堆栈就是把程序里面函数的调用顺序 列成一个表,最后被调用的函数出现在最上方。bt命令就是列出了这样一张表,表的第一列就是当前线程最后调用的函数。

用该命令可以一下就找到程序卡死的位置。

记一篇文章,对bt列出的调用堆栈进行了深入剖析:https://blog.csdn.net/zhg598242449/article/details/7591123

4、thread Id

命令功能:切换想要调试的线程。通常在调试多线程程序时使用。

这里的Id是1、中命令显示的Id并不是系统中真正的线程id,如下图所示:
在这里插入图片描述注意红框中打了 * 的线程,表示该线程是当前正在调试的线程。使用thread 2命令切换线程后,打 * 的线程也变成了Id为2的线程。

(还遇到啥比较好用的命令,再接着补充)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值