前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GDB 调试 QEMU 源码跟踪 QMP 协议执行

GDB 调试 QEMU 源码跟踪 QMP 协议执行

作者头像
宋天伦
发布2023-10-18 09:17:52
2590
发布2023-10-18 09:17:52
举报
文章被收录于专栏:fryteafrytea

本文 首发于 🌱 煎茶,请注明 来源。

接上文,通过跟踪 libvirt 的源码,找到 virsh domblkinfo 最终是使用 QMP 协议从 QEMU 获取到关键字为 query-block 的数据,其中带有 wr_highest_offset 字段,该字段被 libvirt 认定为 磁盘利用率中 Allocation 值的来源。

今天就尝试在 QEMU 中找到获取 wr_highest_offset 字段的方法。

环境准备#

  • QEMU 4.0
  • Centos
  • 鲲鹏 ARM

首先需要编译 QEMU 加入函数表,重新编译 QEMU在其中加入该字段即可,编译方法可以参考源码目录:

代码语言:javascript
复制
./configure --enable-debug

跟踪前需要定位到 QEMU 中填充该字段的函数,首先在源码中全局搜索 wr_highest_offset ,最终确定 block/qapi.c 文件中的 bdrv_query_bds_stats 函数最有可能是填充该字段的位置,下面就来跟踪这个函数的走向吧。

跟踪记录#

一个虚拟机在宿主机中表现为一个 QEMU 的进程,在这里仅保留一个虚拟机,查询该虚拟机状态时 libvirt 回使用 unix socket 的方式发往该进程监听的 unix socket 服务。因此跟踪该虚拟机所在进程即可。

代码语言:javascript
复制
# ps -aux | grep qemu
qemu     2185346  0.6  0.5 3562240 333440 ?      Sl   10:05   2:20 /usr/bin/qemu-system-aarch64 -name guest=instance-000001bb,...imestamp=on
root     2472547  0.0  0.0 110784  2496 pts/3    S+   16:03   0:00 grep --color=auto qemu

GDB 开始跟踪:

代码语言:javascript
复制
gdb qemu-system-aarch64 2185346

在之前找到的目标函数处打上断点:

代码语言:javascript
复制
(gdb) b bdrv_query_bds_stats

之后 c 继续执行,尝试查询一下磁盘状态。

代码语言:javascript
复制
$ virsh domblkinfo 25 vda --human

Breakpoint 1, bdrv_query_bds_stats (bs=0x3b549940, blk_level=true) at /root/stl/qemu-4.0.0/block/qapi.c:509
509         BlockStats *s = NULL;

会发现终端卡住了,此时 gdb 中断了进程,说明我们找对函数了,下面我们继续追踪吧。

发现这个函数是在 qmp_query_blockstats 中被调用多次,最终得出结果。

代码语言:javascript
复制
544     }
(gdb) n
qmp_query_blockstats (has_query_nodes=false, query_nodes=false, errp=0xffffe3963110) at /root/stl/qemu-4.0.0/block/qapi.c:609
609                 s->has_device = true;
(gdb) p s->stats->wr_highest_offset 
$3 = 3072

下面主要就是跟着源码来看了,本文主要是讲了如何使用 GDB 跟踪 QEMU 源码,若有疑问欢迎留言。

参考文献#

注:本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境准备#
  • 跟踪记录#
  • 参考文献#
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档