>编辑 我在启动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 - 目前仍未解决(。有人有解决方法吗?
由于您使用的是 lldb 并且您可能也在使用 clang
,您可以使用称为地址清理器的东西来编译您的代码,并检查运行时内存错误。
只需将以下内容添加到编译命令中:-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 方面并没有取得多大成功。无论哪种方式,地址清理器都应该对您有所帮助。