好的,我想通了。
检测代码如下所示:
#pragma bss_seg(push,".covbss")
static struct cov_V_d934b203 cov_v_d934b203;
#pragma bss_seg(pop)
#pragma const_seg(push,".covconst")
static const struct cov_O_d934b203 cov_o_d934b203 = {
0x5a6b7c8d, 0x6b54972d, &cov_v_d934b203, 0x254972d, cov_V_d934b203_n, "CpuPeimTest.obj 21Apr18 22:20"
};
...
if(!cov_v_d934b203.data[0])cov_probe_v11(&cov_o_d934b203,0);{ // this is right after the function entry.
do { if (DebugPrintEnabled ()) { do { if (DebugPrintLevelEnabled (0x80000000)) { DebugPrint (0x80000000,"Ming: Code coverage test start.\n"); } } while (((BOOLEAN)(0==1))); } } while (((BOOLEAN)(0==1)));
所以本质上,它存储了一些覆盖数据收集器对象,cov_c_xxx
和cov_v_xxx
,分别在.covconst
和.covbss
段中。在运行时,检测代码日志数据指向cov_v_xxx
对象。
在函数入口处的cov_probe_v11
调用只是将和链接到最终结果链接列表中。这是 Bullseye 运行时库的一部分。您可以修改它以适应您的测试代码。cov_c_xxx
cov_v_xxx
cov_probe_v11
一旦链接,所有其他数据收集都可以发生,而无需调用cov_probe_v11
.