【问题标题】:MPICH mpiexec (MPI) process terminating upon error, unable to debug in lldbMPICH mpiexec (MPI) 进程因错误而终止,无法在 lldb 中调试
【发布时间】:2019-11-26 10:04:52
【问题描述】:

编辑 我在启动 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) 

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

【问题讨论】:

  • 你为什么mpiexec lldb mpirun a.outmpiexec lldb a.out 看起来好多了。当程序崩溃时,它会被调试器捕获,直到调试器退出时 mpiexec 才会注意到。
  • 谢谢@GillesGouaillardet - 这是一个错字,我已修正。我现在有一个不同的问题,我将在上面的编辑中描述。

标签: mpi lldb mpich


【解决方案1】:

由于您使用的是 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 方面并没有取得太大的成功。无论哪种方式,地址清理程序都应该为您提供帮助。

【讨论】:

  • 谢谢 -- 我是 ASAN 的重度用户,虽然这并不能解决我的问题
猜你喜欢
  • 2011-10-24
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
相关资源
最近更新 更多