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
三、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
相关文章推荐
- swift 监听网络状态
- 文章标题
- nmap#4有趣功能
- Oracle:查看对象有没有被其他对象引用语句
- 支付宝 iOS SDK 官方下载页面
- Android Studio 运行出现 Multiple dex files define Landroid/support/annotation/AnimRes;解决方法
- 隐藏状态栏
- win7安装mysql后,重装系统后,mysql启动
- codevs 3731寻找道路 反向建边+不能走
- Android开源图表库 MPAndroidChart
- 简单的使用MediaPlayer
- [转]VS2010中如何创建一个WCF
- windows 虚拟机中的Ubuntu 系统下配置ndk环境
- 评论博客
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 683: illegal multibyte sequence
- SSM框架整合
- Java 阻塞
- 快速排序
- SQL语句性能优化
- 添加删除