首页
社区
课程
招聘
[原创]qemu 2.0与gdb连接调试内核时出现"Remote 'g' packet reply is too long"问题分析
发表于: 2019-10-30 13:42 7432

[原创]qemu 2.0与gdb连接调试内核时出现"Remote 'g' packet reply is too long"问题分析

2019-10-30 13:42
7432

qemu 2.0加入-s -S调试Linux内核与gdb 连接后 gdb出现 Remote 'g' packet reply is too long (expected 308 bytes, got 536 bytes): 错误
gdb出现提示代码如下:

图1
问题很明显是gdb从qemu接收回来的g包大于gdb定义的g包的大小。
动态调试gdb找到初始化rsa->sizeof_g_packet代码所在位置如下:

图2
进入map_regcache_remote_table()函数中

图3
动态打印num_remote_regs变量如下:

图4
size_of_g_packet大小如下:

图5
qemu-2.0中处理gdb命令在gdbstub.c中gdb_handle_packet函数
代码如下:

图6
而且qemu发送了gdb_num_g_regs=57个寄存器。
gdb 打印len变量如下

图7
大小为308,正好是上面出现错误的数字。
看来问题是gdb与qemu协商接收的寄存器数量时候出的问题。
继续阅读gdb协议发现。gdb与远程协商寄存器的命令如下

图8
上图中5095行中的qXfer:feature:read的功能是读取远程host中的关于寄存器描述的xml。高版本的qemu xml文件gdb-xml文件夹下

图9
qemu 2.0的目录下并没有这个文件

图10

由于qemu 2.0对于x86的描述没有,导致gdb在查询远端host寄存器时候失败。只能按照自己默认的数量接收,但是qemu刚好还比gdb默认的大,导致出现了这个问题。解决办法要么patch gdb,要么patch qemu。在此不不赘述。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是两端的arch设置不一致导致的?
(gdb) set architecture
Requires an argument. Valid arguments are i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, auto.
2019-11-26 21:09
0
雪    币: 770
活跃值: (263)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
额,并不是
2019-11-27 16:59
0
雪    币: 1705
活跃值: (676)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
老铁能用qume调试安卓模拟器么,我一直想修改安卓模拟器源代码,但是找不到开源的
2019-11-30 15:32
0
游客
登录 | 注册 方可回帖
返回
//