Dado um rastreamento de pilha do kernel como abaixo, como você determina a linha de código específica onde o problema ocorreu?
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
Embora eu não tenha problemas para encontrar a chamada de função - mas traduzir __link_path_walk mais um deslocamento para um número de linha real é a parte mais difícil.
Supondo que isso seja para um kernel padrão fornecido por distribuição para o qual eu sei a versão exata e o número da compilação, qual é o processo para buscar os metadados necessários e fazer a pesquisa correspondente?
CONFIG_KALLSYMS
: github.com/cirosantilli/linux-kernel-module-cheat/tree/…Eu não tenho um ~ = RHEL5 em mãos, portanto a saída mostrada é do Fedora 20, embora o processo deva ser basicamente o mesmo ( o nome da função mudou ).
Você precisaria instalar o
kernel-debug-debuginfo
pacote apropriado para o seu kernel (assumindo RHEL ou distribuição derivada). Este pacote fornece umavmlinux
imagem (uma versão não compactada e sem strip do kernel):essa imagem pode ser usada diretamente com
gdb
Você também pode usar
objdump(1)
navmlinux
imagem:As bandeiras são:
Você pode procurar a função lá:
e combine o deslocamento com a linha de código real.
fonte
Tornar a saída do despejo de pilha útil novamente.
fonte
Se o addr2line imprimir um ponto de interrogação para o número da linha ou se o objdump falhar no código fonte embutido e você tiver um kernel personalizado, recompile o kernel com o conjunto CONFIG_DEBUG_INFO. Pode ser necessário reproduzir o erro com o kernel recém-criado.
fonte