[Paper] NQC2:非侵入式 QEMU 代码覆盖率插件
发布: (2026年1月6日 GMT+8 00:11)
6 min read
原文: arXiv
Source: arXiv - 2601.02238v1
概述
本文介绍了 NQC2,这是一款非侵入式的 QEMU 仿真器插件,能够在不进行源代码层面插桩的情况下,从嵌入式(裸机)应用程序中收集代码覆盖率数据。NQC2 直接从仿真 CPU 状态中提取覆盖度量并写入宿主机,因而无需在目标上拥有操作系统或文件系统,使得对低层固件和 IoT 代码的覆盖率分析成为可能。
关键贡献
- 非侵入式覆盖提取:在运行时从 QEMU 捕获行级和分支级覆盖率,无需修改目标二进制文件。
- 主机侧存储:自动将覆盖报告写入主机文件系统,消除目标侧存储或通信通道的需求。
- 兼容层:兼容原生 QEMU 以及自定义补丁构建,保持现有仿真工作流。
- 性能提升:相较于 Xilinx 的插装‑转储方法,在相似工作负载下实现最高 8.5 倍 的执行速度提升。
- 开源实现:提供可复用的插件,可集成到嵌入式固件测试的 CI 流水线中。
方法论
- Instrumentation‑free design – NQC2 钩入 QEMU 的内部执行引擎(具体是翻译块处理),以监控执行了哪些基本块。
- Runtime data collection – 当被仿真的程序运行时,插件在主机内存中维护的紧凑位图里记录块标识符。
- Periodic flushing – 在用户自定义的间隔或仿真器关闭时,位图被序列化为标准覆盖格式(例如 gcov/LCOV),并保存在主机上。
- Evaluation setup – 作者使用多个开源裸机应用(例如 FreeRTOS 演示、Zephyr 示例)将 NQC2 与 Xilinx 的 “instrument‑and‑dump” 方法进行基准测试。收集的指标包括执行时间开销、内存消耗以及覆盖完整性。
结果与发现
| 指标 | NQC2 | Xilinx Instrumentation |
|---|---|---|
| 运行时开销 | ≤ 2 %(平均) | 10–17 % |
| 加速比 | 整体测试运行提升至 8.5×(更快) | – |
| 覆盖完整性 | 已报告 100 % 的已执行块(与仪器化基线相同) | 100 % |
| 主机内存影响 | 可忽略(典型固件的位图大小 < 1 MB) | 可比 |
| 集成简易性 | 即插即用的 QEMU 插件,无需修改源码 | 需要使用覆盖宏重新编译 |
研究结果证实,直接从仿真器提取覆盖率既 准确,又 显著更高效,相较于传统的源代码级仪器化,适用于裸机目标。
实际意义
- 固件的 CI/CD – 团队可以将 NQC2 嵌入自动化测试流水线,快速获取覆盖率反馈,而无需维护单独的插桩构建。
- 快速原型 – 迭代低层驱动的开发者可以即时看到覆盖率,缩短边缘案例代码路径的调试循环。
- 资源受限设备 – 由于目标上不运行额外代码,NQC2 非常适合缺乏用于插桩负载的闪存或 RAM 的微控制器。
- 跨工具兼容性 – 生成的覆盖率文件可导入现有分析工具(lcov、gcovr、SonarQube),保持已有的报告仪表盘。
- 供应商无关的测试 – 支持任何 QEMU 支持的架构(ARM Cortex‑M、RISC‑V 等),实现跨异构产品线的统一覆盖率策略。
限制与未来工作
- 仅仿真 – NQC2 依赖 QEMU;来自硬件运行的覆盖数据仍需传统插桩或外部追踪硬件。
- 粒度受限于 QEMU 的翻译块 – 虽然对大多数行级度量已足够,但超细粒度(例如每条指令)的覆盖需要更深层的钩子。
- 仿真与真实硬件时序可能出现分歧,这可能隐藏仅在硅片上出现的竞争条件错误。
- 作者提出的未来方向 包括:将插件扩展以捕获 性能 计数器 alongside 覆盖率,将其与硬件在环 (HIL) 设置集成,以合并仿真和真实世界数据,以及添加对 QEMU 之外的动态二进制翻译框架的支持。
作者
- Nils Bosbach
- Alwalid Salama
- Lukas Jünger
- Mark Burton
- Niko Zurstraßen
- Rebecca Pelke
- Rainer Leupers
论文信息
- arXiv ID: 2601.02238v1
- 分类: cs.SE
- 发布: 2026年1月5日
- PDF: 下载 PDF