将libc回溯转换为源代码行号

22

我有一个MPI应用程序,其中结合了C和Fortran源代码。偶尔会由于与内存相关的错误而崩溃,但我很难找到这个错误(它位于别人的代码中,在目前我不是很熟悉)。我尚未能够用gdb捕捉它,但有时会输出类似下面的glibc回溯。

错误可能接近于“(main_main_+0x3bca)[0x804d5ce]”(但由于内存错误,我知道这可能并非完全正确)。我的问题是,是否有人知道如何将+0x3bca或0x804d5ce转换为代码的特定行?

任何其他关于追踪错误的建议也将不胜感激。我对gdb的基础知识相当熟悉。

*** glibc detected *** /home/.../src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42]
/lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525]
/home/.../src/finite_element(main_main_+0x3bca)[0x804d5ce]
/home/.../src/finite_element[0x804e195]
/home/.../src/finite_element(main+0x34)[0x804e1e8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3]
/home/davepc/finite-element/src/finite_element[0x8049971]
======= Memory map: ========
08048000-08056000 r-xp 00000000 08:05 1346306    /home/.../src/finite_element
08056000-08057000 r--p 0000d000 08:05 1346306    /home/.../src/finite_element
08057000-08058000 rw-p 0000e000 08:05 1346306    /home/.../src/finite_element
09d1b000-09d8f000 rw-p 00000000 00:00 0          [heap]
b2999000-b699b000 rw-s 00000000 08:03 15855      /tmp/openmpi-sessions-_0/37612/1/shared_mem_pool.babel
b699b000-b6b1d000 rw-p 00000000 00:00 0 
b6b31000-b6b3d000 r-xp 00000000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3d000-b6b3e000 r--p 0000b000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3e000-b6b3f000 rw-p 0000c000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
<snip>

感谢您...

1个回答

24

如果你在使用gdb并且有调试符号,那么这很容易。使用list命令。

(gdb) list *0x804d5ce
这将为您提供代码行,并在能找到源文件的情况下显示源代码。
如果没有使用gdb,您可以尝试使用addr2line:
$ addr2line -e finite_element 0x804d5ce

是的,就是这样了。谢谢。"0x804d5ce 在 main_main (mpi_Main_trian_kernel.f:374) 中"第 374 行是: deallocate(Face) 所以那不是错误,只是它现在被显示出来了。您有什么追踪错误的建议吗? - davepc
1
@davepc:你的错误很可能是堆栈损坏。你可以尝试使用 valgrind 来识别它。 - jxh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接