多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 何为GDB 百度百科给出的定义:UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。 ## 使用GDB调试死锁 gdb调试多线程,定位死锁的位置 以我最近调试的程序liveDetect为例子。 ### **gdb基本用法** ``` $ sudo gdb 【进程名】 【进程号】 >info threads(show all thread) >thread thread number (switch ) >thread apply all break demo.cpp:42(all) ``` 定位流程 ``` ps -ef|grep liveDetect 查看进程的pid sudo gdb liveDetect 1905 利用gdb attach进入线程死锁的进程 info threads 查看所有线程信息 thread 4 切换到某一个线程 bt 查看当前线程信息 定位到该线程死锁的地方 ``` ### **查看进程的pid** ``` ps -ef|grep liveDetect ``` ![](https://files.catbox.moe/08r7bi.png) ### attach进程 使用 gdb 【进程名】 【进程号】(推荐) ``` $ sudo gdb liveDetect 1905 ``` 或者 先进入gdb,然后再attaach [进程号] ``` $ sudo gdb > attach 1905 > bt 【thread apply all bt】 ``` ### 查看所有线程 ``` > info thread ``` ![](https://files.catbox.moe/6sfm30.png) ### 切换线程 `thread 【线程号】` ``` > thread 4 ``` ### 查看当前线程的堆栈 ``` > bt ``` 查看第2个堆栈即可看到线程死锁的地方 ![](https://files.catbox.moe/9edq8n.png)