为什么我无法在 QEMU 中的 linux 内核入口处设置断点?

问题描述 投票:0回答:1

最近,我开始使用QEMU(qemu-system-x86_64)和gdb调试Linux内核5.18.10。我知道QEMU的BIOS在QEMU启动时会将内核代码加载到0x10000,而QEMU在Linux内核中执行的第一条指令位于0x10200。所以我在0x10200处设置了断点。当向gdb发送

continue
命令后,它收到“程序收到信号SIGTRAP,跟踪/断点陷阱”的消息。然后EIP被设置为0x0。所以我无法调试Linux启动进度。

我想问一下有人能解决吗?非常感谢。

下面的文字是我在 QEMU 和 gdb 中的操作和输出。

  1. 运行QEMU:
qemu-system-x86_64 -kernel ./arch/x86_64/boot/bzImage \
                   -device virtio-serial \
                   -chardev pty,id=virtiocon0 -device virtconsole\
                   -drive file=core-image-minimal-qemux86.ext4,if=virtio,format=ra\
                   --append "root=/dev/vda loglevel=15 console=tt\
                   -nographic \
                   -m 256 -s -S
  1. 运行gdb:
gdb /home/wt/gitrepo/linux/vmlinux

和我的.gdbinit

add-auto-load-safe-path /home/wt/gitrepo/linux/scripts/gdb/vmlinux-gdb.py
dir /home/wt/gitrepo/linux
target remote :1234
  1. 在0x10200处设置断点:
// output of gdb
(gdb) b *0x10200
Breakpoint 1 at 0x10200
  1. 继续 gdb:
// output of QEMU
SeaBIOS (version 1.15.0-1)


iPXE (https://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+0FF8B2A0+0FECB2A0 CA00



Booting from ROM..
// output of gdb
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
linux debugging linux-kernel gdb qemu
1个回答
0
投票

过去几天我一直在为同样的行为而苦苦挣扎。 对于处于相同情况的任何人,原因如下:

gdb 或您的启动过程没有任何问题。发生的情况是,您遇到了断点,EIP 将变为 0x0,但您的 CS 也在发生变化。特别是去0x1020。 所以下一条指令实际上是在:

0x1020 * 16 + 0x0 = 0x10200

这正是您想要的。您可以按以下顺序查看:

(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x000000000000fff0 in exception_stacks ()
(gdb) info reg $pc
pc             0xfff0              0xfff0 <exception_stacks+16368>
(gdb) info reg $cs
cs             0xf000              61440
(gdb) b *0x10200
Breakpoint 1 at 0x10200
(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
(gdb) info reg $pc
pc             0x0                 0x0 <fixed_percpu_data>
(gdb) info reg $cs
cs             0x1020              4128

从那里您可以以实模式进入内核启动。

问候!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.