Biorąc pod uwagę ślad stosu jądra, jak poniżej, jak określić konkretny wiersz kodu, w którym wystąpił problem?
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
Chociaż nie mam problemu ze znalezieniem wywołania funkcji, ale trudność stanowi tłumaczenie __link_path_walk plus przesunięcie do rzeczywistego numeru linii.
Zakładając, że jest to standardowe jądro dostarczane przez dystrybucję, dla którego znam dokładną wersję i numer kompilacji, jaki jest proces pobierania niezbędnych metadanych i wykonywania odpowiedniego wyszukiwania?
CONFIG_KALLSYMS
: github.com/cirosantilli/linux-kernel-module-cheat/tree/…Nie mam pod ręką ~ = RHEL5, więc pokazane dane wyjściowe pochodzą z Fedory 20, chociaż proces powinien być w większości taki sam ( nazwa funkcji uległa zmianie ).
Musisz zainstalować odpowiedni
kernel-debug-debuginfo
pakiet dla swojego jądra (przy założeniu dystrybucji RHEL lub pochodnej). Ten pakiet zawieravmlinux
obraz (nieskompresowana, nie pozbawiona wersji wersja jądra):tego obrazu można użyć bezpośrednio z
gdb
Możesz również użyć
objdump(1)
navmlinux
obrazie:Flagi to:
Możesz tam wyszukać funkcję:
i dopasuj przesunięcie do rzeczywistej linii kodu.
źródło
Spraw, aby dane wyjściowe zrzutu stosu były ponownie przydatne.
źródło
Jeśli addr2line wypisze znak zapytania dla numeru linii lub objdump nie wstawi kodu źródłowego i masz niestandardowe jądro, koniecznie skompiluj jądro z ustawionym CONFIG_DEBUG_INFO. Może być konieczne odtworzenie błędu z właśnie zbudowanym jądrem.
źródło