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
:
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
Abra el archivo de ensamblaje generado,
/tmp/kernel.s
. con un editor de texto comovim
. Vaya aunwind_backtrace+0x0/0xf8
, es decir, busque la dirección deunwind_backtrace
+ eloffset
. 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:
- Ejecute
gdb <path-to-vmlinux>
. - Ejecutar en el prompt de gdb:
list *(unwind_backtrace+0x10)
.
Para obtener información adicional, puede consultar lo siguiente:
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)