天天看點

qemu+gdb調試核心子產品

制作qemu虛拟機

看這裡如果是PC的話,就不用配置vnc了。

虛拟機配置完畢後要把​

​-enable-kvm​

​​去掉再重新開機,不然軟體斷點不起作用。此外,加上​

​-s​

​以啟動gdbserver。

sudo qemu-system-x86_64 -m 4096 centos.img -net nic -net tap,ifname=tap0,script=no,downscript=no -s      

關掉了kvm之後開機特别慢,我這要兩百多秒。

設定nokaslr

編譯核心子產品

Makefile裡加上

ccflags-y += -g -DDEBUG -O1      

不能用​

​-O0​

​,可能會報錯。

配置gdb

在~/.gdbinit裡加上

add-auto-load-safe-path /full_path_to_kernel_build_dir/scripts/gdb/vmlinux-gdb.py      

例如

add-auto-load-safe-path /mnt/hdd/kernel/gdb/linux-nova/scripts/gdb/vmlinux-gdb.py      

這樣gdb裡就可以用​

​lx-symbols​

​了。

gdb連上qemu并設定自動加載子產品符号

cd      

然後在gdb裡執行

target remote :1234      

輸出:

0xffffffff827302c2 in native_safe_halt () at ./arch/x86/include/asm/irqflags.h:57
57              asm volatile("sti; hlt": : :"memory");      

然後設定自動加載子產品符号,在gdb裡繼續執行:

lx-symbols path/to/parent/of/modules/      

輸出:

loading vmlinux
scanning for modules in /home/searchstar/git/projects/nova/
scanning for modules in /mnt/hdd/kernel/gdb/linux-nova
loading @0xffffffffc1090000: /mnt/hdd/kernel/gdb/linux-nova/arch/x86/kernel/msr.ko
loading @0xffffffffc1088000: /mnt/hdd/kernel/gdb/linux-nova/net/netfilter/nft_fib_inet.ko
loading @0xffffffffc1080000: /mnt/hdd/kernel/gdb/linux-nova/net/ipv4/netfilter/nft_fib_ipv4.ko
此處省略若幹行
loading @0xffffffffc0000000: /mnt/hdd/kernel/gdb/linux-nova/fs/autofs/autofs4.ko      

insmod

在gdb裡輸入c

(gdb) c
Continuing.      

在gdb中設定斷點

(gdb) b nova_init_blockmap
Breakpoint 1 at 0xffffffffc10992ab: file /home/searchstar/git/projects/nova/balloc.c, line 212.      

跑起來

(gdb) c
Continuing.

Breakpoint 1, nova_init_blockmap (sb=0xffff88809ee9cb08)
    at /home/searchstar/git/projects/nova/balloc.c:212
212     {
(gdb) n
213             struct nova_sb_info *sbi = NOVA_SB(sb);
(gdb) n
214             unsigned long mask_bits = ceil_log_2(sbi->num_blocks);
(gdb) n
224             while (a * 5 < (1 << max_bits_a)) {      

繼續閱讀