Skip to content

Cannot debug init using "qemu -s -S" if init is compiled dynamically or if kvm is enabled

Host environment

  • QEMU flavor: qemu-system-x86_64
  • Operating system: Debian sid (as of 2022-10-22)
  • OS/kernel version: Linux 6.0.0-1-amd64
  • Architecture: x86_64
  • QEMU version: QEMU emulator version 7.1.0 (Debian 1:7.1+dfsg-2+b1)
  • QEMU command line: qemu-system-x86_64 -daemonize -m 300M -s -S -kernel /vmlinuz -initrd /initrd.img -snapshot -append "root=/dev/sda init=/root/a.out" -drive file=/dev/sda,format=raw

Emulated/Virtualized environment

  • Operating system: Debian sid (as of 2022-10-22)
  • OS/kernel version: Linux 6.0.0-1-amd64
  • Architecture: x86_64

Description of problem

I'm trying to connect from host to init process running in guest. I'm using this guide: https://qemu-project.gitlab.io/qemu/system/gdb.html . Everything works well, but there is two problems:

  1. Debugging stops to work if I add "-enable-kvm"
  2. Debugging stops to work if I remove "-static" when compiling init

Steps to reproduce

I have absolutely fresh Debian sid system (as of 2022-10-22). I create the following file on it:

#include <stdio.h>

int
main ()
{
  printf ("a\n");
  printf ("b\n");
  for (;;);
}

Then I compile it so: gcc -static -g a.c. Result is saved as /root/a.out. Then I run sync; echo 3 > /proc/sys/vm/drop_caches; sync to make sure this /root/a.out actually got to disk.

Then I start the host system inside of qemu using well-known -snapshot /dev/sda trick. Exact command is here:

qemu-system-x86_64 -daemonize -m 300M -s -S -kernel /vmlinuz -initrd /initrd.img -snapshot -append "root=/dev/sda init=/root/a.out" -drive file=/dev/sda,format=raw

(As you guessed, my disk has no partitions, it directly stores ext4 filesystem.)

Then I type on host gdb ./a.out. And then inside of gdb I type target remote localhost:1234, then br 7 (line 7 is printf ("b\n"), then c. Then guest OS boots and reaches init (i. e. /root/a.out). And then gdb actually pauses on line 7. I. e. everything works!

But if I add -enable-kvm to qemu command line OR remove -static from gcc command line, then breakpoint doesn't work, i. e. gdb doesn't pause on breakpoint, the execution continues and the execution fails to infinite loop.

Edited by Askar Safin
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information