【问题标题】:Auto-loading declined when trying to use gdb with MPI?尝试将 gdb 与 MPI 一起使用时自动加载被拒绝?
【发布时间】:2015-07-21 08:25:38
【问题描述】:

我有一个可以串行运行的程序,但是当我尝试使用 openMPI 时,我收到了消息

 mpirun noticed that the job aborted, but has no info as to the process that caused that situation.

对于串行程序,我通过键入

来运行 valgrind
valgrind --leak-check=yes --tool=memcheck /workspace/MK/cmake/Project/buildagain/bin/Project -PR INPUT/chain.inp`

由于我通过键入./runProj.sh type.txt 并点击链接http://www.open-mpi.org/faq/?category=debugging#memchecker_run 连续运行程序 为了用 valgrind 运行 MPI,我输入了

mpirun -np 4 valgrind  /workspace/MK/cmake/Project/buildagain/bin/Project -PR INPUT/chain.inp

但是,输出很短,所以我看不到问题出在哪里

所以我尝试将 gdb 与 MPI 一起使用。我输入了

 mpirun -np 2 xterm -e gdb ../cmake/Project/buildagain/bin/Project

我得到以下输出

 [Thread debugging using libthread_db enabled]
  warning: File "opt/apps/ossw/applications/gcc/gcc-4.7/sl6/lib63/libstdc++.so.6.0.17-gdb.py" auto-loading has been declined by your 'auto-load safe-path' set to ...
To enable execution of this file add ...
line to your configuration file "h1/MK/.gdbinit"
 ....

当我输入 show auto-load safe-path 时,输出是

 List of directories from which it is safe to auto-load files is usr/share/gdb/auto-load:/usr/lib/debug:/usr/bin/mono-gdb.py

当我输入下面的内容时,我会得到与以前相同的输出:

 run -PR INP/Chain.inp -iex "set auto-load safe-path /usr/share/gdb/auto-load"

 run -PR INP/Chain.inp -iex "set auto-load safe-path /opt/apps/ossw/applications/gcc/gcc-4.7/sl6/lib63/libstdc++.so.6.0.17-gdb.py"

有人可以帮忙吗?

【问题讨论】:

    标签: c++ linux unix gdb mpi


    【解决方案1】:

    来自 mpirun 的 Xterm 的 GDB 是可能的,但是您的 mpi 实现可能会使这更难实现。

    假设你有一个要调试的 hello-mpi:

    $ mpiexec -np 4 xterm -e 'gdb hello-mpi'
    

    使用 mpich,这将使我有四个 xterms 都在运行 gdb(正如您可以想象的那样,对于多个进程来说,这并不是非常实用。

    我刚刚使用最近的 OpenMPI 进行了尝试,得到了相同的结果。

    但这不是你的问题,因为你已经尝试过了。您的问题是您的库位于 GDB 不希望看到的地方。以下是我更新自动加载安全路径的方法:

    在 ~/.gdbinit 的顶部有几行:

    add-auto-load-safe-path /home/robl/work/mpich/code_toybox
    add-auto-load-safe-path /home/robl/work/build/mpich/src/mpi/romio/test
    ...
    

    这会创建一个 GDB 期望找到 .gdbinit 文件的位置的白名单

    (顺便说一句,您可能也想在其中设置“设置断点挂起”)

    【讨论】:

      【解决方案2】:

      我认为问题在于您试图从 mpirun 内的 xterm 内启动 gdb,我会说您不能这样做。但我从未将 X 与 mpi 一起使用。也不是 gdb 。

      您可以使用gdbattach 来运行进程。因此,使用 mpirun 正常启动您的程序,找到进程 ID 并使用gdb <progname> <pid> 附加到它。如果您这样做并且仍然出现加载错误,请编辑问题,我将删除此答案,也许其他人会提供帮助。

      如果它可以工作,或者因为程序在您附加到它之前终止而失败,您需要在开始处放置一个暂停循环。通常处理这个问题的方法是在程序开始时暂停程序,直到您使用调试器并更改标志为止。调用pause 并以这种方式定义该函数:

      pause() { 
       int pause;
       struct timeval tv = {1,500000}; /* 1.5 seconds */
       while (pause==1) { select(0,NULL,NULL,NULL,&tv); }` 
      }
      

      你也可以做一个 MPI-BARRIER,但问题可能是 MPI_INIT 失败或做一些奇怪的事情。如果没问题,你可以像睡眠功能一样使用屏障。您也可以使用 node-id 仅在要调试的节点上暂停。

      【讨论】:

      • 对于示例 helloworld 程序,我可以使用您的 pause 方法暂停。但是,我没有看到我的实际程序暂停。您还有其他方法可以推荐吗?
      • 睁大眼睛 我想我得看看你的代码的示例部分。 6 年多来,我没有对 MPI 做过任何事情。所以也许事情发生了变化,他们已经将 init 推入了 _main(调用 main)或一些深奥的东西。
      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2022-01-25
      • 2015-03-09
      • 2020-10-28
      • 2021-12-23
      相关资源
      最近更新 更多