2009-10-18 20 views
10

en Linux y Mac OS X Puedo usar stepi y nexti para depurar una aplicación sin información de depuración.Depuración de bibliotecas desmontadas con gdb

En Mac OS X gdb muestra las funciones que se llaman dentro de la biblioteca, aunque a veces avanzan varias instrucciones de ensamblador en cada instrucción stepi.

En Linux, cuando entro en una biblioteca dinámica, gdb se pierde. Por ejemplo, con puts() hay tres instrucciones de ensamblador dentro de puts(), una vez que gdb alcanza el salto en 0x080482bf, falla con el mensaje "No function contains program counter for selected frame".

0x080482ba in [email protected]() 
(gdb) disassemble 
Dump of assembler code for function [email protected]: 
0x080482b4 <[email protected]+0>:  jmp *0x8049580 
0x080482ba <[email protected]+6>:  push $0x10 
0x080482bf <[email protected]+11>:  jmp 0x8048284 <_init+48> 
End of assembler dump. 
(gdb) stepi 
0x080482bf in [email protected]() 
(gdb) stepi 
0x08048284 in ??() 
(gdb) disassemble 
No function contains program counter for selected frame. 

¿Sabes cómo depurar estas llamadas a la biblioteca con gdb.

+0

¿Qué versión de gdb? –

+0

Además, ¿qué ocurre cuando utilizas stepi en Linux? Usted dice que no puede seguir las instrucciones en absoluto, pero no describe lo que realmente sucede. ¿Puedes publicar una sesión de muestra? –

+0

Gracias, estoy usando Slackware 13.0 con su gdb 6.8 preinstalado. He aclarado lo que sucede. – Freeman

Respuesta

12

Si GDB no tiene símbolos de depuración para la función que está tratando de depurar, GDB no podrá determinar el rango de direcciones de memoria para desmontar. Para solucionar esto, puede pasar el rango al comando disassemble. Por ejemplo:

(gdb) p $pc 
$4 = (void (*)()) 0x70c72d <_IO_puts+29> 
(gdb) disassemble 0x70c72d 0x70c740 
Dump of assembler code from 0x70c72d to 0x70c740: 
0x0070c72d <_IO_puts+29>: mov %eax,(%esp) 
0x0070c730 <_IO_puts+32>: call 0x721f10 <strlen> 
0x0070c735 <_IO_puts+37>: mov 0x84c(%ebx),%edx 
0x0070c73b <_IO_puts+43>: cmpw $0x0,(%edx) 
0x0070c73f <_IO_puts+47>: mov %edx,-0x10(%ebp) 
End of assembler dump. 

Puede haber una manera de instalar símbolos de depuración. En mi sistema Ubuntu, instalé el paquete libc6-dbg, que me permite ingresar a funciones en la biblioteca estándar.

+3

GNU gdb (GDB) 7.4.1-debian. La sintaxis correcta ahora es 'disassemble 0x70c72d, 0x70c740'. Eso es allí tiene que haber coma. – golem

Cuestiones relacionadas