调试死锁程序
分析死锁问题是比较简单的,因为当发生死锁时,进程会僵住,这时我们只需要杀死进程,让系统产生一个 core dump 文件,然后再对这个 core dump 文件进行分析即可。至于如何才能在 Linux 生成 core dump 文件,可以参见这篇文章。
下面的 C++ 程序,有可能出现两个线程都在等待对方释放互斥锁,从而导致死锁:
编译好这个程序,并运行:
查看发生死锁的进程 ID,杀死这个进程,让系统生成它的 core dump 文件:
可以看到,系统生成了core dump 文件,放在了/var/crash
目录下,这样就可以使用 gdb 进行分析:
查看进程有哪些线程正在执行:
可以看到,线程 2 和线程 3 正在等待互斥锁,可以查看线程 2 的信息:
打印线程 2 的堆栈信息,可以看到是哪一行代码正在尝试获取锁:
从上面的输出可以发现,线程 2 在main.cpp
的第 18 行的位置等待互斥锁。