您的位置:首页 > 其它

gdb调试mpi程序

2016-04-15 10:51 309 查看
一、命令行下共终端的调试方法1. 首先,在用mpi的编译器编译程序的时候,象平常一样,需要加入调试选项 "-g",2. 其次,运行的时候,可用以下命令:$ mpirun -gdb -n 3 ./runMpi就能进入gdb的并行调试环境,如:0-2: (gdb)用平常的 gdb 命令,比如说:打印变量的 print 命令时,将会打印所有进程上该变量的值,如:0-2: (gdb) p local_max将打印的结果为,0: $1 = 150601: $1 = 182282: $1 = 15412如果只是想打印某个进程上该变量的值,则可以通过 "z rank" 进入到 rank 进程的调试环境,如:0-2: (gdb) z 0就进入到了 0 号进程的调试环境了,运行上述打印命令,则显示结果为 0 号进程的:0: (gdb) p local_max0: $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 cal2.list
可以看到main.c的代码3.break 9
在r = add(a,b);处设置断点4.run
运行后在停止与端点5.s6.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.htmlhttp://blog.csdn.net/allowmego/article/details/1524839转自:http://blog.sina.com.cn/s/blog_50d4c97b01011fkl.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: