Convertir une trace de libc en un numéro de ligne source

J’ai une application MPI qui combine les sources C et Fortran. Parfois, il se bloque à cause d’un bogue lié à la mémoire, mais j’ai du mal à le trouver (c’est quelque part dans le code de quelqu’un d’autre, ce que je ne connais pas très bien pour le moment). Je n’ai pas encore réussi à l’attraper avec gdb, mais parfois, une trace de la glibc est générée comme indiqué ci-dessous.

Le bogue est probablement proche de “(main_main_ + 0x3bca) [0x804d5ce]”, (mais avec une erreur de mémoire, je sais que ce n’est peut-être pas le cas). Ma question est, est-ce que quelqu’un sait comment convertir + 0x3bca ou 0x804d5ce en une ligne particulière du code?

Toute autre suggestion sur la recherche du bogue serait également appréciée. Je connais assez bien les bases de 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  

Je vous remercie…

Si vous êtes dans gdb et que vous avez des symboles de débogage, c’est assez simple. Utilisez la list .

 (gdb) list *0x804d5ce 

Cela devrait vous donner la ligne de code et vous montrer la source si elle est capable de trouver le fichier source.

Sans gdb vous pouvez essayer d’utiliser addr2line :

 $ addr2line -e finite_element 0x804d5ce