C++ 尝试将gdb与MPI一起使用时自动加载被拒绝?
我有一个串行工作的程序,但是当我尝试使用openMPI时,我得到了消息C++ 尝试将gdb与MPI一起使用时自动加载被拒绝?,c++,linux,unix,gdb,mpi,C++,Linux,Unix,Gdb,Mpi,我有一个串行工作的程序,但是当我尝试使用openMPI时,我得到了消息 mpirun noticed that the job aborted, but has no info as to the process that caused that situation. 对于串行程序,我通过键入 valgrind --leak-check=yes --tool=memcheck /workspace/MK/cmake/Project/buildagain/bin/Project -PR INP
mpirun noticed that the job aborted, but has no info as to the process that caused that situation.
对于串行程序,我通过键入
valgrind --leak-check=yes --tool=memcheck /workspace/MK/cmake/Project/buildagain/bin/Project -PR INPUT/chain.inp`
因为我通过键入,/runProj.sh type.txt
并按照链接顺序运行程序
要使用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"
....
当我键入“显示自动加载安全路径”时,输出为
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"
或
有人能帮上忙吗?我认为问题在于您试图从xterm中从mpirun中启动gdb,我认为您不能这样做。但是我从来没有在mpi中使用过X。也不是gdb 您可以使用
gdb
将附加到正在运行的进程。因此,使用mpirun正常启动程序,找到进程id并使用gdb
附加到它。如果你这样做了,仍然得到加载错误,编辑问题,我会删除这个答案,也许其他人会帮助你
如果它可以工作,或者由于程序在您可以附加到它之前终止而失败,那么您需要在开始时放置一个暂停循环。通常情况下,处理这种情况的方法是在程序开始时使用一段代码暂停程序,直到您使用调试器并更改了标志。调用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失败或做了一些不正常的事情。如果可以的话,你可以像睡眠功能一样使用屏障。您还可以使用节点id仅在要调试的节点上暂停。我认为问题在于您试图从xterm内从mpirun内启动gdb,我认为您不能这样做。但是我从来没有在mpi中使用过X。也不是gdb
您可以使用gdb
将附加到正在运行的进程。因此,使用mpirun正常启动程序,找到进程id并使用gdb
附加到它。如果你这样做了,仍然得到加载错误,编辑问题,我会删除这个答案,也许其他人会帮助你
如果它可以工作,或者由于程序在您可以附加到它之前终止而失败,那么您需要在开始时放置一个暂停循环。通常情况下,处理这种情况的方法是在程序开始时使用一段代码暂停程序,直到您使用调试器并更改了标志。调用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失败或做了一些不正常的事情。如果可以的话,你可以像睡眠功能一样使用屏障。您还可以使用节点id仅在要调试的节点上暂停。我认为问题在于您试图从xterm内从mpirun内启动gdb,我认为您不能这样做。但是我从来没有在mpi中使用过X。也不是gdb
您可以使用gdb
将附加到正在运行的进程。因此,使用mpirun正常启动程序,找到进程id并使用gdb
附加到它。如果你这样做了,仍然得到加载错误,编辑问题,我会删除这个答案,也许其他人会帮助你
如果它可以工作,或者由于程序在您可以附加到它之前终止而失败,那么您需要在开始时放置一个暂停循环。通常情况下,处理这种情况的方法是在程序开始时使用一段代码暂停程序,直到您使用调试器并更改了标志。调用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失败或做了一些不正常的事情。如果可以的话,你可以像睡眠功能一样使用屏障。您还可以使用节点id仅在要调试的节点上暂停。我认为问题在于您试图从xterm内从mpirun内启动gdb,我认为您不能这样做。但是我从来没有在mpi中使用过X。也不是gdb
您可以使用gdb
将附加到正在运行的进程。因此,使用mpirun正常启动程序,找到进程id并使用gdb
附加到它。如果你这样做了,仍然得到加载错误,编辑问题,我会删除这个答案,也许其他人会帮助你
如果它可以工作,或者由于程序在您可以附加到它之前终止而失败,那么您需要在开始时放置一个暂停循环。通常情况下,处理这种情况的方法是在程序开始时使用一段代码暂停程序,直到您使用调试器并更改了标志。调用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失败或做了一些不正常的事情。如果可以的话,你可以像睡眠功能一样使用屏障。您还可以使用节点id仅在要调试的节点上暂停。从Xterm from mpirun执行GDB是可能的,但您的mpi实现可能会使这一点难以实现
假设您有一个要调试的hello mpi:
$ mpiexec -np 4 xterm -e 'gdb hello-mpi'
有了mpich,我就有了四个运行gdb的XTerm(正如您所想象的,这对于几个进程来说并不太实际)
我刚刚用一个最新的ish 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文件的位置
(顺便说一句,您可能希望在