我是Linux内核的新手,我正尝试通过QEMU使用gdb对其进行调试。我的问题是break start_kernel
之后gdb不会停止。详情如下。
我的主机系统是ArchLinux 5.0.10-arch1-1-ARCH x86_64
。
Qemu是QEMU emulator version 4.0.0
gdb是GNU gdb (GDB) 8.2.1
。
已调试内核为linux-4.20.12
我已完成以下步骤:
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
# CONFIG_DEBUG_INFO_REDUCED is not set
qemu-system-x86_64 lfs-8.4-08052019.raw
系统启动良好。
stop CPU
和gdbserver
选项运行此系统qemu-system-x86_64 lfs-8.4-08052019.raw -S -s
$ gdb
(gdb) file /mnt/lfs/sources/linux-4.20.12/vmlinux
Reading symbols from /mnt/lfs/sources/linux-4.20.12/vmlinux...done.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x000000000000fff0 in cpu_hw_events ()
(gdb) break start_kernel
Breakpoint 1 at 0xffffffff82761ab5: file init/main.c, line 538.
(我已经尝试过硬件断点hbreak
,但结果相同)
(gdb) c
Continuing.
进一步的系统会加载登录提示,而不会出现任何中断,并且gdb不会显示任何新消息。 我做错了什么?
UPD:使用嵌入的-kernel
工具启动QEMU会得到相同的结果
qemu-system-x86_64 -kernel /mnt/lfs/sources/linux-4.20.12/arch/x86/boot/bzImage -append 'root=/dev/sda3' -drive file=lfs-8.4-08052019.raw -S -s
UPD2:我试图在没有-S
键的情况下启动QEMU并立即在gdb中运行target remote localhost:1234
。 QEMU已停止在以下位置加载
Decompressing Linux... Parsing ELF... Performing relocations... done.
Booting kernel.
当我在gdb中键入s
时会说
(gdb) s
Cannot find bounds of current function
我怀疑vmlinux中的调试符号与bzImage无关。也许它们被弄错了,但是我不怎么用其他方式来制造它们。
UPD3:我已经在LFS-8.4 chroot环境中构建了内核2.6
。系统未加载,但是内核已通过上述方法成功调试!因此,我认为这是新内核的问题。也许我应该关闭/打开4.20.12内核中的某些内容,但是我不知道到底是什么。对于我的目的(阅读Robert Love“ Linux Kernel Development”),内核版本2.6就足够了。
答案 0 :(得分:1)
您需要将nokaslr传递给内核cmdline。
qemu-system-x86_64-内核/mnt/lfs/sources/linux-4.20.12/arch/x86/boot/bzImage-追加'root = / dev / sda3 nokaslr'-驱动器文件= lfs-8.4-08052019 .raw -S -s