一、命令行下共终端的调试方法

1. 首先,在用mpi的编译器编译程序的时候,象平常一样,需要加入调试选项 "-g",

2. 其次,运行的时候,可用以下命令:

$ mpirun -gdb -n 3 ./runMpi

就能进入gdb的并行调试环境,如:

0-2: (gdb)

用平常的 gdb 命令,比如说:打印变量的 print 命令时,将会打印所有进程上该变量的值,如:

0-2: (gdb) p local_max

将打印的结果为,

0: $1 = 15060

1: $1 = 18228

2: $1 = 15412

如果只是想打印某个进程上该变量的值,则可以通过 "z rank" 进入到 rank 进程的调试环境,如:

0-2: (gdb) z 0

就进入到了 0 号进程的调试环境了,运行上述打印命令,则显示结果为 0 号进程的:

0: (gdb) p local_max

0: $2 = 15060

而,

0: (gdb) z 2

则就可以进入 2 号进程的调试环境了。那要恢复默认的所有进程公用的调试环境,怎么办呢?

2: (gdb) z                     

输入 z 命令,则就可以恢复到默认的公用调试环境了。

 

二、每个进程单独开启一个终端进行调试

1. 打开 4 个 xterm 终端,分别对应进程 0-3 的调试环境,用户可以分别在进程对应的终端中输入调试命令

$mpirun -np 4 xterm -e gdb ./runMpi


三、gdb调试多个cpp文件

例程源码如下:

//add.h
extern int add(int,int);

//add.c
int add(int a, int b)
{
    int r = a + b;
    return r;
}

//mul.h
extern int mul(int,int);

//mul.c
int mul(int a, int b)
{
    int r = a * b;
    return r;
}

//main.c
#include "add.h"
#include "mul.h"
#include <stdio.h>
int main()
{
    int a,b;
    int r;
    scanf("%d %d",&a,&b);
    r = add(a,b);
    r = mul(a,b);
    return 1;
}

makefile如下:

cal: main.o add.o mul.o
 gcc -g -o cal main.o add.o mul.o
main.o:main.c add.h mul.h
 gcc -g -c main.c
add.o:add.c add.h
 gcc -g -c add.c
mul.o:mul.c mul.h
 gcc -g -c mul.c 

调试步骤

1.gdb cal

2.list
可以看到main.c的代码

3.break 9
在r = add(a,b);处设置断点

4.run
运行后在停止与端点

5.s

6.list
可以看到add.c的代码,说明可以对add.c里面的函数调试了

注意:

1. 对于有命令行的情况

比如:

mpiexec -n 3 ./docclass ./ ./keyword ./result

“./ ./keyword ./result”是该程序的三个参数,如果还按照上面的方法,则会得到如下错误:

vm1:/usr/local/mpich2-1.2.1p1/proinfo # mpiexec -gdb -n 3 ./docclass ./ ./keyword ./result
0-2:  mpdgdbdrv (? 64): when using gdb, pass cmd-line args to user pgms via the 'run' cmd
只能采用如下方式:

vm1:/usr/local/mpich2-1.2.1p1/proinfo # mpiexec -gdb -n 3 ./docclass 

  <==不输参数
0-2:  (gdb) run ./ ./keyword ./result   <==输入参数
0-2:  Continuing.

参考:

http://hi.baidu.com/royee193/blog/item/2252671aab337d5f42a9ad79.html

http://blog.csdn.net/allowmego/article/details/1524839

转自:http://blog.sina.com.cn/s/blog_50d4c97b01011fkl.html