Mostrar instrucciones de montaje actuales en GDB


179

Estoy haciendo una depuración a nivel de ensamblado en GDB. ¿Hay alguna manera de hacer que GDB me muestre la instrucción de ensamblaje actual de la misma manera que muestra la línea de origen actual? El resultado predeterminado después de cada comando tiene este aspecto:

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 disassemblepara ver qué instrucción estoy ejecutando actualmente.


Respuestas:


314

Puede cambiar al diseño de ensamblaje en GDB:

(gdb) layout asm

Ver aquí 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)

1
@greatwolf, parece que no tienes soporte tui en tu gdb. Consulte esta pregunta para obtener más información: stackoverflow.com/q/6706838/72178 .
ks1322

9
¡Ordenado! ¿Ahora puedo tener una ventana similar para los registros? De hecho, puedo:layout regs
Jens

Vea también gdb docs para otros comandos TUI , como tui reg vectormostrar los registros vectoriales en lugar de los registros enteros. (Sin embargo, no siempre es muy útil, ya que no le permite elegir solo el .v8_int16o algo así, por lo que la pantalla es un gran desastre). Consulte el wiki de etiquetas x86 para obtener un tutorial rápido para depurar asm.
Peter Cordes

Se trata de una característica y salida inútiles. Los nombres destrozados de C ++ son demasiado largos, y todo lo que intento ver está fuera de la pantalla a la derecha. Qué decisión más estúpida (no mostrar ASM por defecto cuando si), y qué característica inútil (ventana gráfica que no muestra la información necesaria). No tiene sentido rechazar esta respuesta ya que solo eres el mensajero ...
jww

1
de manera similar, ·layout srcpara ver el código fuente al depurar, y también CTRL+x+a
vale la pena

149

Tu puedes hacer

display/i $pc

y cada vez que GDB se detiene, mostrará el desmontaje de la próxima instrucción.

GDB-7.0también es compatible set disassemble-next-line on, lo que desarmará toda la línea siguiente y le dará más contexto de desmontaje.


1
¿Cómo habilitamos esta función cuando usamos si(pero no s)?
jww

54

El comando

x/i $pc

se puede configurar para ejecutarse todo el tiempo utilizando el mecanismo de configuración habitual.


29
Y x/ni $pcpara ver las siguientes n instrucciones, que a menudo es bastante útil.
Stephen Canon

48

Configurando la siguiente opción:

set  disassemble-next-line on
show disassemble-next-line

Le 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

Esta opción no parece existir en mi instalación. ¿Se ha eliminado?
fuz

2
@fuz Lo más probable es que su gdb sea viejo
tbodt

@fuz presente al menos en GDB 8.1 en Ubuntu 18.04.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

habilidad muy útil
DaSqy Stc

1
muestre la siguiente línea de desmontaje es para prueba, para imprimir el estado de la bandera, encendido o apagado
Sam

30

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 llega a un punto de interrupción o cuando se realiza un solo paso en el programa.

Más detalles en la entrada del blog aquí .


23

Desde dentro de gdb, presione Ctrl x 2y la pantalla se dividirá en 3 partes.

La primera parte le mostrará el código normal en lenguaje de alto nivel.

Segundo le mostrará el ensamblaje equivalente y correspondiente instruction Pointer.

Third le presentará el gdbmensaje normal para ingresar comandos.

Ver la captura de pantalla


No pude iniciarlo con Ctrl-X 2, pero parece gdb -tuimodo, lo cual es genial.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

77
Esto también es accesible layout splitdesde el indicador gdb.
chucksmash

22

Panel de GDB

https://github.com/cyrus-and/gdb-dashboard

Esta configuración de GDB utiliza la API oficial de Python de GDB para mostrarnos lo que queramos siempre que GDB se detenga después, por ejemplo next , al igual que TUI.

Sin embargo, he descubierto que esta implementación es una alternativa más robusta y configurable al modo GDB TUI incorporado como se explica en: vista dividida gdb con código

Por ejemplo, podemos configurar el panel de GDB para mostrar el desmontaje, el origen, los registros y la pila con:

dashboard -layout source assembly registers stack

Esto es lo que parece si habilita todas las vistas disponibles:

ingrese la descripción de la imagen aquí

Preguntas relacionadas:


1
@downvoters: explique para que pueda aprender y mejorar la información. Creo que esta es una alternativa superior para la respuesta actualmente aceptada por TUI: stackoverflow.com/a/2015523/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.