GNU/Linux >> Znalost Linux >  >> Linux

Jak číst, chápat, analyzovat a ladit paniku linuxového jádra?

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 :

  1. 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
    
  2. Otevřete vygenerovaný soubor sestavy /tmp/kernel.s . pomocí textového editoru, jako je vim . Přejděte na unwind_backtrace+0x0/0xf8 , tj. vyhledejte adresu unwind_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:

  1. Spusťte gdb <path-to-vmlinux> .
  2. Spustit ve výzvě gdb:list *(unwind_backtrace+0x10) .

Další informace získáte v následujících zdrojích:

  1. Triky ladění jádra.
  2. 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)


Linux
  1. Proměnné prostředí Linux:Jak číst a nastavovat na Linux VPS

  2. Jak ladit linuxové jádro pomocí GDB a QEMU?

  3. Jak kódovat modul jádra Linuxu?

  1. Jak zvládnout paniku linuxového jádra

  2. Jak upgradovat jádro na ploše Linuxu

  3. Jak včas nakonfigurovat jádro Linuxu, aby se restartovalo v panice?

  1. Linux – Jak ladit problém s pozastavením paměti RAM v systému Linux?

  2. Živé ladění linuxového jádra, jak se to dělá a jaké nástroje se používají?

  3. Jak číst manuálové stránky Linuxu?