相同库代码,生成不同类型的程序后(主要是被动态链接和静态链接),生成的gcov可能会不同,或者并发在不同机器上跑测试也会生成相同源码的不同gcov文件。
所以需要有个合并gcov文件的工具,但网上找了下没找到合适的,看了下gcov文件的内容,很规则,所以就自己写了一个,代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
if len(sys.argv) != 4:
print("Usage: %s in1 in2 out"%sys.argv[0])
with open(sys.argv[1]) as f1, open(sys.argv[2]) as f2, open(sys.argv[3], "w") as fout:
out_lines = []
while True:
f1_line = f1.readline()
f2_line = f2.readline()
if f1_line == None or f2_line == None or f1_line == "" or f2_line == "":
break
f1_line_info = f1_line.split(":")
f2_line_info = f2_line.split(":")
f1_line_no = int(f1_line_info[1])
f2_line_no = int(f2_line_info[1])
if f1_line_no != f2_line_no:
print("Line NO. mismatch!")
break
print(f1_line_no)
if f1_line_no == 0:
if f1_line_info[2] == "Source" and f1_line_info[3] != f2_line_info[3]:
print("File name mismatch!")
break
else:
if f1_line_info[2] != f2_line_info[2]:
print("Line mismatch!")
break
if f1_line_info[0][-1] != "-" and f1_line_info[0][-1] != "#":
out_lines.append(f1_line)
else:
out_lines.append(f2_line)
fout.writelines(out_lines)
这个对我来讲够用了,但还有如下缺点,使用时要注意:
- 如果代码中含有冒号“:”,该行如果有差异可能无法对比出来
- 没有合并执行次数
- 代码行过多会消耗较多内存