C++ 并行代码中分段错误的调试

C++ 并行代码中分段错误的调试,c++,debugging,parallel-processing,segmentation-fault,mpi,C++,Debugging,Parallel Processing,Segmentation Fault,Mpi,我使用MPI为特定应用程序开发了一个分布式解算器。我需要执行一项时间研究,针对不同的问题大小和不同数量的处理器运行解算器,以查看解算器在串行解算器上实现的速度 该代码适用于除一个以外的所有问题大小和处理器数量的组合。在这一组合中(32个处理器-最高数量和第二大问题),我遇到了分段错误。请注意,如果我使用不同数量的处理器,则代码适用于此问题大小(它也适用于具有其他问题大小的处理器数量) < >编译C++代码生成的可执行文件名为M75,执行如下: mpirun -n 32 m75

我使用MPI为特定应用程序开发了一个分布式解算器。我需要执行一项时间研究,针对不同的问题大小和不同数量的处理器运行解算器,以查看解算器在串行解算器上实现的速度

该代码适用于除一个以外的所有问题大小和处理器数量的组合。在这一组合中(32个处理器-最高数量和第二大问题),我遇到了分段错误。请注意,如果我使用不同数量的处理器,则代码适用于此问题大小(它也适用于具有其他问题大小的处理器数量)

< >编译C++代码生成的可执行文件名为M75,执行如下:

         mpirun -n 32 m75
以下是输出错误文件:

我不确定我的代码可能有什么问题,因为它适用于所有其他问题实例。如何调试这个?我正在使用slurm作业调度器在集群上运行代码

编辑:

按照建议,我生成了一个内核转储,并尝试使用gdb查看它。我发现分割故障发生在这条线路上:

free(tempr2[temp])

我这样做:

print tempr2[temp]
(double *) 0x31

这是什么意思?如何进行此操作?

最好使用能够调试MPI程序(如DDT或TotalView)的并行调试器。不幸的是,这些通常不是免费的。您的集群有任何文档吗?这里可能会提到一些调试器。或者,您可以将“普通”调试器(如GDB)附加到正在运行的进程,但这可能有点繁琐。并行调试器(如DDT(commercial))非常有用。否则,请使用
-g
构建应用程序,让它生成核心转储,并在事后进行调试。@DanielLangr是否可以将任何内容附加到我的代码中,以简单地告诉我是哪一行导致了分段错误?我不知道是否可以手动调试,因为错误发生在代码开始运行数小时后。@Sanit正如我们所写的,如果系统默认未启用,您可能需要手动调试。如果您使用GCC或Clang编译代码,请在编译时尝试启用AddressSanitizer。当发生segfault时,它将为您提供更有用的调试信息,并使您更容易确定问题的原因。最好使用能够调试MPI程序(如DDT或TotalView)的并行调试器。不幸的是,这些通常不是免费的。您的集群有任何文档吗?这里可能会提到一些调试器。或者,您可以将“普通”调试器(如GDB)附加到正在运行的进程,但这可能有点繁琐。并行调试器(如DDT(commercial))非常有用。否则,请使用
-g
构建应用程序,让它生成核心转储,并在事后进行调试。@DanielLangr是否可以将任何内容附加到我的代码中,以简单地告诉我是哪一行导致了分段错误?我不知道是否可以手动调试,因为错误发生在代码开始运行数小时后。@Sanit正如我们所写的,如果系统默认未启用,您可能需要手动调试。如果您使用GCC或Clang编译代码,请在编译时尝试启用AddressSanitizer。当segfault发生时,它将为您提供更有用的调试信息,并使您更容易确定问题的原因。