前一阵在调试多进程mpi死锁的bug,多进程程序只靠输出来定位bug是一件相当麻烦的事=.=!,后来发现可以用gdb attach来调试多进程程序。
原来一直用gdb调试单进程的程序,感觉打开了新世界的大门哈哈哈。
下面介绍如果用gdb attach调试正在运行的程序,用法如下。
第一步:运行多进程程序。
首先正常运行多进程程序。在发生mpi死锁之后,不要停掉程序!!
第二步:获得运行程序的所有pid。
开启另一个窗口,输入ps -aux | grep 可执行文件名,此时屏幕上会打印出运行程序的信息。
例:运行两个进程的程序,会出现如下3条信息,可以分为两类,一类是运行程序的信息,另一类是grep搜索进程的信息。可以通过最后一列来区分。
下面3条信息中最后一列为运行命令的为前两条命令是我们需要关注的命令。
进程的pid在第二列,此时两个进程的pid分别为209947 和209959。
$ ps aux | grep test
z 209947 0.1 0.0 431664 5552 pts/91 Sl+ 16:52 0:00 运行命令
z 209959 0.0 0.0 92984 596 pts/91 S+ 16:52 0:00 运行命令
z 211971 0.0 0.0 109584 956 pts/92 S+ 16:53 0:00 grep test
第三步:查看每个进程的运行情况。
此时,运行几个程序就需要打开几个窗口,每个窗口对应一个进程。
每个窗口输入 gdb attach pid
例:运行两个进程的程序需要开两个窗口,
分别输入
gdb attach 209947
gdb attach 209959
第四步:查看进程卡住的位置
输入bt,查看线程栈,可以通过up和down在栈里上下切换。
就能看到当前程序卡在哪行代码了!
小工具:
查看进程号:info inferiors
查看线程信息:info threads
切换线程:thread+线程号
来源:https://www.cnblogs.com/huoguonaicha/p/12332260.html