远程'g'数据包回复太长

con*_*bie 19 gdb kvm linux-kernel

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

我的步骤:

  1. 使用custom -kernel,-initrd和-append选项启动VM.
  2. 启动gdb
  3. 执行"set architecture i386:x86-64:intel"
  4. 执行"add-symbol-file linux-3.0/vmlinux"
  5. 执行"show arch"以验证其仍然是"i386:x86-64:intel"
  6. 执行"target remote localhost:1234"
  7. 执行"继续"
  8. 按Ctrl + C,我收到上述消息.

有人遇到过这个问题吗?

Gab*_*iel 12

gdb对于在运行时在指令集之间切换的cpu不能很好地工作.在连接之前等待内核保持早期启动,并且不要使用qemu的-S标志.

  • 是的,但是怎么*?我需要在崩溃之前停止内核; 在崩溃之前停止它,我需要`gdb`.如果我"等待",内核崩溃了.:P (5认同)
  • @Thanatos 我有同样的问题,我把 `mov $0,%eax ; 0: ; 测试 %eax,%eax ; jz 0b` 在源文件中,并在崩溃前调用它。然后我附加调试器并执行`set $eax = 1` 并继续。可怕,但有效。 (2认同)

小智 8

我也面临同样的问题,我通过修改gdbstub.c(在qemu源代码中)来修复它,总是发送64位寄存器并通过传递提示GDB架构为64位 set arch i386:x86-64

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

  • 我没有修补QEMU - 只是告诉GDB`set arch i386:x86-64`足以让它适合我. (3认同)

Set*_*h P 6

我发现了一个类似的问题(和这个问题)在启动过程中很早就连接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)
Run Code Online (Sandbox Code Playgroud)

gdb错误跟踪器(以及其他地方)在此问题上发现过大的数据包时,修补gdb以调整其内部缓冲区的大小确实解决了问题,将QEMU修补为仅发送64位大小的数据包.但是,后一种解决方案在非64位模式下会中断调试,而前一种解决方案似乎不完整:

当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
...
Run Code Online (Sandbox Code Playgroud)

  • 在再次运行`target remote localhost:1234`之后,我得到了相同的`远程'g'数据包太长了. (2认同)