ubuntu环境下mpi多进程程序利用gdb进行调试

ubuntu环境下mpi多进程程序利用gdb进行调试

问题:
在Ubuntu环境下进行多线程调试比较麻烦,商业软件买不起,对于自己的作业而言,也没必要用到,因此,就打算用gdb去调试,有教程介绍在linux下用vscode进行调试,但是,我搞了很长时间都没有实现,一大堆的参数实在是搞不清楚如何搞,因此,直接终端gdb调试,这里,因为没有用到vscode的一个终端,因此,需要xterm虚拟终端模拟器去显示一个终端,这样方便我们软件的调试

调试现场:

ubuntu环境下mpi多进程程序利用gdb进行调试

在本实例中,利用xterm终端模拟器实现多个进程分别调试
xterm是一款虚拟终端模拟器,在ubuntu环境下,可以利用xterm窗口实现针对各个进程的分别调试。
在上图中,就是针对针对进程数为3的程序进行gdb调试。

1.实现打开xterm窗口

  1. 打开终端,输入命令以安装xterm。
    sudo apt install xterm -y

  2. 对于需要gdb调试的程序,在编译时需要加上-g。 比如,需要调试名为test.c 的文件: 编译命令: mpicc -g test.c -o test

  3. 执行命令: mpiexec -n 3 xterm -e gdb ./test -tui
    解释:(1)“3”代表用到3个核,即3个进程
    (2)xterm命令打开虚拟终端
    (3)-e也不知道什么作用,但一定要有
    (4)-tui是实现xterm里面显示源代码功能。在上图中,显示了源代码就是这个命令的作用

    注意:当执行这段命令时,显示的是:
    ubuntu环境下mpi多进程程序利用gdb进行调试
    没有显示源代码,只需要利用鼠标点击每个gdb窗口,按下回车键就可以看到源代码了。
    2.利用xterm虚拟终端进行gdb调试
    现场展示:
    ubuntu环境下mpi多进程程序利用gdb进行调试

xterm打开的是虚拟终端,执行mpiexec时,由于使用到了gdb调试,因此,程序并没有直接运行。
需要在每个窗口都运行命令:
r
其中r就是run的缩写。

当然,有些程序需要读取外部文件。比如,我的程序需要读取GaussA1.txt GaussB1.txt,因此执行命令:
r GaussA1.txt GaussB1.txt
因为是3个进程,需要在每个窗口都输入上述命令,这样就实现了gdb调试。但直接命令会使得程序直接运行完,因此,最好提前设置断点。gdb设置断点的命令是break,比如需要在第30行设置断点,执行命令:
break 30

因此完整的mpi多进程程序调试过程:

  1. 编译: mpicc -g test.c -o test (如果需要用到自己写的头文件,可以这样写:mpicc -g test.c
    MyMPI.c -o test,其中, MyMPI.c是个人写的头文件)
  2. 执行: mpiexec -n 3 xterm -e gdb ./test -tui (3个进程,打开xterm)
    并且在每个窗口按回车键。
  3. break 30 (每个窗口设置断点,具体断点,随意设置)
  4. 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天,查看了很多网站博客,整理成这篇博客,希望能让学弟学妹少走弯路。

上一篇:Python Qt GUI设计:QCalendar日历类和QDateTimeEdit时间类(基础篇—20)


下一篇:重看设计模式的感想