GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo leer, comprender, analizar y depurar un kernel panic de Linux?

Aquí hay dos alternativas para addr2line . Suponiendo que tiene la cadena de herramientas del objetivo adecuado, puede hacer una de las siguientes cosas:

Utilice objdump :

  1. localiza tu vmlinux o el .ko archivo en el directorio raíz del kernel, luego desmonte el archivo de objeto:

    objdump -dS vmlinux > /tmp/kernel.s
    
  2. Abra el archivo de ensamblaje generado, /tmp/kernel.s . con un editor de texto como vim . Ir a unwind_backtrace+0x0/0xf8 , es decir, busca la dirección de unwind_backtrace + el offset . Finalmente, ha localizado la parte problemática en su código fuente.

Usar gdb :

En mi opinión, una opción aún más elegante es usar el único gdb . Suponiendo que tiene la cadena de herramientas adecuada en su máquina host:

  1. Ejecute gdb <path-to-vmlinux> .
  2. Ejecutar en el aviso de gdb:list *(unwind_backtrace+0x10) .

Para obtener información adicional, puede consultar los siguientes recursos:

  1. Trucos de depuración del kernel.
  2. Depuración del kernel de Linux usando Gdb

En unwind_backtrace+0x0/0xf8 qué demonios +0x0/0xf8 significa?

El primer número (+0x0 ) es el desplazamiento desde el principio de la función (unwind_backtrace en este caso). El segundo número (0xf8 ) es la longitud total de la función . Dadas estas dos piezas de información, si ya tiene una corazonada sobre dónde ocurrió la falla, esto podría ser suficiente para confirmar su sospecha (puede decir (aproximadamente) qué tan avanzado estaba en la función).

Para obtener la línea fuente exacta de la instrucción correspondiente (generalmente mejor que las corazonadas), use addr2line o los otros métodos en otras respuestas.


Es solo un backtrace ordinario, esas funciones se llaman en orden inverso (la primera llamada fue llamada por la anterior y así sucesivamente):

unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150

El bdi_register+0xec/0x150 es el símbolo + el desplazamiento/longitud. Hay más información al respecto en Comprender un Kernel Oops y cómo puede depurar un kernel Oops. También existe este excelente tutorial sobre la depuración del kernel

Nota:como Eugene sugiere a continuación, es posible que desee probar addr2line primero, aunque todavía necesita una imagen con símbolos de depuración, por ejemplo

addr2line -e vmlinux_with_debug_info 0019594c(+offset)


Linux
  1. Variables de entorno de Linux:cómo leer y configurar en un VPS de Linux

  2. Cómo manejar un pánico en el kernel de Linux

  3. Cómo actualizar Kernel en Linux Desktop

  4. ¿Cómo leer las páginas man de Linux?

  5. ¿Cómo configurar temprano el kernel de Linux para reiniciar en caso de pánico?

Kernel de Linux y sus funciones

Cómo navegar y leer Arch Wiki completo como páginas man de Linux

Cómo depurar scripts de Bash en Linux y Unix

Qué hacer en caso de pánico en el kernel de Linux

Cómo leer la salida y los usos del comando superior de Linux

Lea y analice los registros de su sistema Linux con Journalctl