Esta pagina se ve mejor con JavaScript habilitado

Comandos de supervivencia GDB debugging

 ·  🎃 kr0m

Todo programador de C que se precie tarde o temprano tendrá que debugear su código ya sea mediante prints o con un debuger en condiciones, en este artículo listaré los comandos de supervivencia utilizados en GDB.

La lista es muy escueta y simple ya que se trata de una lista de comandos básicos:

  • si: Step ASM

  • s: Step C entrando en las funciones

  • n: Step C sin entrar en funciones

  • print VAR_NAME: Muestra el valor de una variable

    • Podemos indicar el formato: p/d imprimirá el valor en decimal, por defecto lo hace en hexadecimal, podemos ver los formatos soportados en este enlace .
  • list: Muestra el código fuente en C

  • b N_LINE/FUNCTION_NAME: Setea un breakpoint

  • b *0x7c00: Debug posición de memoria, en este caso el BootLoader

  • info breakpoints: Lista los breakpoints

  • info functions: Lista de funciones

  • watch VAR_NAME: Dispara un breakpoint cuando el valor de la variable cambia

  • info watchpoints: Lista los watchpoints

  • del N_BREAK: Elimina el breakpoint indicado

  • x/Nx MEM_ADDRESS: Muestra el contenido en memoria de la dirección, el formato s es muy útil cuando tratamos con strings

  • print &VAR_NAME: Dirección de memoria de una variable

  • print $REGISTER: Muestra el valor de un registro

  • print /x N: Muestra el valor de N en Hexadecimal

  • info variables: Muestra las variables estáticas o globales

  • info locals: Muestra el valor de todas las variables existentes en la pila de la función actual

  • info frame: Muestra información acerca de la pila

  • info registers REGISTER: Muestra el valor de todos los registros o los que le indiquemos como parámetro

  • bt: Muestra las funciones por donde ha pasado el flujo del programa hasta llegar al punto actual

  • disassemble FUNCTION_NAME: Ver el código fuente de una función en ASM

Algo muy útil es definir comandos personalizados, por ejemplo si ponemos un break point en un bucle donde se modifica una variable, podemos definir el siguiente comando para monitorizar la variable en cada iteración del bucle:

define next_and_print
n
print VAR_NAME
end

A partir de aquí tendremos a nuestra disposición un comando llamado “next_and_print” que ejecutará el siguiente paso de código e imprimirá el valor de VAR_NAME.

Personalmente recomiendo instalar algún plugin del estilo peda/gef ya que nos resultará mas fácil la visualización de datos: GDB-gef

Si te ha gustado el artículo puedes invitarme a un RedBull aquí