我正在Linux机器上开发一个MPI程序,我没有sudo / su访问权限。由于我的程序目前是段错误的,我想通过gdb检查核心转储。不幸的是,由于程序是多线程的,所有线程都写入一个核心转储。所以我希望能够将PID附加到每个进程的每个单独的核心转储中。
我知道有一种方法可以通过/ proc / sys / kernel / core_pattern来实现,但我无权写入此内容。
感谢您的帮助。
答案 0 :(得分:1)
在没有root访问权限的情况下,在以这种方式配置的系统上调试MPI应用程序会很麻烦。解决此问题的一个选择是使用Valgrind来获取segfault的堆栈跟踪。只有当您的应用程序在通过Valgrind减速的合理时间内失败时才会有用,并且在这种情况下它仍然会出现段错误。
我通常在Valgrind下运行MPI应用程序,如下所示:
% mpiexec -n 5 valgrind -q /path/to/my_app
这会将所有Valgrind输出发送到标准错误。但是,如果我希望将输出分成不同的文件,那么你可以获得更多的爱好者:
% mpiexec -n 5 valgrind -q --log-file='vg_out.%q{PMI_RANK}' /path/to/my_app
这是MPICH2的设置。我认为对于Open MPI,您需要将PMI_RANK
替换为OMPI_MCA_ns_nds_vpid
,但如果这对您不起作用,那么您需要在讨论列表中与Open MPI开发人员联系。在任何一种情况下,这将产生N个文件,其中N是MPI_COMM_WORLD
的大小,每个文件名为vg_out.0
,vg_out.1
,...,到vg_out.$(($N-1))
,每个对应于MPI_COMM_WORLD
中的排名。