con*_*bie 19 gdb kvm linux-kernel
我正在尝试使用kvm vm调试Linux内核.我收到一条错误消息"远程'g'数据包回复太长".我的主机是64位,我的虚拟机也是.
我的步骤:
有人遇到过这个问题吗?
Gab*_*iel 12
gdb对于在运行时在指令集之间切换的cpu不能很好地工作.在连接之前等待内核保持早期启动,并且不要使用qemu的-S标志.
小智 8
我也面临同样的问题,我通过修改gdbstub.c(在qemu源代码中)来修复它,总是发送64位寄存器并通过传递提示GDB架构为64位 set arch i386:x86-64
您可以在此处查看补丁:访问[URL不再可用]
我发现了一个类似的问题(和这个问题)在启动过程中很早就连接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应该获取/重新计算整个目标描述.今天,我认为只能通过断开/重新连接来完成.
帖子末尾提到的断开连接/重新连接解决方法确实有效:
(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)
| 归档时间: |
|
| 查看次数: |
16289 次 |
| 最近记录: |