这是命令 aarch64-linux-gnu-gcov-4.9 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
gcov - 覆盖率测试工具
概要
冠状病毒 [-v|- 版[-h| - 帮帮我]
[-a|--所有块]
[-b|--分支概率]
[-c|--分支计数]
[-d|--显示进度]
[-f|--功能摘要]
[-i|--中间格式]
[-l|--长文件名]
[-m|--demangled-名称]
[-n|--无输出]
[-o|--对象目录 目录|文件]
[-p|--保留路径]
[-r|--仅相对]
[-s|--source-前缀 目录]
[-u|--无条件分支]
档
商品描述
冠状病毒 是一个测试覆盖程序。 与 GCC 一起使用它来分析您的程序
帮助创建更高效、更快运行的代码并发现未测试的部分
程序。 您可以使用 冠状病毒 作为分析工具,帮助发现您的优化位置
努力将最好地影响您的代码。 你也可以使用 冠状病毒 连同其他分析
工具, 教授, 以评估代码的哪些部分使用了最多的计算时间。
分析工具可帮助您分析代码的性能。 使用分析器,例如 冠状病毒
or 教授,可以查到一些基本的性能统计信息,例如:
· 每行代码执行的频率
· 实际执行了哪些代码行
· 每段代码使用多少计算时间
一旦您了解了有关代码在编译时如何工作的这些事情,您就可以查看每个
模块以查看应优化哪些模块。 冠状病毒 帮助您确定工作地点
关于优化。
软件开发人员还结合测试套件使用覆盖测试,以确保
软件实际上足以发布。 测试套件可以验证程序
按预期工作; 覆盖程序测试以查看有多少程序被执行
测试套件。 然后开发人员可以确定需要添加哪些类型的测试用例
测试套件以创建更好的测试和更好的最终产品。
如果您打算使用,则应该在没有优化的情况下编译代码 冠状病毒 因为
优化,通过将一些代码行组合成一个函数,可能不会给你那么多
您需要查找代码使用大量“热点”的信息
电脑时间。 同样,因为 冠状病毒 按行累积统计信息(在最低
分辨率),它最适合只在每个语句上放置一个语句的编程风格
线。 如果您使用扩展为循环或其他控制结构的复杂宏,
统计数据不太有用——它们只报告宏调用所在的行
出现。 如果你的复杂宏表现得像函数,你可以用内联替换它们
功能来解决这个问题。
冠状病毒 创建一个名为的日志文件 源文件.gcov 这表明每行多少次
一个源文件 源文件.c 已执行。 您可以将这些日志文件与 教授 至
有助于微调程序的性能。 教授 给你计时信息
可以与您从中获得的信息一起使用 冠状病毒.
冠状病毒 仅适用于使用 GCC 编译的代码。 它与任何其他分析不兼容
或测试覆盖机制。
配置
-h
- 帮帮我
显示有关使用的帮助 冠状病毒 (在标准输出上),然后不做任何事情就退出
进一步处理。
-v
- 版
显示 冠状病毒 版本号(在标准输出上),不做任何事情就退出
进一步处理。
-a
--所有块
为每个基本块编写单独的执行计数。 通常 gcov 输出
执行仅对一行的主要块进行计数。 使用此选项,您可以
确定单行中的块是否没有被执行。
-b
--分支概率
将分支频率写入输出文件,并将分支摘要信息写入输出文件
标准输出。 此选项允许您查看程序中每个分支的频率
被拿走。 不会显示无条件分支,除非 -u 给出了选项。
-c
--分支计数
将分支频率写为采用的分支数量,而不是百分比
采取的分支。
-n
--无输出
不要创建 冠状病毒 输出文件。
-l
--长文件名
为包含的源文件创建长文件名。 例如,如果头文件 xh
包含代码,并被包含在文件中 交流电,然后运行 冠状病毒 在文件上 交流电
将产生一个名为的输出文件 ac##xhgcov 而不是 冠状病毒。 这可以
有用的话 xh 包含在多个源文件中并且您想查看单个
贡献。 如果您使用 -p 选项,包含和包含的文件名
将是完整的路径名。
-p
--保留路径
在生成的名称中保留完整的路径信息 .gcov 文件。 没有
这个选项,只使用文件名组件。 使用此选项,所有目录
使用,与 / 字符转换为 # 字符, . 删除了目录组件
并且不可移动 .. 组件重命名为 ^. 如果源文件在
几个不同的目录。
-r
--仅相对
只输出带有相对路径名的源文件信息(在 source 之后
前缀省略)。 绝对路径通常是系统头文件和任何
其中的内联函数通常是无趣的。
-f
--功能摘要
除了文件级摘要之外,还输出每个函数的摘要。
-o 目录|文件
--对象目录 目录
--目标文件 文件
指定包含 gcov 数据文件的目录或对象路径名。
这款 .gcno及 .gcda 使用此选项搜索数据文件。 如果目录是
指定,数据文件在该目录中并以输入文件名命名,
没有它的扩展名。 如果在此处指定文件,则数据文件以
那个文件,没有它的扩展名。
-s 目录
--source-前缀 目录
生成输出覆盖文件时要删除的源文件名的前缀。
在单独的目录中构建时,此选项很有用,并且路径名
确定输出文件名时不需要源目录。 请注意,这
在确定源文件是否为绝对文件之前应用前缀检测。
-u
--无条件分支
当给出分支概率时,包括无条件分支的概率。
无条件分支通常不有趣。
-d
--显示进度
显示标准输出的进度。
-i
--中间格式
以易于解析的中间文本格式输出 gcov 文件,可供 冠状病毒
或其他工具。 输出是单 .gcov 每个文件 .gcda 文件。 没有源代码
必需的。
中间件格式 .gcov 文件是纯文本,每行一个条目
文件:
功能: , ,
计数: ,
分支: ,
哪里是
notexec(分支未执行)
采取(分支执行和采取)
nottaken(分支已执行,但未采取)
可以有多个中间 gcov 中的条目
文件。 后一个的所有条目与该源文件有关
直到下一个入口。
这是一个示例,当 -i 与 -b 选项:
文件:array.cc
函数:11,1,_Z3sumRKSt6vectorIPiSaIS0_EE
功能:22,1,main
计数:11,1
计数:12,1
计数:14,1
分支:14,采取
计数:26,1
分行:28,未录取
-m
--demangled-名称
在输出中显示解构函数名称。 默认是显示 mangled 函数
名称。
冠状病毒 应该以与调用时相同的当前目录运行
编译器。 否则将无法定位源文件。 冠状病毒 产生文件
被称为 错误名称.gcov 在当前目录中。 这些包含覆盖信息
它们对应的源文件。 一 .gcov 为每个源生成文件(或
header) 包含代码的文件,该文件被编译以生成数据文件。 这
乱名 输出文件名的一部分通常只是源文件名,但也可以
如果是更复杂的事情 -l or -p 给出了选项。 参考那些选项
了解详情。
如果你调用 冠状病毒 对于多个输入文件,每个输入文件的贡献是
总和。 通常,您会使用与最终链接相同的文件列表来调用它
你的可执行文件。
这款 .gcov 文件包含 : 分隔字段以及程序源代码。 格式
is
: :
当命令行选项请求时,附加块信息可能在每一行之后。
这款 执行计数 is - 对于不包含代码的行。 未执行的行被标记 #####
or ====, 取决于它们是否可以通过非异常路径或仅
异常路径,例如 C++ 异常处理程序,分别。
开头的一些信息行有 电话号码 零。 这些序言行是
的形式
-:0: :
这些序言行的顺序和数量将增加为 冠状病毒 开发
进步---不要依赖它们保持不变。 用 行李牌 找到一个特定的
序言行。
附加块信息的形式为
这款 信息 是人类可读的,但设计得足够简单以供机器解析
了。
打印百分比时,0% 和 100% 仅在数值为 究竟 0%和
分别为 100%。 其他通常会四舍五入为 0% 或 100% 的值是
而是打印为最接近的非边界值。
使用时 冠状病毒,您必须首先使用两个特殊的 GCC 选项编译您的程序:
-f轮廓弧 -ftest-覆盖. 这告诉编译器生成额外的
gcov 所需的信息(基本上是程序的流程图),还包括
目标文件中的附加代码,用于生成所需的额外分析信息
通过 gcov。 这些附加文件放置在目标文件所在的目录中
位于。
运行该程序将导致生成配置文件输出。 对于每个源文件
编译与 -f轮廓弧,伴随 .gcda 文件将被放置在目标文件中
目录。
运行 冠状病毒 将程序的源文件名作为参数现在将生成一个列表
代码以及每行的执行频率。 例如,如果您的程序
叫做 tmp文件,这就是你在使用基本的时候看到的 冠状病毒 设施:
$ gcc -fprofile-arcs -ftest-覆盖率 tmp.c
$a.out
$ gcov tmp.c
90.00% 的 10 行源代码在文件 tmp.c 中执行
创建 tmp.c.gcov。
该文件 tmp变种gcov 包含输出 冠状病毒。 这是一个示例:
-:0:来源:tmp.c
-:0:图形:tmp.gcno
-:0:数据:tmp.gcda
-:0:运行:1
-: 0:程序:1
-: 1:#include
-:2:
-:3:int main(无效)
1:4:{
1:5:int i,总计;
-:6:
1: 7: 总数 = 0;
-:8:
11: 9: for (i = 0; i < 10; i++)
10: 10: 总计 += i;
-:11:
1:12:如果(总共!= 45)
#####: 13: printf ("失败\n");
-: 14: 其他
1: 15: printf ("成功\n");
1:16:返回0;
-:17:}
当您使用 -a 选项,您将获得单个块计数,并且输出看起来
喜欢这个:
-:0:来源:tmp.c
-:0:图形:tmp.gcno
-:0:数据:tmp.gcda
-:0:运行:1
-: 0:程序:1
-: 1:#include
-:2:
-:3:int main(无效)
1:4:{
1:4块0
1:5:int i,总计;
-:6:
1: 7: 总数 = 0;
-:8:
11: 9: for (i = 0; i < 10; i++)
11:9块0
10: 10: 总计 += i;
10:10块0
-:11:
1:12:如果(总共!= 45)
1:12块0
#####: 13: printf ("失败\n");
$$$$$: 13 块 0
-: 14: 其他
1: 15: printf ("成功\n");
1:15块0
1:16:返回0;
1:16块0
-:17:}
在这种模式下,每个基本块只显示在一行——块的最后一行。 一种
多行块只会影响最后一行的执行次数,其他
不会显示包含代码的行,除非前面的块以这些行结束。 这
显示一行的总执行计数,随后的行显示执行计数
对于在该行结束的单个块。 在每个块之后,分支和调用计数
将显示块的,如果 -b 给出了选项。
由于 GCC 仪器调用的方式,调用计数可以显示在一行之后,没有
单个块。 如您所见,第 13 行包含一个未执行的基本块。
当您使用 -b 选项,您的输出如下所示:
$ gcov -b tmp.c
90.00% 的 10 行源代码在文件 tmp.c 中执行
80.00% 的 5 个分支在文件 tmp.c 中执行
80.00% 的 5 个分支在文件 tmp.c 中至少被采用一次
在文件 tmp.c 中执行的 50.00 个调用的 2%
创建 tmp.c.gcov。
这是结果的示例 tmp变种gcov 文件:
-:0:来源:tmp.c
-:0:图形:tmp.gcno
-:0:数据:tmp.gcda
-:0:运行:1
-: 0:程序:1
-: 1:#include
-:2:
-:3:int main(无效)
函数 main 调用 1 返回 1 个块执行 75%
1:4:{
1:5:int i,总计;
-:6:
1: 7: 总数 = 0;
-:8:
11: 9: for (i = 0; i < 10; i++)
分支 0 被占用 91%(失败)
分支 1 占用 9%
10: 10: 总计 += i;
-:11:
1:12:如果(总共!= 45)
分支 0 被占用 0%(失败)
分支 1 占用 100%
#####: 13: printf ("失败\n");
调用 0 从未执行
-: 14: 其他
1: 15: printf ("成功\n");
调用 0 调用 1 返回 100%
1:16:返回0;
-:17:}
对于每个函数,都会打印一行显示该函数被调用的次数、调用方式
它返回很多次以及执行了多少百分比的函数块。
对于每个基本块,在描述基本块的最后一行之后打印一行
结束基本块的分支或调用。 可以有多个分支和调用
如果有多个基本块以该行结尾,则为单个源行列出。
在这种情况下,分支和呼叫均被赋予一个编号。 没有简单的方法可以
映射这些分支并回调到源结构。 不过一般来说,最低的
编号的分支或调用将对应于源代码行上最左边的结构。
对于一个分支,如果它至少被执行过一次,那么一个百分比表示执行的次数
分支被执行的次数除以分支被执行的次数将是
打印。 否则,将打印“从未执行过”的消息。
对于一个调用,如果它至少被执行过一次,那么一个百分比表示
返回的调用次数除以调用执行的次数将是
打印。 这通常是 100%,但对于调用“exit”或
“longjmp”,因此每次调用它们时可能不会返回。
执行计数是累积的。 如果没有再次执行示例程序
删除 .gcda 文件,源中每行的次数计数
执行将被添加到前一次运行的结果中。 这可能很有用
在几个方面。 例如,它可用于累积多个数据
程序作为测试验证套件的一部分运行,或提供更准确的长期
大量程序运行的信息。
在该数据 .gcda 文件在程序退出前立即保存。 对于每个
使用编译的源文件 -f轮廓弧,分析代码首先尝试读入
现有 .gcda 文件; 如果文件与可执行文件不匹配(不同数量的基本
块计数)它将忽略文件的内容。 然后添加新的执行
计数并最终将数据写入文件。
运用 冠状病毒 - GCC 优化
如果你打算用 冠状病毒 为了帮助优化您的代码,您必须首先编译您的程序
有两个特殊的 GCC 选项: -f轮廓弧 -ftest-覆盖. 除此之外,你还可以
使用任何其他 GCC 选项; 但是如果你想证明程序中的每一行
已执行,您不应同时进行优化编译。 在某些机器上
优化器可以通过将一些简单的代码行与其他行组合来消除它们。
例如,像这样的代码:
如果 (a != b)
c是1;
其他
c是0;
在某些机器上可以编译成一条指令。 在这种情况下,没有办法
冠状病毒 为每一行计算单独的执行计数,因为没有单独的
每行代码。 因此 冠状病毒 如果你编译了程序,输出看起来像这样
优化:
100:12:如果(a!= b)
100:13:c = 1;
100:14:其他
100:15:c = 0;
输出显示,经过优化组合的这段代码执行了 100 次。
在某种意义上,这个结果是正确的,因为只有一条指令代表
所有这四行。 但是,输出并没有说明结果的次数
是 0,结果是 1 的次数。
内联函数可能会产生意外的行数。 显示行数
可内联函数的源代码,但显示的内容取决于函数所在的位置
内联,或者根本没有内联。
如果函数没有内联,编译器必须发出一个外联副本
函数,在任何需要它的目标文件中。 如果 文件A.o 和 文件B.o 两者都包含
特定内联函数的线体,它们也都包含覆盖
计数为该功能。 什么时候 文件A.o 和 文件B.o 链接在一起,链接器将,
在许多系统上,为对该函数的所有调用选择其中一个,
并删除或忽略另一个。 不幸的是,它不会删除覆盖计数器
对于未使用的函数体。 因此,当进行检测时,该功能的所有用途除外
将显示零计数。
如果函数在多个位置内联,则每个位置的块结构可能
不一样。 例如,现在可以在编译时计算条件
一些情况。 因为会显示内联函数的所有用途的覆盖范围
对于相同的源代码行,行数本身可能看起来不一致。
长时间运行的应用程序可以使用“_gcov_reset”和“_gcov_dump”工具来
将配置文件收集限制在感兴趣的程序区域。 调用“_gcov_reset(void)”
将所有配置文件计数器清零,调用“_gcov_dump(void)”将导致
在该点收集的配置文件信息被转储到 .gcda 输出文件。
使用 onworks.net 服务在线使用 aarch64-linux-gnu-gcov-4.9