能否多次使用不同宏定义对同一C文件执行GCOV及测试?
针对同一C文件用不同宏定义执行GCOV分析的方法
当然可以做到!完全没问题~因为GCOV的覆盖率分析依赖编译时插入的 instrumentation 代码,不同宏定义会生成不同的编译产物,只要我们把每次编译的产物和GCOV数据分开存放,就能得到各自独立的覆盖率结果。
下面是具体的操作步骤,就用你提到的两种url宏定义场景举例:
1. 为不同宏场景创建独立编译目录
先给每种宏定义的测试场景单独建个文件夹,避免后续文件互相覆盖:
mkdir -p build/google_de build/google_de_slash
2. 分别编译不同宏版本的代码
进入每个目录,用对应的宏定义编译代码,同时要加上GCOV必需的编译选项(-fprofile-arcs -ftest-coverage):
- 第一个场景(
#define url google.de):
cd build/google_de gcc -fprofile-arcs -ftest-coverage -Durl=\"google.de\" ../../your_source.c -o test_binary
- 第二个场景(
#define url google.de/):
cd build/google_de_slash gcc -fprofile-arcs -ftest-coverage -Durl=\"google.de/\" ../../your_source.c -o test_binary
注意:用
-D参数在编译时定义宏时,引号要转义,确保宏值能正确传递给编译器。
3. 分别运行测试程序生成覆盖率数据
在每个目录下运行编译好的程序,生成*.gcda(执行数据)和*.gcno(编译时 instrumentation 信息)文件:
# 第一个场景 cd build/google_de ./test_binary # 第二个场景 cd build/google_de_slash ./test_binary
4. 分别生成GCOV覆盖率报告
在每个目录下运行gcov命令,就能得到对应宏场景的覆盖率报告:
# 第一个场景 cd build/google_de gcov your_source.c # 会生成 your_source.c.gcov 文件,里面是该宏定义下的详细覆盖率数据 # 第二个场景 cd build/google_de_slash gcov your_source.c # 同样会生成独立的 your_source.c.gcov 文件
额外注意事项
- 一定要分开存放编译产物!如果在同一个目录下多次编译,之前的
gcda和gcno会被覆盖,导致数据混乱。 - 如果你的代码里有基于
url宏的条件编译逻辑,GCOV会准确统计对应分支的执行情况,完全不会和另一个场景的数据互相干扰。 - 要是你用Makefile或者CMake管理构建,可以给不同宏场景定义不同的target,让整个流程更自动化。
内容的提问来源于stack exchange,提问作者QuesterDesura
相关产品推荐
相关产品推荐

