Debugging 分段故障sigsegv在gdb下停止

Debugging 分段故障sigsegv在gdb下停止,debugging,parallel-processing,gdb,fortran,mpi,Debugging,Parallel Processing,Gdb,Fortran,Mpi,我正在使用并行运行的大型模拟代码。用户编写代码初始化模拟,然后整个程序运行。只有在使用3个以上的处理器时,我才会出现seg故障(SIGSEGV),而在gdb下运行时,它不会发生。我很少使用gdb,或者一般的并行代码。如何调试这样的问题?当使用gdb时,什么样的问题会停止发生 详情: 要使用gdb,我做到了: mpiexec -np 4 xterm -e gdb <PROGRAM> 我得到: Program received signal SIGSEGV: Segmentation

我正在使用并行运行的大型模拟代码。用户编写代码初始化模拟,然后整个程序运行。只有在使用3个以上的处理器时,我才会出现seg故障(
SIGSEGV
),而在gdb下运行时,它不会发生。我很少使用gdb,或者一般的并行代码。如何调试这样的问题?当使用gdb时,什么样的问题会停止发生


详情:

要使用
gdb
,我做到了:

mpiexec -np 4 xterm -e gdb <PROGRAM>
我得到:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x113a1170d
#1  0x113a11c1b
#2  0x113edf5a9
#0  0x11122d70d
#1  0x11122dc1b
#2  0x1116d95a9
#3  0x10d1e9a44
#4  0x10d25c201
#5  0x10d1cb2ea
#6  0x10d1b3df4
#7  0x10d36e1f3
#3  0x10f9d4a44
#4  0x10fa47201
#5  0x10f9b62ea
#6  0x10f99edf4
#7  0x10fb591f3
我使用Makefile的预设“调试”选项编译:

FFLAGS_DEBUG = -ggdb -c -O0 -fdefault-real-8 -fdefault-double-8 \
-pedantic -Wall -Waliasing \
-Wsurprising -Wconversion -Wunderflow \
-ffpe-trap=invalid,zero,overflow -fbounds-check \
-fimplicit-none -fstack-protector-all

尝试在valgrind下跑步吗?@PaulR我没听说过,现在下载。关于如何/从何处开始的任何快速提示?请注意,在使用mpirun时,您需要执行
mpirun-np 4 valgrind…
,尽管最初在没有mpirun的单处理器中执行此操作可能是一个很好的起点。还要注意的是,我通常发现valgrind对Fortran程序的用处远不如C/C++。内存错误的症状(如segfaults)通常对运行环境中的扰动非常敏感,因此在gdb下消除它,虽然令人沮丧,但并不一定令人震惊。在Fortran程序中,根据我的经验,两种最常见的内存错误类型是在数组访问和使用错误数量/类型的参数调用外部例程时超出界限。您已经在使用
-fbounds check
检查数组边界,因此我的下一个建议是非常仔细地调查任何库调用。您可以使用其他编译器吗?我发现使用
ifort
pgi
xlf
lahey
gfortran
测试代码可以突出显示不同的错误。因为不同的编译器会在不同的问题上出错。否则代码有多大?你能缩小范围吗?懒人的
打印
语句有助于让你进入令人不快的日常生活。
FFLAGS_DEBUG = -ggdb -c -O0 -fdefault-real-8 -fdefault-double-8 \
-pedantic -Wall -Waliasing \
-Wsurprising -Wconversion -Wunderflow \
-ffpe-trap=invalid,zero,overflow -fbounds-check \
-fimplicit-none -fstack-protector-all