MPICH mpiexec(MPI)进程因错误而终止,无法在lldb中调试

时间:2019-07-17 14:19:53

标签: mpi lldb mpich

编辑 我在启动lldb的命令中遇到了错字(请参见下面的评论),我正在更新帖子以解决另一个更大的问题

我正在尝试在lldb中调试我的MPI应用程序,并且出现错误(例如segv或中止)。这是我调用我的mpi运行的方式:

/usr/local/bin/mpiexec -np 3 -disable-auto-cleanup xterm -e "lldb -s lldb.commands --  app_binary <args> ; sleep 100

立即开始运行时,出现此错误跟踪。我认为最相关的行是PMI_Get_appnum returned -1

[cli_0]: write_line error; fd=8 buf=:cmd=init pmi_version=1 pmi_subversion=1
:
system msg for write_line failure : Bad file descriptor
[cli_0]: Unable to write to PMI_fd
[cli_0]: write_line error; fd=8 buf=:cmd=get_appnum
:
system msg for write_line failure : Bad file descriptor
Fatal error in MPI_Init_thread: Other MPI error, error stack:
MPIR_Init_thread(565): 
MPID_Init(175).......: channel initialization failed
MPID_Init(463).......: PMI_Get_appnum returned -1
[cli_0]: write_line error; fd=8 buf=:cmd=abort exitcode=1094415
:
system msg for write_line failure : Bad file descriptor
Process 19063 exited with status = 15 (0x0000000f) 

不幸的是,一些邮件列表显示这是OSICH上的MPICH的一般错误(请参见https://github.com/pmodels/mpich/issues/2063-目前仍未解决)。有人有解决方法吗?

1 个答案:

答案 0 :(得分:0)

由于您使用的是lldb,而且可能还使用了clang,因此可以使用称为address sanitizer的东西通过运行时检查内存错误来编译代码。

只需将以下内容添加到您的编译命令中:-g -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address。看起来像

mpicc object.o -o exec -g -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address

使用地址清理器时,您的代码将打印一条小的堆栈跟踪记录,以指示您移出索引或不属于自己的地址存储器的时间。

如果将地址清理器与lldb结合使用,则它应该在发生内存问题的行停止执行。虽然,我无法同时运行lldb和MPI并没有取得太大的成功。无论哪种方式,地址清理器都可以为您提供帮助。