attach是gdb一种重要的debug模式,在mpi程序debug中发挥重要的作用。
具体的执行步骤如下:
1) 首先在程序开始的地方添加如下代码, 注意这是个死循环,之所以用死循环就是让他一直在等待attch
{ int i = 0; char hostname[256]; gethostname(hostname, sizeof(hostname)); printf("pid %d on %s ready for attach\n", getpid(), hostname); fflush(stdout); while (0 == i) sleep(5); }
启动程序会得到如下语句
pid 15425 on xxx ready for attach
pid 15426 on xxx ready for attach
2) 启动gdb
$gdb
(gdb) attach 15425
(gdb) up // 这里的up非常重要,见misc
(gdb) set var i=1
这样跳出死循环,继续执行。
3) misc
关于gdb的使用
过去我们总觉得gdb很难用,很多debug信息都没有能显示出来,尤其是在多线程的情况下,我在使用gdb attach mpi 程序的时候找到了其中的原因,因为gdb总是不停的在尝试暂停程序抓取stack中的内容到frame,如果遇到sleep之类的情况,gdb就获取不到任何信息,在这样的情况下我们需要使用up down来切换frame。