2010-01-29 9 views
5

¿Se puede utilizar GDB como si fuera un monitor de ensamblaje tradicional?¿Cómo usar gdb como monitor?

Tan pronto como entre en, por ejemplo. código de la biblioteca que devuelve:

No function contains program counter for selected frame 

GDB el depurador es capaz de entrar en código desconocido pero GDB la interfaz de usuario deja de funcionar.

En este question relacionado puede encontrar un par de soluciones propuestas, pero ninguna me satisface.

¿Qué sucede si la biblioteca binaria no viene con un paquete de símbolos de depuración? ¿Qué sucede si el programa salta al código generado en tiempo de ejecución?

Desmontar el código no es realmente una solución, ya que la IU lo ignora, lo más importante es que los valores de los registros no se actualizan hasta que vuelva al código original conocido. info registers funciona, pero eso apenas es interactivo.

¿Alguna sugerencia?

Gracias!

Respuesta

8

Puede hacer este tipo de cosas con el comando display.

display/i $pc va a desmontar la instrucción actual justo antes de la línea de se imprime cada vez:

(gdb) b main 
Breakpoint 1 at 0x80483b5: file hw.c, line 5. 
(gdb) display/i $pc 
(gdb) r 
Starting program: /tmp/hw 

Breakpoint 1, main() at hw.c:5 
5   puts("Hello world"); 
1: x/i $pc 
0x80483b5 <main+17>: movl $0x8048490,(%esp) 

Ahora paso una instrucción (entonces solo sigue Intro para repetir):

(gdb) si 
0x080483bc  5   puts("Hello world"); 
1: x/i $pc 
0x80483bc <main+24>: call 0x80482d4 <[email protected]> 
(gdb) 
0x080482d4 in [email protected]() 
1: x/i $pc 
0x80482d4 <[email protected]>: jmp *0x804959c 
Current language: auto; currently asm 
(gdb) 
0x080482da in [email protected]() 
1: x/i $pc 
0x80482da <[email protected]+6>: push $0x10 
(gdb) 
0x080482df in [email protected]() 
1: x/i $pc 
0x80482df <[email protected]+11>:  jmp 0x80482a4 <_init+48> 

Todavía funciona cuando llegamos a este punto:

(gdb) 
0x080482a4 in ??() 
1: x/i $pc 
0x80482a4 <_init+48>: pushl 0x804958c 
(gdb) 
0x080482aa in ??() 
1: x/i $pc 
0x80482aa <_init+54>: jmp *0x8049590 
(gdb) 
0xb7f052d0 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
1: x/i $pc 
0xb7f052d0 <_dl_runtime_resolve>:  push %eax 

Más de una expresión display puede estar activa a la vez (use undisplay <number> para eliminarlas). Por ejemplo, para ver lo que ocurre con %eax:

(gdb) display/x $eax 
2: /x $eax = 0xbf90ab34 
(gdb) si 
0xb7f052d1 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d1 <_dl_runtime_resolve+1>:  push %ecx 
(gdb) 
0xb7f052d2 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d2 <_dl_runtime_resolve+2>:  push %edx 
(gdb) 
0xb7f052d3 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d3 <_dl_runtime_resolve+3>:  mov 0x10(%esp),%edx 
(gdb) 
0xb7f052d7 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d7 <_dl_runtime_resolve+7>:  mov 0xc(%esp),%eax 

... y aquí se puede ver el cambio en %eax:

(gdb) 
0xb7f052db in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xb7f0d668 
1: x/i $pc 
0xb7f052db <_dl_runtime_resolve+11>: call 0xb7eff780 <_dl_fixup> 
(gdb) 
+0

mejor que la alternativa, pero no funciona con la UIS en . Todavía marcaré esto como la respuesta aceptada después de un tiempo, ya que me doy cuenta de que tal vez no haya una solución real. – jbcreix