Étant donné une trace de pile de noyau comme ci-dessous, comment déterminez-vous la ligne de code spécifique où le problème s'est produit?
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
Bien que je n'aie aucun mal à trouver l'appel de fonction - mais la traduction de __link_path_walk plus un décalage en un numéro de ligne réel est la partie difficile.
En supposant que cela concerne un noyau fourni par la distribution standard dont je connais la version exacte et le numéro de build, quel est le processus pour récupérer les métadonnées nécessaires et effectuer la recherche correspondante?
CONFIG_KALLSYMS
: github.com/cirosantilli/linux-kernel-module-cheat/tree/…Je n'ai pas de ~ = RHEL5 à portée de main, donc la sortie affichée provient d'un Fedora 20, bien que le processus devrait être essentiellement le même ( le nom de la fonction a changé ).
Vous devez installer le
kernel-debug-debuginfo
package approprié pour votre noyau (en supposant RHEL ou une distribution dérivée). Ce paquet fournit unevmlinux
image (une version non compressée non supprimée du noyau):cette image peut être utilisée directement avec
gdb
Vous pouvez également utiliser
objdump(1)
sur l'vmlinux
image:Les drapeaux sont:
Vous pouvez y rechercher la fonction:
et faire correspondre le décalage à la ligne de code réelle.
la source
Rendre la sortie de vidage de pile à nouveau utile.
la source
Si addr2line doit imprimer un point d'interrogation pour le numéro de ligne ou si objdump ne parvient pas à incorporer le code source et que vous avez un noyau personnalisé, assurez-vous de recompiler le noyau avec CONFIG_DEBUG_INFO défini. Vous devrez peut-être reproduire l'erreur avec le noyau qui vient d'être construit.
la source