GNU/Linux >> Znalost Linux >  >> Linux

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

Další možností je použití ICE/JTAG řadiče a GDB. Toto „hardwarové“ řešení se používá zejména u vestavěných systémů,

ale například Qemu nabízí podobné funkce:

  • spusťte qemu pomocí gdb 'remote' stub, který poslouchá na 'localhost:1234' :qemu -s ... ,

  • pak pomocí GDB otevřete soubor jádra vmlinux zkompilovaný s informacemi o ladění (můžete se podívat do tohoto vlákna konference, kde se diskutuje o neoptimalizaci jádra).

  • propojit GDB a Qemu:target remote localhost:1234

  • vidět svůj živě jádro:

    (gdb) where
    #0  cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:77
    #1  0xc0029728 in arch_idle () atarm/mach-realview/include/mach/system.h:36
    #2  default_idle () at arm/kernel/process.c:166
    #3  0xc00298a8 in cpu_idle () at arch/arm/kernel/process.c:199
    #4  0xc00089c0 in start_kernel () at init/main.c:713
    

bohužel, ladění v uživatelském prostoru zatím není možné s GDB (žádné informace o seznamu úkolů, žádné přeprogramování MMU pro zobrazení různých kontextů procesů, ...), ale pokud zůstanete v kernel-space, je to docela pohodlné.

  • info threads vám poskytne seznam a stavy různých CPU

UPRAVIT:

Další podrobnosti o postupu můžete získat v tomto PDF:

Ladění systémů Linux pomocí GDB a QEMU.


Při ladění linuxového jádra můžeme využít několik nástrojů, například debuggery (KDB, KGDB), dumping při havárii (LKCD), sadu nástrojů pro sledování (LTT, LTTV, LTTng), vlastní nástroje jádra (dprobes, kprobes). V následující části jsem se pokusil shrnout většinu z nich, doufám, že vám to pomůže.

LKCD Nástroj (Linux Kernel Crash Dump) umožňuje systému Linux zapsat obsah své paměti, když dojde k havárii. Tyto protokoly lze dále analyzovat z hlediska hlavní příčiny havárie. Zdroje týkající se LKCD

  • http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/lkcd.pdf
  • https://www.novell.com/coolsolutions/feature/15284.html
  • https://www.novell.com/support/kb/doc.php?id=3044267

