GNU/Linux >> Znalost Linux >  >> Linux

Ladění linuxového jádra pomocí QEMU

V závislosti na distribuci, kterou chcete použít, existují různé způsoby, jak vytvořit bitovou kopii systému souborů, např. tento článek vás provede pracnou cestou k "Linuxu od nuly" systém.

Obecně , buď vytvořte obrázek QEMU pomocí qemu-img , načtěte instalační médium distribuce a použijte QEMU s instalačním médiem k přípravě obrazu (tato stránka vysvětluje postup pro Debian GNU/Linux) nebo použijte obrázek připravený někým jiným.

Tato část Wikibook QEMU obsahuje všechny informace, které potřebujete.

Upravit: Jak naznačuje Gillesova odpověď na propojenou otázku, k testování nepotřebujete plnohodnotný kořenový souborový systém, stačí použít initrd image (řekněme initrd Arch Linuxu jako zde)


Procedura QEMU + GDB krok za krokem testována na hostiteli Ubuntu 16.10

Abychom mohli rychle začít od nuly, vytvořil jsem minimální plně automatizovaný příklad QEMU + Buildroot na:https://github.com/cirosantilli/linux-kernel-module-cheat Hlavní kroky jsou popsány níže.

Nejprve získejte kořenový souborový systém rootfs.cpio.gz . Pokud jej potřebujete, zvažte:

  • minimálně init -pouze spustitelný obraz:Vlastní Linuxová distribuce, která spouští pouze jeden program, nic jiného | Unix &Linux Stack Exchange
  • Interaktivní systém Busybox:Jaká je nejmenší možná implementace Linuxu? | Unix &Linux Stack Exchange

Pak na linuxovém jádře:

git checkout v4.9
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
                   -initrd rootfs.cpio.gz -S -s

Na jiném terminálu, předpokládejme, že chcete začít s laděním od start_kernel :

gdb \
    -ex "add-auto-load-safe-path $(pwd)" \
    -ex "file vmlinux" \
    -ex 'set arch i386:x86-64:intel' \
    -ex 'target remote localhost:1234' \
    -ex 'break start_kernel' \
    -ex 'continue' \
    -ex 'disconnect' \
    -ex 'set arch i386:x86-64' \
    -ex 'target remote localhost:1234'

a máme hotovo!!

Moduly jádra viz:Jak ladit moduly jádra Linuxu pomocí QEMU? | Přetečení zásobníku

Pro Ubuntu 14.04, GDB 7.7.1, hbreak bylo potřeba, break softwarové body přerušení byly ignorovány. Od 16.10 to neplatí. Viz také:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

Nepořádný disconnect a co přijde po tom, je obejít chybu:

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000

Související vlákna:

  • https://sourceware.org/bugzilla/show_bug.cgi?id=13984 může být chyba GDB
  • gdb – Vzdálená odpověď paketu 'g' je příliš dlouhá | Přetečení zásobníku
  • http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org je jako obvykle skvělým zdrojem těchto problémů
  • https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html

Viz také:

  • https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst oficiální "dokumentace" linuxového jádra
  • Jak ladit linuxové jádro pomocí GDB a QEMU? | Přetečení zásobníku

Známá omezení:

  • jádro Linuxu nepodporuje (a ani se nezkompiluje bez oprav) s -O0 :Jak de-optimalizovat linuxové jádro a zkompilovat jej s -O0? | Přetečení zásobníku
  • GDB 7.11 vám při některých typech dokončování karet vybije paměť, a to i po max-completions oprava:Přerušení dokončování tabulátoru pro velké binární soubory | Stack Overflow Pravděpodobně nějaké rohové pouzdro, které nebylo pokryto tím patchem. Takže ulimit -Sv 500000 je moudrá akce před laděním. Vybuchlo konkrétně, když jsem dokončil kartu file<tab> pro filename argument sys_execve jako v:Může systémové volání sys_execve() v jádře Linuxu přijímat absolutní nebo relativní cesty? | Přetečení zásobníku

Linux
  1. Trasování jádra pomocí trace-cmd

  2. Analyzujte linuxové jádro pomocí ftrace

  3. JQ Command v Linuxu s příklady

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

  2. Ladění linuxové I/O latence

  3. Kompilace GNU/Linux s optimalizací -O3

  1. Nainstalujte Linux pomocí LVM

  2. Mohu Qemu ukončit se selháním při panice jádra?

  3. Linux Centos s časovým razítkem dmesg