2012-07-25 11 views
18

Possiedo un'applicazione MPI con la quale si combinano sia sorgenti C che Fortran. A volte si blocca a causa di un bug relativo alla memoria, ma ho difficoltà a trovare il bug (è da qualche parte nel codice di qualcun altro, che al momento non mi è molto familiare). Non sono ancora riuscito a prenderlo con gdb, ma a volte viene mostrato un backtrace di glibc come mostrato di seguito.Convertire un backtrace di libc in un numero di riga di origine

Il bug è probabilmente vicino a "(main_main_ + 0x3bca) [0x804d5ce]", (ma con un errore di memoria, so che potrebbe non essere il caso). La mia domanda è, qualcuno sa come convertire + 0x3bca o 0x804d5ce in una particolare riga del codice?

Qualsiasi altro suggerimento per rintracciare il bug sarebbe anche apprezzato. Sono abbastanza familiare con le basi di 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> 

Grazie ...

risposta

22

Se siete in gdb e si dispone di simboli di debug, è abbastanza facile. Utilizzare list.

(gdb) list *0x804d5ce 

Questo dovrebbe darti la linea di codice e mostrarti la fonte se è in grado di trovare il file sorgente.

Senza gdb si potrebbe tentare di utilizzare addr2line:

$ addr2line -e finite_element 0x804d5ce 
+0

Sì, che lo ha fatto. Grazie. "0x804d5ce è in main_main (mpi_Main_trian_kernel.f: 374)" Linea 374 è: deallocare (Face) modo che non è il bug, il suo solo dove si sta rivelando. Qualche suggerimento su rintracciarlo? – davepc

+0

@davepc: il tuo bug è probabile corruzione dell'heap. Puoi provare a usare 'valgrind' per identificarlo. – jxh