GNU/Linux >> Tutoriels Linux >  >> Linux

Débogage du noyau Linux avec QEMU

Selon la distribution que vous souhaitez utiliser, il existe différentes manières de créer une image de système de fichiers, par ex. cet article vous guide à travers le chemin laborieux vers un "Linux from Scratch" système.

En général , vous feriez soit créer une image QEMU en utilisant qemu-img , récupérez le support d'installation de certaines distributions et utilisez QEMU avec le support d'installation pour préparer l'image (cette page explique le processus pour Debian GNU/Linux) ou utiliser une image préparée par quelqu'un d'autre.

Cette section du Wikibook QEMU contient toutes les informations dont vous avez besoin.

Modifier : Comme le suggère la réponse de Gilles à la question liée, vous n'avez pas besoin d'un système de fichiers racine complet pour les tests, vous pouvez simplement utiliser un initrd image (par exemple, l'initrd d'Arch Linux comme ici)


Procédure étape par étape QEMU + GDB testée sur l'hôte Ubuntu 16.10

Pour démarrer rapidement à partir de zéro, j'ai créé un exemple minimal de QEMU + Buildroot entièrement automatisé à l'adresse :https://github.com/cirosantilli/linux-kernel-module-cheat Les principales étapes sont décrites ci-dessous.

Obtenez d'abord un système de fichiers racine rootfs.cpio.gz . Si vous en avez besoin, pensez à :

  • un minimum de init -seule image exécutable :distribution Linux personnalisée qui exécute un seul programme, rien d'autre | Échange de pile Unix et Linux
  • un système interactif Busybox :quelle est la plus petite implémentation Linux possible ? | Échange de pile Unix et Linux

Puis sur le noyau 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

Sur un autre terminal, supposons que vous souhaitiez commencer le débogage à partir de 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'

et nous avons terminé !!

Pour les modules du noyau, voir :Comment déboguer les modules du noyau Linux avec QEMU ? | Débordement de pile

Pour Ubuntu 14.04, GDB 7.7.1, hbreak était nécessaire, break les points d'arrêt logiciels ont été ignorés. Ce n'est plus le cas en 16.10. Voir aussi :https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

Le désordre disconnect et ce qui vient après pour contourner l'erreur :

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

Discussions associées :

  • https://sourceware.org/bugzilla/show_bug.cgi?id=13984 pourrait être un bogue GDB
  • gdb - La réponse du paquet distant 'g' est trop longue | Débordement de pile
  • http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org est comme d'habitude une source géniale pour ces problèmes
  • https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html

Voir aussi :

  • https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst "documentation" officielle du noyau Linux
  • Comment déboguer le noyau Linux avec GDB et QEMU ? | Débordement de pile

Limitations connues :

  • le noyau Linux ne prend pas en charge (et ne compile même pas sans correctifs) avec -O0 :Comment désoptimiser le noyau Linux et le compiler avec -O0 ? | Débordement de pile
  • GDB 7.11 vous explosera la mémoire sur certains types de complétion de tabulation, même après le max-completions correctif :Interruption de fin de tabulation pour les fichiers binaires volumineux | Stack Overflow Probablement un cas particulier qui n'était pas couvert par ce patch. Donc un ulimit -Sv 500000 est une action sage avant le débogage. A explosé spécifiquement lorsque j'ai terminé l'onglet file<tab> pour le filename argument de sys_execve comme dans :L'appel système sys_execve() dans le noyau Linux peut-il recevoir à la fois des chemins absolus ou relatifs ? | Débordement de pile

Linux
  1. Traçage du noyau avec trace-cmd

  2. Analyser le noyau Linux avec ftrace

  3. Commande JQ sous Linux avec exemples

  4. Débogage de la latence d'E/S Linux

  5. Puis-je faire quitter Qemu avec un échec lors d'une panique du noyau ?

Commande Sysctl sous Linux

15 Commande Linux ps avec exemples

Linux est-il un système d'exploitation ou un noyau ?

Le noyau Linux contre. Mac noyau

Gérer et surveiller les modules du noyau Linux avec Kmon

Patcher le noyau Linux Raspberry Pi avec KernelCare GRATUITEMENT !