2012-07-25 9 views
18

Tengo una aplicación MPI con la que combina las fuentes C y Fortran. Ocasionalmente se cuelga debido a un error relacionado con la memoria, pero estoy teniendo problemas para encontrar el error (está en algún lugar del código de otra persona, que por el momento no estoy muy familiarizado). Todavía no he podido capturarlo con gdb, pero a veces se genera una traza inversa glibc como se muestra a continuación.Convierta una traza inversa libc a un número de línea fuente

El error probablemente esté cerca de "(main_main_ + 0x3bca) [0x804d5ce]", (pero con un error de memoria, sé que puede no ser el caso). Mi pregunta es, ¿alguien sabe cómo convertir + 0x3bca o 0x804d5ce en una línea particular del código?

Cualquier otra sugerencia para rastrear el error también sería apreciada. Estoy bastante familiarizado con los conceptos básicos 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 
<snip> 

Gracias ...

Respuesta

22

Si se encuentra en gdb y tiene símbolos de depuración, es bastante fácil. Use list.

(gdb) list *0x804d5ce 

Esto debe darle la línea de código, y le mostrará la fuente si es capaz de encontrar el archivo de origen.

Sin gdb usted podría tratar de usar addr2line:

$ addr2line -e finite_element 0x804d5ce 
+0

Sí, que lo hizo. Gracias. "0x804d5ce está en main_main (mpi_Main_trian_kernel.f: 374)" línea 374 es: deallocate (cara) Así que no es el error, su justo donde está apareciendo. ¿Alguna sugerencia para rastrearlo? – davepc

+0

@davepc: Su error probablemente sea corrupción de montón. Puedes intentar usar 'valgrind' para identificarlo. – jxh

Cuestiones relacionadas