使用 qemu 调试 linux kernel
在 Ubuntu 中build kernel 参考如下:
可以直接在宿主机调试kernel, 但是当发生崩溃之后,工作环境又要重新配置。
所以考虑用 qemu,因为它有个option: -kernel, 可以直接引导kernel。比 VirtualBox 等虚拟机更快速更方便。
- 尝试使用 qemu 直接启动主机上的kernel
-
$ sudo qemu-system-x86_64 -kernel /boot/vmlinuz-`uname -r`
这会提示缺少文件系统
-
可以使用 debootstrap 构建一个rootfs
IMG=qemu-image.img DIR=mount-point.dir qemu-img create $IMG 1g mkfs.ext2 $IMG mkdir $DIR sudo mount -o loop $IMG $DIR sudo debootstrap --arch amd64 jessie $DIR sudo umount $DIR rmdir $DIR
这里最好用一下 chroot 和 passwd 更新一下文件系统里的密码,以免启动之后登不进去。
-
build kernel
git clone --depth=1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git cd linux make x86_64_defconfig make kvmconfig make -j 8
-
menuconfig 使能调试信息选项
[*] KGDB: kernel debugger ---> <*> KGDB: use kgdb over the serial console -> Compile-time checks and compiler options [*] Compile the kernel with debug info
-
booting kernel, 使用 -s 选项 (short stand for -gdb tcp::1234)
$ qemu-system-x86_64 -kernel arch/x86/boot/bzImage -hda qemu-image.img -append "root=/dev/sda" -s
-
然后在另一个终端用gdb 连接它就可以了
$ gdb vmlinux (gdb) target remote localhost:1234 (gdb) breakpoint spin_lock (gdb) continue
-
如果是在非 GUI 环境调试可以指定一下 console 和增加 –nographic 选项
$ qemu-system-x86_64 -kernel bzImage -append "root=/dev/sda console=ttyS0" -hda qemu-image.img --enable-kvm --nographic
-
Kmemleak 用来查找内存泄漏
-> Memory Debugging [*]Enable kernel memory leak detector. (2000) Maximum kmemleak early log entries
在dmesg 中可以看到,或者
$ echo scan >> /sys/kernel/debug/kmemleak $ cat /sys/kernel/debug/kmemleak
-
使能网卡
$ qemu-system-x86_64 -kernel bzImage -append "root=/dev/sda console=ttyS0 single" -drive file=toto.img,index=0,media=disk,format=raw --enable-kvm --nographic -net nic -net user,hostfwd=tcp::5555-:22
$ ssh -p 5555 fredo@localhost
- More kernel debugging options
-
dynamic_debug:
-> printk and dmesg options [*] Enable dynamic printk() support
ftrace
-> Tracers (FTRACE [=y])
Tags: kernel debug, qemu