19

我正在尝试使用 kvm vm 调试 Linux 内核。我收到一条错误消息“远程 'g' 数据包回复太长”。我的主机是 64 位的,我的 vm 也是。

我的步骤:

  1. 使用自定义 -kernel、-initrd 和 -append 选项启动 VM。
  2. 启动 gdb
  3. 执行“设置架构 i386:x86-64:intel”
  4. 执行“添加符号文件linux-3.0/vmlinux”
  5. 执行“show arch”来验证它仍然是“i386:x86-64:intel”
  6. 执行“目标远程本地主机:1234”
  7. 执行“继续”
  8. 按 Ctrl+C,我收到上面的消息。

有没有人遇到过这个问题?

4

4 回答 4

14

gdb 不适用于在运行时在指令集之间切换的 cpu。在连接之前等待内核离开 early boot,并且不要使用 qemu 的-S标志。

于 2013-05-09T11:33:56.643 回答
10

我也遇到了同样的问题,我通过修改 gdbstub.c(在 qemu 源中)来修复它以始终发送 64 位寄存器并通过传递来暗示 GDB 架构是 64 位set arch i386:x86-64

您可以在此处查看补丁:访问 [URL 不再可用]

于 2012-02-06T04:12:37.460 回答
7

我在引导过程的早期发现了一个类似的问题(&这个问题)连接 gdb - 正如其他答案中提到的那样,gdb 不太喜欢从它下面改变的寄存器的大小。这个问题可以通过使用看到set debug remote 1

(gdb) set debug remote 1
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
...
Sending packet: $g#67...Ack
Packet received: 000000000000000... <~600 bytes>
(gdb) until *0x1000 # at this address we'll be in a different cpu mode
...
Sending packet: $g#67...Ack
Packet received: 10000080000000000000000000000000800000c... <~1000 bytes>
...
Remote 'g' packet reply is too long: 1000008000000000000000000...
(gdb)

修补 gdb 以调整其内部缓冲区的大小,当它在 gdb 错误跟踪器(和其他地方)中发现在这个问题上发现的一个太大的数据包时 ,确实可以解决这个问题,就像修补 QEMU 以仅发送 64 位大小的数据包一样. 但是,后一种解决方案会破坏 non-64-bit-modes 中的调试,并且似乎前一种修复可能不完整:

当 GDB已经在调试它时,在 GDB 背后更改目标听起来是非常错误的。不仅 g/G 数据包的大小可能会在不经意间发生变化,布局也会发生变化。如果目标描述随着你的重新配置而改变,我觉得 GDB 应该获取/重新计算整个目标描述。今天,我认为这只能通过断开/重新连接来完成。

https://sourceware.org/ml/gdb/2014-02/msg00005.html

帖子末尾提到的断开/重新连接解决方​​法似乎确实有效:

(gdb) disconnect
Ending remote debugging.
(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
(gdb) info registers
rax            0x80000010   2147483664
rbx            0x0  0
...
于 2015-12-16T04:49:54.647 回答
2

我不小心省略了二进制名称作为 gdb 的参数。所以这对我有用。

$ gdb ./vmlinux
(gdb) target remote localhost:1234

然后得到输出:

Remote debugging using localhost:1234
0xffffffff81025f96 in default_idle ()

调试器需要 vmlinux,因此请确保您提供了它。OP 有一个不同的问题,但我的回答可能对那些忘记向 gdb 提供参数并最终得到与 OP 相同的错误消息的人有所帮助。

于 2016-12-04T10:06:18.900 回答