assembly - Mostrar instrucción de ensamblaje actual en GDB
(6)
Estoy realizando una depuración a nivel de ensamblaje en GDB. ¿Hay alguna manera de hacer que GDB me muestre las instrucciones de ensamblaje actuales de la misma manera que muestra la línea fuente actual? La salida predeterminada después de cada comando se ve así:
0x0001433f 990 Foo::bar(p);
Esto me da la dirección de la instrucción actual, pero tengo que seguir refiriéndome a la salida de disassemble
para ver qué instrucción estoy ejecutando actualmente.
Configurando la siguiente opción:
set disassemble-next-line on
show disassemble-next-line
Te dará resultados que se ven así:
(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
0x000002cc <ResetISR+0>: 80 b5 push {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0 sub sp, #8
0x000002d0 <ResetISR+4>: 00 af add r7, sp, #0
(gdb) stepi
0x000002d0 245 {
0x000002cc <ResetISR+0>: 80 b5 push {r7, lr}
0x000002ce <ResetISR+2>: 82 b0 sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af add r7, sp, #0
Desde dentro de gdb presione Ctrl
x
2
y la pantalla se dividirá en 3 partes.
La primera parte te mostrará el código normal en un lenguaje de alto nivel.
El segundo le mostrará el equivalente de ensamblaje y el instruction Pointer
correspondiente.
En tercer lugar, le presentará el indicador gdb
normal para ingresar comandos.
El comando
x/i $pc
se puede configurar para ejecutarse todo el tiempo utilizando el mecanismo de configuración habitual.
Puede cambiar al diseño de ensamblaje en GDB:
(gdb) layout asm
Mira here para más información. La instrucción de ensamblaje actual se mostrará en la ventana del ensamblador.
┌───────────────────────────────────────────────────────────────────────────┐
│0x7ffff740d756 <__libc_start_main+214> mov 0x39670b(%rip),%rax #│
│0x7ffff740d75d <__libc_start_main+221> mov 0x8(%rsp),%rsi │
│0x7ffff740d762 <__libc_start_main+226> mov 0x14(%rsp),%edi │
│0x7ffff740d766 <__libc_start_main+230> mov (%rax),%rdx │
│0x7ffff740d769 <__libc_start_main+233> callq *0x18(%rsp) │
>│0x7ffff740d76d <__libc_start_main+237> mov %eax,%edi │
│0x7ffff740d76f <__libc_start_main+239> callq 0x7ffff7427970 <exit> │
│0x7ffff740d774 <__libc_start_main+244> xor %edx,%edx │
│0x7ffff740d776 <__libc_start_main+246> jmpq 0x7ffff740d6b9 <__libc_start│
│0x7ffff740d77b <__libc_start_main+251> mov 0x39ca2e(%rip),%rax #│
│0x7ffff740d782 <__libc_start_main+258> ror $0x11,%rax │
│0x7ffff740d786 <__libc_start_main+262> xor %fs:0x30,%rax │
│0x7ffff740d78f <__libc_start_main+271> callq *%rax │
└───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main Line: ?? PC: 0x7ffff740d76d
#3 0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4 0x00007ffff74671ff in _IO_file_overflow ()
from /lib/x86_64-linux-gnu/libc.so.6
#5 0x0000000000408756 in ?? ()
#6 0x0000000000403980 in ?? ()
#7 0x00007ffff740d76d in __libc_start_main ()
from /lib/x86_64-linux-gnu/libc.so.6
(gdb)
Si desea que las siguientes instrucciones se muestren automáticamente al recorrer el programa, puede usar el comando de pantalla de la siguiente manera:
display /3i $pc
Lo anterior mostrará 3 instrucciones cada vez que se golpea un punto de interrupción o cuando se avanza un solo paso en el programa.
Más detalles en la entrada del blog here .
Tu puedes hacer
display/i $pc
y cada vez que se detiene GDB, mostrará el desmontaje de la siguiente instrucción.
GDB-7.0
también es compatible con el set disassemble-next-line on
, que desmontará toda la siguiente línea y le dará más del contexto de desensamblaje.