内容提要
本文介绍了如何通过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字段。