Dado un seguimiento de la pila del kernel como se muestra a continuación, ¿cómo determina la línea de código específica donde ocurrió el problema?
kernel: [<ffffffff80009a14>] __link_path_walk+0x173/0xfb9
kernel: [<ffffffff8002cbec>] mntput_no_expire+0x19/0x89
kernel: [<ffffffff8000eb94>] link_path_walk+0xa6/0xb2
kernel: [<ffffffff80063c4f>] __mutex_lock_slowpath+0x60/0x9b
kernel: [<ffffffff800238de>] __path_lookup_intent_open+0x56/0x97
kernel: [<ffffffff80063c99>] .text.lock.mutex+0xf/0x14
kernel: [<ffffffff8001b222>] open_namei+0xea/0x712
kernel: [<ffffffff8006723e>] do_page_fault+0x4fe/0x874
kernel: [<ffffffff80027660>] do_filp_open+0x1c/0x38
kernel: [<ffffffff8001a061>] do_sys_open+0x44/0xbe
kernel: [<ffffffff8005d28d>] tracesys+0xd5/0xe0
Si bien no tengo problemas para encontrar la llamada a la función, pero la parte difícil es traducir __link_path_walk más un desplazamiento a un número de línea real.
Suponiendo que esto es para un núcleo proporcionado por la distribución estándar para el que sé la versión exacta y el número de compilación, ¿cuál es el proceso para obtener los metadatos necesarios y realizar la búsqueda correspondiente?
CONFIG_KALLSYMS
: github.com/cirosantilli/linux-kernel-module-cheat/tree/…No tengo un ~ = RHEL5 a mano, por lo que el resultado que se muestra es de un Fedora 20, aunque el proceso debería ser casi el mismo ( el nombre de la función ha cambiado ).
Debería instalar el
kernel-debug-debuginfo
paquete apropiado para su núcleo (suponiendo RHEL o distribución derivada). Este paquete proporciona unavmlinux
imagen (una versión sin kernel sin comprimir del núcleo):esa imagen se puede usar directamente con
gdb
También puedes usar
objdump(1)
en lavmlinux
imagen:Las banderas son:
Puede buscar la función allí:
y hacer coincidir el desplazamiento con la línea de código real.
fuente
Haga que la salida de volcado de pila sea útil nuevamente.
fuente
Si addr2line debe imprimir un signo de interrogación para el número de línea o si objdump no puede incorporar el código fuente y tiene un núcleo personalizado, asegúrese de volver a compilar el núcleo con el conjunto CONFIG_DEBUG_INFO. Es posible que deba reproducir el error con el kernel recién construido.
fuente