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
vmlinuxnebo.kosoubor 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/0xf8co je+0x0/0xf8znamená?
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)