【问题标题】:How to set core dump naming scheme without su/sudo?如何在没有 su/sudo 的情况下设置核心转储命名方案?
【发布时间】:2011-04-11 11:17:23
【问题描述】:

我在没有 sudo/su 访问权限的 Linux 机器上开发 MPI 程序。由于我的程序当前存在段错误,我想通过 gdb 检查核心转储。不幸的是,由于程序是多线程的,所有线程都写入一个核心转储。所以我希望能够将 PID 附加到每个进程的每个单独的核心转储中。

我知道有一种方法可以通过 /proc/sys/kernel/core_pattern 来实现,但是我无权写入。

感谢您的帮助。

【问题讨论】:

  • 多线程与您的问题无关(GDB 可以很好地处理包含多个线程的核心文件)。你的问题是你有多进程程序。我不明白为什么一个“核心”对你来说是不够的——大概你的其他进程也会以同样的方式崩溃。即使他们不这样做,您也应该先解决第一个问题(在第一个核心中发现),然后再继续解决下一个问题。
  • @Employed Russian:一个进程遇到段错误并不意味着任何其他进程也会出现段错误。
  • @semiuseless 确实如此,但即使他们不这样做,您也应该解决您看到的第一个问题无论如何。因此,一个核心转储就足以让您修复一些问题!

标签: multithreading gdb mpi coredump


【解决方案1】:

当您没有 root 访问权限时,在以这种方式配置的系统上调试 MPI 应用程序可能会很痛苦。解决此问题的一种方法是使用Valgrind 获取段错误的堆栈跟踪。仅当您的应用程序在通过 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.0vg_out.1、...、到 vg_out.$(($N-1)),每个文件对应于 MPI_COMM_WORLD 中的一个等级。

【讨论】:

  • 对于 OpenMPI,要使用的变量是 OMPI_COMM_WORLD_RANK,对于 Cray 系统,要使用的变量是 ALPS_APP_PE。另请注意,PMI_RANK 也适用于英特尔 MPI(基于 MPICH)
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多