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