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的线程。
(还遇到啥比较好用的命令,再接着补充)