ubuntu环境下mpi多进程程序利用gdb进行调试
问题: 在Ubuntu环境下进行多线程调试比较麻烦,商业软件买不起,对于自己的作业而言,也没必要用到,因此,就打算用gdb去调试,有教程介绍在linux下用vscode进行调试,但是,我搞了很长时间都没有实现,一大堆的参数实在是搞不清楚如何搞,因此,直接终端gdb调试,这里,因为没有用到vscode的一个终端,因此,需要xterm虚拟终端模拟器去显示一个终端,这样方便我们软件的调试
调试现场:
在本实例中,利用xterm终端模拟器实现多个进程的分别调试。 xterm是一款虚拟终端模拟器,在ubuntu环境下,可以利用xterm窗口实现针对各个进程的分别调试。 在上图中,就是针对针对进程数为3的程序进行gdb调试。
1.实现打开xterm窗口
-
打开终端,输入命令以安装xterm。 sudo apt install xterm -y -
对于需要gdb调试的程序,在编译时需要加上-g。 比如,需要调试名为test.c 的文件: 编译命令: mpicc -g test.c -o test -
执行命令: mpiexec -n 3 xterm -e gdb ./test -tui 解释:(1)“3”代表用到3个核,即3个进程 (2)xterm命令打开虚拟终端 (3)-e也不知道什么作用,但一定要有 (4)-tui是实现xterm里面显示源代码功能。在上图中,显示了源代码就是这个命令的作用 注意:当执行这段命令时,显示的是: 没有显示源代码,只需要利用鼠标点击每个gdb窗口,按下回车键就可以看到源代码了。 2.利用xterm虚拟终端进行gdb调试 现场展示:
xterm打开的是虚拟终端,执行mpiexec时,由于使用到了gdb调试,因此,程序并没有直接运行。 需要在每个窗口都运行命令: r 其中r就是run的缩写。
当然,有些程序需要读取外部文件。比如,我的程序需要读取GaussA1.txt GaussB1.txt,因此执行命令: r GaussA1.txt GaussB1.txt 因为是3个进程,需要在每个窗口都输入上述命令,这样就实现了gdb调试。但直接命令会使得程序直接运行完,因此,最好提前设置断点。gdb设置断点的命令是break,比如需要在第30行设置断点,执行命令: break 30
因此完整的mpi多进程程序调试过程:
- 编译: mpicc -g test.c -o test (如果需要用到自己写的头文件,可以这样写:mpicc -g test.c
MyMPI.c -o test,其中, MyMPI.c是个人写的头文件) - 执行: mpiexec -n 3 xterm -e gdb ./test -tui (3个进程,打开xterm)
并且在每个窗口按回车键。 - break 30 (每个窗口设置断点,具体断点,随意设置)
- r GaussA1.txt GaussB1.txt (每个窗口打开文件GaussA1.txt和GaussB1.txt并且运行)
*接下来的运行,就是按照gdb的基本操作操作了,不过需要注意的是,对于调试mpi程序,会有一些代码比如MPI_Init(&argc,&argv), MPI_Bcast(tmp+i , m-i+1 , mpitype,root, MPI_COMM_WORLD)是会阻塞,因此,需要每个进程都执行到这些步骤,全部进程才能继续下去。*但若没执行到涉及到全部进程参与的代码时,各个进程是可以分别调试的,这样就很方便。 附加:xterm终端的设置: 初始的xterm的窗口不适合看,因此,可以自己修改xterm。 gedit ~/.Xresources 然后可以将内部改为: 代码 保存。 gedit ~/.Xdefaults 同样改为上述代码。
最后,执行命令 xrdb -merge ~/.Xresources xrdb -merge ~/.Xdefaults 这样,有点样子的xterm就设置好了。
心得: 自己也是在这学期选修课上第一次接触多线程编程,linux除了上学期学到的树莓派写了个简单的程序后就再也没接触过linux了,更何况多线程mpi。因此,光是调试方法就找了2天,查看了很多网站博客,整理成这篇博客,希望能让学弟学妹少走弯路。
|