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

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

💡 原文中文,约1500字,阅读约需4分钟。
📝

内容提要

本文介绍了如何通过GDB调试QEMU源码,以获取用于计算磁盘利用率的wr_highest_offset字段。首先编译QEMU并定位到bdrv_query_bds_stats函数,确认该函数在qmp_query_blockstats中被多次调用,最终成功获取wr_highest_offset的值。

🎯

关键要点

  • 通过跟踪libvirt源码,发现virsh domblkinfo使用QMP协议从QEMU获取query-block数据,wr_highest_offset字段是磁盘利用率的Allocation值来源。

  • 需要编译QEMU并加入函数表,使用./configure --enable-debug进行编译。

  • 在源码中全局搜索wr_highest_offset,确定bdrv_query_bds_stats函数是填充该字段的位置。

  • 使用GDB调试QEMU进程,设置断点在bdrv_query_bds_stats函数,确认该函数在qmp_query_blockstats中被多次调用。

  • 最终成功获取wr_highest_offset的值,证明调试方法有效。

延伸问答

如何通过GDB调试QEMU源码以获取wr_highest_offset字段?

首先需要编译QEMU并加入调试选项,然后在源码中定位到bdrv_query_bds_stats函数,设置断点并跟踪该函数的调用。

wr_highest_offset字段在磁盘利用率中有什么作用?

wr_highest_offset字段被libvirt认定为磁盘利用率中的Allocation值的来源。

编译QEMU时需要哪些步骤?

需要使用./configure --enable-debug命令进行编译,并确保将相关函数加入函数表。

bdrv_query_bds_stats函数的作用是什么?

bdrv_query_bds_stats函数用于填充wr_highest_offset字段,并在qmp_query_blockstats中被多次调用。

如何确认GDB调试是否成功?

可以通过在GDB中查看wr_highest_offset的值是否正确填充来确认调试是否成功。

virsh domblkinfo命令如何与QMP协议交互?

virsh domblkinfo命令使用QMP协议从QEMU获取query-block数据,其中包含wr_highest_offset字段。

➡️

继续阅读