2009-11-19 13 views
18

una máquina Linux congela pocas horas después de arrancar y ejecutar el software (incluyendo controladores personalizados). Estoy buscando un método para solucionar ese problema. Recientemente, ha habido un progreso significativo en las técnicas de depuración del kernel de Linux, ¿no es así?técnicas de depuración actual Linux Kernel

Le pido amablemente a compartir alguna experiencia en el tema.

+0

@tinkertim: ¿quieres decir que no es suficiente? :) – leppie

Respuesta

5

SystemTap parece ser para Linux lo que Dtrace es para Solaris ... sin embargo, me parece bastante hostil de usar. Aún así, puede intentarlo. NB: compila el kernel con información de depuración y pasa algún tiempo con los ganchos de instrumentación del kernel.

Esta es la razón por la que muchos aún usan printk() luego de reducir empíricamente un error a un módulo específico.

no estoy recomendando que, simplemente señalando que existe. Puede que no sea lo suficientemente inteligente como para apreciar alguna belleza subyacente ... Solo escribo controladores para dispositivos extraños.

+1

+1 para la referencia a SystemTrap. Parece prometedor. Soy uno de estos chicos de Printk. – dmeister

2

Existen muchas y variadas técnicas según el tipo de problemas que desee depurar. En su caso, la primera pregunta es "¿el sistema está realmente congelado?". Puede habilitar la clave sysrq mágica y examinar el estado del sistema al congelar e ir desde allí.

Probablemente el método más directamente poderoso es habilitar el depurador del núcleo y conectarse a él a través de un cable serie.

6

Si se puede reproducir el problema dentro de una máquina virtual, en efecto, hay una técnica bastante nueva (que yo sepa) que podría ser útil: la depuración de la máquina virtual desde el ordenador central que puede correr.

Véase, por ejemplo, esto: Debugging Linux Kernel in VMWare with Windows host

VMware Workstation 7 también permite una técnica potente que le permite la ejecución sistema de registro de forma determinista y luego reproducirla como se desee, incluso hacia atrás. Entonces, tan pronto como el sistema se cuelga puede ir hacia atrás y ver qué estaba sucediendo en ese momento (e incluso intentar cambiar algo y ver si todavía falla). IIRC Leí en alguna parte que no puede hacer esto y depuro el kernel usando VMware/gdb al mismo tiempo.

Obviamente, se necesita un VMM para esto. No sé qué VMM además de la familia VMM de VMware admite esto, y no sé si las versiones gratuitas de VMware lo admiten. Probablemente no; no se puede esperar que una compañía comercial regale todo gratis. La versión de prueba es de 30 días.

Si sus controladores personalizados son para hardware dentro de la máquina, entonces supongo que esto probablemente no funcionará.

+0

Tenga en cuenta que esto no requiere habilitar ningún tipo de soporte de depuración dentro de la máquina virtual; la máquina virtual en sí no se altera y teóricamente ignora por completo que se está depurando. En cambio, la estación de trabajo tiene un trozo de gdb integrado directamente que controla la CPU virtualizada. – Paul

0

Cómo depuro este tipo de error, era ejecutar mi sistema operativo dentro de VirtualBox, y compilar el kernel con kgdb incorporado. Luego configuro una consola serial en el VirtualBox para que pueda gdb al núcleo dentro del sistema operativo del VirtualBox a través de la consola serie. Cada vez que el sistema operativo se bloquea, al igual que la tecla sysrq magia, puedo entrar ctrl-c en el BGF para detener y comprender el núcleo en ese punto en el tiempo.

Normalmente pila del núcleo trazado es demasiado difícil establecer claramente el proceso culpable, así que la mejor forma en que pienso es todavía comando "top" genérico, sólo mirar a los registros de la aplicación para ver lo que son la causa de la inclinación - esto tendrá un reinicio para ver el registro, por supuesto.

0

Una opción es utilizar Kprobes. Una búsqueda rápida en Google le mostrará toda la información que necesita. No es particularmente difícil de usar. KPRBES fue creado por IBM Creo que como una solución para la depuración del kernel.Es esencialmente una forma elaborada de printk(), sin embargo, le permite manejar cualquier "punto de interrupción" que inserte utilizando controladores. Puede ser lo que estás buscando. Todo lo que necesita hacer es escribir e 'insmod' un módulo en el kernel que manejará cualquier golpe de "punto de corte" que especifique en el módulo.

Espero que pueda ser una opción útil ...