2017-06-18 97 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太有趣而不能被禁用)。