tipos informatica funciona cómo caracteristicas c linux debugging linux-kernel panic

informatica - tipos de kernel



¿Cómo leer, comprender, analizar y depurar un pánico del kernel de Linux? (3)

En unwind_backtrace+0x0/0xf8 ¿ unwind_backtrace+0x0/0xf8 significa +0x0/0xf8 ?

El primer número ( +0x0 ) es el desplazamiento desde el comienzo de la función ( unwind_backtrace en este caso). El segundo número ( 0xf8 ) es la longitud total de la función . Teniendo en cuenta estos dos datos, 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 estuvo en la función que era).

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

Considere el siguiente rastreo de la pila de volcado del kernel de Linux, puede desencadenar un ataque de pánico desde el código fuente del kernel llamando a panic("debugging a linux kernel panic"); :

[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60) [<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24) [<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac) [<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)

  • En unwind_backtrace+0x0/0xf8 ¿ unwind_backtrace+0x0/0xf8 significa +0x0/0xf8 ?
  • ¿Cómo puedo ver el código C de unwind_backtrace+0x0/0xf8 ?
  • ¿Cómo interpretar el contenido del pánico?

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

Utilice objdump :

  1. localice su vmlinux o el archivo .ko en el directorio raíz del kernel, luego desmonte el archivo del objeto:

    objdump -dS vmlinux > /tmp/kernel.s

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

Use gdb :

IMO, 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 prompt de gdb: list *(unwind_backtrace+0x10) .

Para obtener información adicional, puede consultar lo siguiente:

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

Es solo una traza inversa normal, 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 Comprensión de un kernel ¡Vaya! Y cómo puede depurar un kernel ¡Vaya! También hay este excelente tutorial sobre la depuración del Kernel

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

addr2line -e vmlinux_with_debug_info 0019594c(+offset)