Otra opción es utilizar el controlador ICE/JTAG y GDB. Esta solución de 'hardware' se utiliza especialmente con sistemas embebidos,
pero, por ejemplo, Qemu ofrece características similares:
-
inicie qemu con un código auxiliar 'remoto' de gdb que escucha en 'localhost:1234':
qemu -s ...
, -
luego con GDB abres el archivo kernel
vmlinux
compilado con información de depuración (puede echar un vistazo a este hilo de la lista de correo donde discuten la falta de optimización del kernel). -
conectar GDB y Qemu:
target remote localhost:1234
-
ver tu en vivo núcleo:
(gdb) where #0 cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:77 #1 0xc0029728 in arch_idle () atarm/mach-realview/include/mach/system.h:36 #2 default_idle () at arm/kernel/process.c:166 #3 0xc00298a8 in cpu_idle () at arch/arm/kernel/process.c:199 #4 0xc00089c0 in start_kernel () at init/main.c:713
desafortunadamente, la depuración del espacio de usuario no es posible hasta ahora con GDB (sin información de lista de tareas, sin reprogramación de MMU para ver diferentes contextos de proceso, ...), pero si permanece en el espacio del kernel, eso es bastante conveniente.
info threads
le dará la lista y los estados de las diferentes CPU
EDITAR:
Puede obtener más detalles sobre el procedimiento en este PDF:
Depuración de sistemas Linux usando GDB y QEMU.
Al depurar el kernel de Linux, podemos utilizar varias herramientas, por ejemplo, depuradores (KDB, KGDB), volcado mientras se bloquea (LKCD), kit de herramientas de rastreo (LTT, LTTV, LTTng), instrumentos de kernel personalizados (dprobes, kprobes). En la siguiente sección, traté de resumir la mayoría de ellos, espero que ayuden.
LKCD (Linux Kernel Crash Dump) permite que el sistema Linux escriba el contenido de su memoria cuando ocurre un bloqueo. Estos registros se pueden analizar más a fondo para determinar la causa raíz del bloqueo. Recursos relacionados con LKCD
- http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/lkcd.pdf
- https://www.novell.com/coolsolutions/feature/15284.html
- https://www.novell.com/support/kb/doc.php?id=3044267
Vaya cuando el kernel detecta un problema, imprime un mensaje Oops. Dicho mensaje es generado por sentencias printk en el controlador de fallas (arch/*/kernel/traps.c). Un búfer de anillo dedicado en el núcleo que utilizan las sentencias printk. Oops contiene información como la CPU donde ocurrió el Oops, el contenido de los registros de la CPU, el número de Oops, la descripción, el seguimiento de la pila y otros. Recursos relacionados con kernel Ups
- https://www.kernel.org/doc/Documentation/oops-tracing.txt
- http://madwifi-project.org/wiki/DevDocs/KernelOops
- https://wiki.ubuntu.com/DebuggingKernelOops
Sondas dinámicas es una de las herramientas de depuración populares para Linux desarrollada por IBM. Esta herramienta permite la colocación de una "sonda" en casi cualquier lugar del sistema, tanto en el espacio del usuario como en el del kernel. La sonda consta de algún código (escrito en un lenguaje especializado orientado a la pila) que se ejecuta cuando el control llega al punto dado. Los recursos relacionados con Dynamic Probe se enumeran a continuación
- http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/dprobesltt.pdf
- http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.107.6212&rep=rep1&type=pdf
Kit de herramientas de seguimiento de Linux es un parche del kernel y un conjunto de utilidades relacionadas que permiten rastrear eventos en el kernel. El seguimiento incluye información de tiempo y puede crear una imagen razonablemente completa de lo que sucedió durante un período de tiempo determinado. Recursos de LTT, LTT Viewer y LTT Next Generation
- http://elinux.org/Linux_Trace_Toolkit
- http://www.linuxjournal.com/article/3829
- http://multivax.blogspot.com/2010/11/introduction-to-linux-tracing-toolkit.html
MEMWATCH es una herramienta de detección de errores de memoria de código abierto. Funciona definiendo MEMWATCH en la instrucción gcc y agregando un archivo de encabezado a nuestro código. A través de esto podemos rastrear pérdidas de memoria y daños en la memoria. Recursos relacionados con MEMWATCH
- http://www.linuxjournal.com/article/6059
frastreo es un buen marco de seguimiento para el kernel de Linux. ftrace rastrea las operaciones internas del núcleo. Esta herramienta incluida en el kernel de Linux en 2.6.27. Con sus diversos complementos de seguimiento, ftrace puede apuntar a diferentes puntos de seguimiento estáticos, como eventos de programación, interrupciones, E/S asignadas a la memoria, transiciones de estado de energía de la CPU y operaciones relacionadas con sistemas de archivos y virtualización. Además, está disponible el seguimiento dinámico de las llamadas a funciones del núcleo, opcionalmente restringible a un subconjunto de funciones mediante el uso de globs, y con la posibilidad de generar gráficos de llamadas y proporcionar uso de pila. Puede encontrar un buen tutorial de ftrace en https://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_rostedt.pdf
ltrace es una utilidad de depuración en Linux, que se utiliza para mostrar las llamadas que hace una aplicación de espacio de usuario a las bibliotecas compartidas. Esta herramienta se puede utilizar para rastrear cualquier llamada de función de biblioteca dinámica. Intercepta y registra las llamadas de la biblioteca dinámica que son llamadas por el proceso ejecutado y las señales que son recibidas por ese proceso. También puede interceptar e imprimir las llamadas al sistema ejecutadas por el programa.
- http://www.ellexus.com/primeros-pasos-con-ltrace-cómo-lo-hace-eso/?doing_wp_cron=1425295977.1327838897705078125000
- http://developerblog.redhat.com/2014/07/10/ltrace-for-rhel-6-and-7/
KDB es el depurador en el kernel del kernel de Linux. KDB sigue una interfaz simplista de estilo shell. Podemos usarlo para inspeccionar memoria, registros, listas de procesos, dmesg e incluso establecer puntos de interrupción para detenerse en una ubicación determinada. A través de KDB podemos establecer puntos de interrupción y ejecutar algunos controles básicos de ejecución del kernel (Aunque KDB no es un depurador de nivel de fuente ). Varios recursos útiles sobre KDB
- http://www.drdobbs.com/open-source/linux-kernel-debugging/184406318
- http://elinux.org/KDB
- http://dev.man-online.org/man1/kdb/
- https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/usingKDB.html
KGDB está destinado a ser utilizado como un depurador de nivel de fuente para el kernel de Linux. Se usa junto con gdb para depurar un kernel de Linux. Se requieren dos máquinas para usar kgdb. Una de estas máquinas es una máquina de desarrollo y la otra es la máquina de destino. El núcleo que se va a depurar se ejecuta en la máquina de destino. La expectativa es que gdb se pueda usar para "irrumpir" en el kernel para inspeccionar la memoria, las variables y buscar información de la pila de llamadas de manera similar a la forma en que un desarrollador de aplicaciones usaría gdb para depurar una aplicación. Es posible colocar puntos de interrupción en el código del kernel y realizar algunos pasos de ejecución limitados. Varios recursos útiles sobre KGDB
- http://landley.net/kdocs/Documentation/DocBook/xhtml-nochunks/kgdb.html
Según la wiki, kgdb
se fusionó con el kernel en 2.6.26
que es dentro de los últimos años. kgdb
es un depurador remoto, por lo que lo activa en su kernel y luego le adjunta gdb de alguna manera. Digo de alguna manera ya que parece haber muchas opciones:vea conectar gdb. Dado que kgdb
ahora está en el árbol de código fuente, yo diría que en el futuro esto es lo que quieres usar.
Así que parece que Linus cedió. Sin embargo, enfatizaría su argumento:debes saber lo que estás haciendo y conocer bien el sistema. Esta es la tierra del núcleo. Si algo sale mal, no obtienes segfault
, obtienes cualquier cosa, desde algún problema oscuro más adelante hasta que todo el sistema se derrumba. Aquí hay dragones. Proceda con cuidado, ha sido advertido.