2017-06-18 93 views
2

我一直在嘗試讓QEMU在使用GDB遠程調試它的情況下執行內核,但是我無法步進或設置斷點。這裏的GDB會話:無法使用QEMU/GDB調試內核

linux (master *) $ gdb vmlinux 
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git 
Copyright (C) 2016 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
[LICENSE TEXT] 
The target architecture is assumed to be i386:x86-64 
Reading symbols from vmlinux...done. 
(gdb) target remote localhost:1234 
localhost:1234: Connection timed out. 
(gdb) target remote localhost:1234 
Remote debugging using localhost:1234 
0xffffffffa13507ee in ??() 
(gdb) c 
Continuing. 
^C 
Thread 1 received signal SIGINT, Interrupt. 
0xffffffffa13507ee in ??() 
(gdb) b rcu_process_callbacks 
Breakpoint 1 at 0xffffffff81101800: file kernel/rcu/tree.c, line 3037. 
(gdb) c 
Continuing. 
Warning: 
Cannot insert breakpoint 1. 
Cannot access memory at address 0xffffffff81101800 

Command aborted. 
(gdb) 

我編譯與調試符號的內核內核文檔中提到:

linux (master *) $ grep CONFIG_DEBUG .config | grep -v "^#" 
CONFIG_DEBUG_DEVRES=y 
CONFIG_DEBUG_INFO=y 
CONFIG_DEBUG_FS=y 
CONFIG_DEBUG_KERNEL=y 
CONFIG_DEBUG_STACK_USAGE=y 
CONFIG_DEBUG_MEMORY_INIT=y 
CONFIG_DEBUG_STACKOVERFLOW=y 
CONFIG_DEBUG_BUGVERBOSE=y 
CONFIG_DEBUG_BOOT_PARAMS=y 

如果構建內核調試符號我還檢查。

linux (master *) $ nm --debug-syms vmlinux | grep "\.debug" 
0000000000000000 N .debug_abbrev 
0000000000000000 N .debug_aranges 
0000000000000000 N .debug_frame 
0000000000000000 N .debug_info 
0000000000000000 N .debug_line 
0000000000000000 N .debug_loc 
0000000000000000 N .debug_ranges 
0000000000000000 N .debug_str 

我運行QEMU使用以下命令行:

linux (master *) $ qemu-system-x86_64 -smp 4 -cpu host \ 
-m 2048 -kernel arch/x86/boot/bzImage \ 
-initrd ../obj/initramfs-busybox-x86.cpio.gz -nographic \ 
-append "console=ttyS0" -enable-kvm \ 
-drive file=../disk.img,if=virtio,cache=none -s 

我缺少的是這可能導致GDB失敗也是這樣嗎?我也無法從內核GDB腳本執行GDB擴展命令,所以我猜這必須讓GDB不知道它正在調試內核?我需要啓用KGDB才能工作嗎?

我正在使用Linux 4.12-rc5內核。

回答

1

它是KASLR(內核地址空間佈局隨機化)。

因爲$pc,程序$rip0xffffffff81xxxxxx啓動,而它是0xffffffffa1xxxxxx

在gdb中,使用add-symbol-file補充,而不是file內核符號文件(這樣你可以指定.text.data.bss地址),或者在內核參數中禁用kaslr。 (我更喜歡前者,kaslr太有趣而不能被禁用)。