Zde jsou dvě alternativy pro addr2line
. Za předpokladu, že máte správný cílový nástrojový řetězec, můžete provést jednu z následujících akcí:
Použijte objdump
:
-
vyhledejte svůj
vmlinux
nebo.ko
soubor v kořenovém adresáři jádra a poté rozeberte objektový soubor :objdump -dS vmlinux > /tmp/kernel.s
-
Otevřete vygenerovaný soubor sestavy
/tmp/kernel.s
. pomocí textového editoru, jako jevim
. Přejděte naunwind_backtrace+0x0/0xf8
, tj. vyhledejte adresuunwind_backtrace
+offset
. Konečně jste našli problematickou část ve zdrojovém kódu.
Použijte gdb
:
IMO, ještě elegantnější možností je použít jediný gdb
. Za předpokladu, že máte na svém hostitelském počítači vhodný toolchain:
- Spusťte
gdb <path-to-vmlinux>
. - Spustit ve výzvě gdb:
list *(unwind_backtrace+0x10)
.
Další informace získáte v následujících zdrojích:
- Triky ladění jádra.
- Ladění linuxového jádra pomocí Gdb
V
unwind_backtrace+0x0/0xf8
co je+0x0/0xf8
znamená?
První číslo (+0x0
) je posun od začátku funkce (unwind_backtrace
v tomto případě). Druhé číslo (0xf8
) je celková délka funkce . Vzhledem k těmto dvěma informacím, pokud již máte tušení o tom, kde došlo k chybě, mohlo by to stačit k potvrzení vašeho podezření (můžete říci (zhruba), jak daleko jste ve funkci byli).
Chcete-li získat přesný zdrojový řádek odpovídající instrukce (obecně lepší než tušení), použijte addr2line
nebo jiné metody v jiných odpovědích.
Je to jen obyčejný backtrace, tyto funkce jsou volány v obráceném pořadí (první volaná byla volána předchozí a tak dále):
unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150
bdi_register+0xec/0x150
je symbol + offset/délka, o tom je více informací v Understanding a Kernel Oops a jak můžete ladit kernel oops. Také je zde tento vynikající návod na ladění jádra
Poznámka:Jak navrhuje Eugene níže, možná budete chtít nejprve vyzkoušet addr2line, ale stále potřebuje obrázek se symboly ladění, například
addr2line -e vmlinux_with_debug_info 0019594c(+offset)