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.