Преобразовать backtrace libc в номер строки источника

У меня есть приложение MPI, в котором сочетаются как источники C, так и Fortran. Иногда он падает из-за ошибки памяти, но мне трудно найти ошибку (она находится где-то в чьем-то коде, который в настоящий момент я не очень хорошо разбираюсь). Мне еще не удалось поймать его с помощью gdb, но иногда выводится glibc backtrace, как показано ниже.

Вероятно, ошибка близка к «(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  

Спасибо…

Если вы находитесь в gdb и у вас есть отладочные символы, это довольно просто. Использовать list .

 (gdb) list *0x804d5ce 

Это должно дать вам строку кода и показать вам источник, если он может найти исходный файл.

Без gdb вы можете попробовать использовать addr2line :

 $ addr2line -e finite_element 0x804d5ce