前一陣在調試多進程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+線程號