如何从mpirun在gnome-terminal中运行gdb?

时间:2019-05-25 07:57:12

标签: bash gdb openmpi gnome-terminal

我有一个使用mpi的程序。要对其进行调试,可以使用mpirun -np 2 xterm -e gdb myprog

但是,xterm在我的机器上有故障。我想尝试gnome-terminal,但是我不知道要输入什么。我尝试过:

1)mpirun -np 2 gnome-terminal -- gdb myprog

2)mpirun -np 2 gnome-terminal -- "gdb myprog"

3)mpirun -np 2 gnome-terminal -- bash -c "gdb myprog"

4)mpirun -np 2 gnome-terminal -- bash -c "gdb myprog; exec bash"

但是这些似乎都不起作用。 1),3),4)在gdb run之后说:

  

MPI_INIT似乎由于某种原因而失败;您的并行过程是   可能会中止。并行进程可以有很多原因   在MPI_INIT期间失败;其中一些是由于配置或环境   问题。此故障似乎是内部故障。这是一些   其他信息(可能仅与开放式MPI有关   开发人员):

     

ompi_mpi_init:ompi_rte_init失败

     

->返回“(null)”(-43)而不是“成功”(0)

     

-------------------------------------------------- --------------------------

     

*** MPI_Init中发生错误

     

***在NULL通信器上

     

*** MPI_ERRORS_ARE_FATAL(此通信器中的进程现在将中止,

     

***甚至可能是您的MPI工作)

     

[oleg-VirtualBox:4169]在MPI_INIT成功完成之前,本地中止,但是无法汇总错误消息,并且不能保证其他所有进程都被杀死!

     

[下级1(进程4169)以代码01退出]

在2)终端中说:

  

为此终端创建子进程时出错

     

无法执行子进程“ gdb应用”(没有此类文件或目录)

顺便说一句,我使用Ubuntu 18.04.02 LTS。

我该怎么办?

编辑:事实证明,不是xterm是越野车,而是带有--tui选项的gdb。如果您的程序打印了某些内容,则无论在哪个终端上,gdb窗口都将开始不正确地显示内容。

1 个答案:

答案 0 :(得分:2)

问题是gnome-terminal将请求的程序移交给终端服务器,然后立即退出。然后,mpirun看到已启动的程序已退出,并破坏了MPI运行时环境。当MPI程序实际启动时,mpirun已经退出。据我所知,没有办法让gnome-terminal等到给定命令结束。

有一个解决方法:与其直接使用mpirun启动gnome-terminal,不如使用两个包装器脚本。第一个由mpirun启动。它创建一个临时文件,告诉gnome-terminal启动第二个包装器脚本,然后等待直到临时文件消失。第二个包装器脚本运行您实际要运行的命令,例如gdb myprog,等待其结束,然后删除临时文件。此时,第一个包装器注意到临时文件消失并退出。然后mpirun可以安全地破坏MPI环境。

从脚本本身可能更容易理解。

debug.sh:

#!/bin/bash
# This is run outside gnome-terminal by mpirun.

# Create a tmp file that we can wait on.
export MY_MPIRUN_TMP_FILE="$(mktemp)"

# Start the gnome-terminal. It will exit immediately.
# Call the wrapper script which removes the tmp file
# after the actual command has ended.
gnome-terminal -- ./helper.sh "$@"

# Wait for the file to disappear.
while [ -f "${MY_MPIRUN_TMP_FILE}" ] ; do
    sleep 1
done

# Now exit, so mpirun can destroy the MPI environment
# and exit itself.

helper.sh

#!/bin/bash
# This is run by gnome-terminal.

# The command you actually want to run.
"$@"

# Remove the tmp file to show that the command has exited.
rm "${MY_MPIRUN_TMP_FILE}"

mpirun debug.sh gdb myproc的身份运行。