9.5. Depuración En-Línea Usando El GDB remoto

Esta característica ha sido soportada desde FreeBSD 2.2, y ya está en verdad muy bien pulida.

El GDB ha soportado depuración remota desde hace mucho tiempo. Esto se hace usando un protocolo muy simple a traves de una línea serie. A diferencia de los otros metodos descriptos anteriormente, hacen falta dos máquinas para hacer esto. Una va a proveer el entorno de depuración, incluyendo todos los archivos fuente, y una copia del ejecutable del kernel con todos los símbolos y la otra será la máquina a depurar que simplemente corre una copia de exactamente el mismo kernel (pero sin los símbolos de depuración).

Usted debería configurar el kernel en cuestión con config -g, incluir DDB en la configuración, y compilarla como siempre. Esto arrojará un ejecutable enorme, debido a la información de depuración. Copie este kernel a la máquina a depurar, quitele los simbolos con strip -x, e inicielo usando la opción -d en el prompt de inicio. Conecte el primer puerto serie de la máquina a cualquier puerto serie de la máquina que correrá el debugger. Ahora en la máquina que corre el debugger, vaya al directorio de compilación del kernel a depurar, y arranque el gdb:

% gdb -k kernel
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.16 (i386-unknown-freebsd),
Copyright 1996 Free Software Foundation, Inc...
(kgdb)

Inicie la sesión de depuración remota haciendo (asumiendo que se usa el primer puerto serie):

(kgdb) target remote /dev/cuaa0

Ahora en la máquina a depurar (que entró al DDB justo antes de empezar a detectar los dispositivos), tipee:

Debugger("Boot flags requested debugger")
Stopped at Debugger+0x35: movb  $0, edata+0x51bc
db> gdb

El DDB responderá diciendo:

Next trap will enter GDB remote protocol mode

Cada vez que tipee gdb, el modo se alternará entre el GDB remoto y el DDB local. Para forzar un siguiente trap inmediatamente, simplemente tipee s (avanza un paso). la máquina del debugger ahora ganará control sobre el kernel a depurar:

Remote debugging using /dev/cuaa0
Debugger (msg=0xf01b0383 "Boot flags requested debugger")
    at ../../i386/i386/db_interface.c:257
(kgdb)

Esta sesión puede usarse casi como cualquier otra sesión de GDB, incluyendo acceso completo al código fuente, ejecutarlo en modo-gud dentro de una ventana de Emacs (lo cual brinda la posibilidad de mostrar automáticamente el código fuente en otra ventana de Emacs) etc.

El GDB remoto tambien puede usarse para depurar LKMs. Primero compile el LKM con los simbolos de depuración:

# cd /usr/src/lkm/linux
# make clean; make COPTS=-g

Luego instale esta versión del módulo en la máquina a depurar, carguelo y use modstat para averiguar donde fue cargado:

# linux
# modstat
Type     Id Off Loadaddr Size Info     Rev Module Name
EXEC      0   4 f5109000 001c f510f010   1 linux_mod

Tome la dirección de carga (loadaddr) del módulo y sumele 0x20 (probablemente para contar el encabezado a.out). Esta es la dirección donde el código del módulo fue reubicado. Use el comando add-symbol-file en el GDB para informarle al debugger acerca del módulo:

(kgdb) add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020? (y or n) y
(kgdb)

Ahora tiene acceso a todos los símbolos en el LKM.

Éste y otros documentos pueden obtenerse en ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para preguntas acerca de FreeBSD, leer la documentación antes de contactar con la lista <questions@FreeBSD.org>.
Para preguntas acerca de esta documentación, e-mail a <doc@FreeBSD.org>.