GNU/Linux >> Linux Esercitazione >  >> Linux

Debug del kernel Linux con QEMU

A seconda della distribuzione che desideri utilizzare, esistono vari modi per creare un'immagine del file system, ad es. questo articolo ti guida attraverso il laborioso percorso verso un "Linux from Scratch" sistema.

In generale , lo faresti o crea un'immagine QEMU usando qemu-img , recupera i supporti di installazione di alcune distribuzioni e usa QEMU con il supporto di installazione per preparare l'immagine (questa pagina spiega il processo per Debian GNU/Linux) oppure usa un'immagine preparata da qualcun altro.

Questa sezione del QEMU Wikibook contiene tutte le informazioni di cui hai bisogno.

Modifica: Come suggerisce la risposta di Gilles alla domanda collegata, non hai bisogno di un file system root completo per il test, potresti semplicemente usare un initrd image (diciamo, initrd di Arch Linux come qui)


Procedura dettagliata QEMU + GDB testata su host Ubuntu 16.10

Per iniziare rapidamente da zero, ho creato un esempio minimo di QEMU + Buildroot completamente automatizzato su:https://github.com/cirosantilli/linux-kernel-module-cheat I passaggi principali sono descritti di seguito.

Per prima cosa prendi un filesystem root rootfs.cpio.gz . Se ne hai bisogno, considera:

  • un init minimo -sola immagine eseguibile:Distro Linux personalizzata che esegue un solo programma, nient'altro | Scambio stack Unix e Linux
  • un sistema interattivo Busybox:qual è l'implementazione Linux più piccola possibile? | Scambio stack Unix e Linux

Quindi sul kernel Linux:

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

Su un altro terminale, supponendo di voler avviare il debug da 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'

e abbiamo finito!!

Per i moduli del kernel vedere:Come eseguire il debug dei moduli del kernel Linux con QEMU? | Overflow dello stack

Per Ubuntu 14.04, GDB 7.7.1, hbreak era necessario, break i punti di interruzione del software sono stati ignorati. Non è più il caso in 16.10. Vedi anche:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

Il disordinato disconnect e ciò che viene dopo è per aggirare l'errore:

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

Discussioni correlate:

  • https://sourceware.org/bugzilla/show_bug.cgi?id=13984 potrebbe essere un bug di GDB
  • gdb - La risposta del pacchetto 'g' remoto è troppo lunga | Overflow dello stack
  • http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org è come al solito una fantastica fonte per questi problemi
  • https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html

Vedi anche:

  • https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst "documentazione" ufficiale del kernel Linux
  • Come eseguire il debug del kernel Linux con GDB e QEMU? | Overflow dello stack

Limitazioni note:

  • il kernel Linux non supporta (e non compila nemmeno senza patch) con -O0 :Come de-ottimizzare il kernel Linux e compilarlo con -O0? | Overflow dello stack
  • GDB 7.11 ti lascerà a bocca aperta su alcuni tipi di completamento delle schede, anche dopo il max-completions correzione:interruzione del completamento della scheda per file binari di grandi dimensioni | Stack Overflow Probabilmente un caso d'angolo che non è stato trattato in quella patch. Quindi un ulimit -Sv 500000 è un'azione saggia prima del debug. È esploso in particolare quando ho completato la scheda file<tab> per il filename argomento di sys_execve come in:la chiamata di sistema sys_execve() nel kernel Linux può ricevere percorsi sia assoluti che relativi? | Overflow dello stack

Linux
  1. Traccia del kernel con trace-cmd

  2. Analizza il kernel Linux con ftrace

  3. Comando JQ in Linux con esempi

  4. Come eseguire il debug del kernel Linux con GDB e QEMU?

  5. Debug della latenza I/O di Linux

Comando Sysctl in Linux

15 Comando Linux ps con esempi

Linux è un sistema operativo o un kernel?

Kernel Linux vs. Kernel Mac

Gestisci e monitora i moduli del kernel Linux con Kmon

Patch del kernel Linux Raspberry Pi con KernelCare GRATIS!