Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试将gdb与MPI一起使用时自动加载被拒绝?_C++_Linux_Unix_Gdb_Mpi - Fatal编程技术网

C++ 尝试将gdb与MPI一起使用时自动加载被拒绝?

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

我有一个串行工作的程序,但是当我尝试使用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 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文件的位置

(顺便说一句,您可能希望在