Jejda když jádro zjistí problém, vytiskne zprávu Jejda. Taková zpráva je generována příkazy printk v obslužném programu poruch (arch/*/kernel/traps.c). Vyhrazená kruhová vyrovnávací paměť v jádře, kterou používají příkazy printk. Oops obsahuje informace jako CPU, na kterém došlo k Oops, obsah registrů CPU, počet Oops, popis, trasování zpětného zásobníku a další. Zdroje týkající se jádra Jejda

  • https://www.kernel.org/doc/Documentation/oops-tracing.txt
  • http://madwifi-project.org/wiki/DevDocs/KernelOops
  • https://wiki.ubuntu.com/DebuggingKernelOops

Dynamické sondy je jedním z populárních ladicích nástrojů pro Linux, který vyvinula IBM. Tento nástroj umožňuje umístění „sondy“ téměř na libovolné místo v systému, v uživatelském i jaderném prostoru. Sonda se skládá z nějakého kódu (napsaného ve specializovaném, zásobníkově orientovaném jazyce), který se spustí, když kontrola zasáhne daný bod. Níže jsou uvedeny zdroje týkající se dynamické sondy

  • http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/dprobesltt.pdf
  • http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.107.6212&rep=rep1&type=pdf

Linux Trace Toolkit je záplata jádra a sada souvisejících nástrojů, které umožňují sledování událostí v jádře. Sledování zahrnuje informace o načasování a může vytvořit přiměřeně úplný obraz toho, co se stalo za dané časové období. Zdroje LTT, LTT Viewer a LTT Next Generation

  • http://elinux.org/Linux_Trace_Toolkit
  • http://www.linuxjournal.com/article/3829
  • http://multivax.blogspot.com/2010/11/introduction-to-linux-tracing-toolkit.html

MEMWATCH je open source nástroj pro detekci chyb paměti. Funguje to tak, že definujete MEMWATCH v příkazu gcc a přidáte hlavičkový soubor do našeho kódu. Díky tomu můžeme sledovat úniky paměti a poškození paměti. Zdroje týkající se MEMWATCH

  • http://www.linuxjournal.com/article/6059

ftrace je dobrý sledovací rámec pro linuxové jádro. ftrace sleduje vnitřní operace jádra. Tento nástroj je součástí linuxového jádra v 2.6.27. Pomocí různých sledovacích zásuvných modulů lze ftrace zacílit na různé statické sledovací body, jako jsou plánování událostí, přerušení, paměťově mapované I/O, přechody stavu napájení CPU a operace související se souborovými systémy a virtualizací. K dispozici je také dynamické sledování volání funkcí jádra, které lze volitelně omezit na podmnožinu funkcí pomocí globů a s možností generovat grafy volání a poskytovat využití zásobníku. Dobrý tutoriál ftrace najdete na https://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_rostedt.pdf

ltrace je ladicí nástroj v Linuxu, který se používá k zobrazení volání, která aplikace uživatelského prostoru provádí do sdílených knihoven. Tento nástroj lze použít ke sledování libovolného volání funkce dynamické knihovny. Zachycuje a zaznamenává volání dynamických knihoven, která jsou volána prováděným procesem, a signály, které tento proces přijímá. Může také zachytit a vytisknout systémová volání prováděná programem.

  • http://www.ellexus.com/getting-started-with-ltrace-how-does-it-do-that/?doing_wp_cron=1425295977.1327838897705078125000
  • http://developerblog.redhat.com/2014/07/10/ltrace-for-rhel-6-and-7/

KDB je in-kernel debugger linuxového jádra. KDB následuje zjednodušené rozhraní ve stylu shellu. Můžeme jej použít k prohlídce paměti, registrů, procesních seznamů, dmesg a dokonce i k nastavení bodů přerušení na určitém místě. Prostřednictvím KDB můžeme nastavovat body přerušení a provádět některé základní kontroly běhu jádra (Přestože KDB není ladicí program na úrovni zdroje ). Několik užitečných zdrojů týkajících se KDB

  • http://www.drdobbs.com/open-source/linux-kernel-debugging/184406318
  • http://elinux.org/KDB
  • http://dev.man-online.org/man1/kdb/
  • https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/usingKDB.html

KGDB je určen k použití jako ladicí program na úrovni zdroje pro linuxové jádro. Používá se spolu s gdb k ladění linuxového jádra. Pro použití kgdb jsou zapotřebí dva stroje. Jeden z těchto strojů je vývojový stroj a druhý je cílový stroj. Jádro, které se má ladit, běží na cílovém počítači. Očekává se, že gdb lze použít k „nabourání“ do jádra ke kontrole paměti, proměnných a prohlížení informací o zásobníku volání podobně, jako by vývojář aplikace použil gdb k ladění aplikace. Je možné umístit body přerušení do kódu jádra a provést některé omezené krokování provádění. Několik užitečných zdrojů týkajících se KGDB

  • http://landley.net/kdocs/Documentation/DocBook/xhtml-nochunks/kgdb.html

Podle wiki kgdb byl začleněn do jádra v 2.6.26 což je v posledních několika letech. kgdb je vzdálený debugger, takže jej aktivujete v jádře a pak k němu nějak připojíte gdb. Říkám nějak, protože se zdá, že existuje spousta možností - viz připojení gdb. Vzhledem k tomu, že kgdb je nyní ve zdrojovém stromě, řekl bych, že v budoucnu to je to, co chcete používat.

Takže to vypadá, že Linus ustoupil. Nicméně bych zdůraznil jeho argument - měli byste vědět, co děláte, a dobře znát systém. Toto je půda jádra. Pokud se něco pokazí, nedostanete segfault , dostanete cokoli od nějakého obskurního problému později až po pád celého systému. Tady jsou draci. Pokračujte opatrně, byli jste varováni.


Linux
  1. Flatpak na Linuxu:Co to je a jak s ním instalovat aplikace

  2. Co je FirewallD a jak jej implementovat v systému Linux

  3. Linux – jaké zdroje entropie používá jádro Linuxu?

  1. Co je příkaz Chown v Linuxu a jak jej používat

  2. Jak zjistím, jaký je můj nejpoužívanější linuxový příkaz?

  3. Co je velká a nízká paměť v Linuxu?

  1. Co je NFS a jak jej nainstalovat na Linux

  2. Linux – Co je velká a nízká paměť v Linuxu?

  3. Co jsou uživatelé SELinuxu a jak mapovat uživatele Linuxu na uživatele SELinuxu