2017-06-18 22 views
2

GEMを使ってQEMU内でカーネルを実行させようとしましたが、リモートデバッグには使用できませんでしたが、ステップバイステップやブレークポイントを設定することはできません。ここで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ので、プログラムの$ripは、あなたが.text.data.bssのアドレスを指定することができるように(代わりにfileのカーネルシンボルファイルを追加するadd-symbol-fileを使用し、むしろそれはGDBで0xffffffffa1xxxxxx

で、0xffffffff81xxxxxxで起動しません)、またはカーネルargsでkaslrを無効にします。 (私は前者を好む、kaslrは無効にするには面白いです。)

関連する問題