说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。
更多说明请参考http://blog.youkuaiyun.com/gengshenghong/article/details/7034748中补充说明部分。
Summary:
前面都是关于编译器的选项的理解和使用的,这一部分则是工具,Intel编译器提供了几个小工具,这些工具基本上都和PGO优化有关,所以就在PGO这里来讨论。回顾一下,前面的PGO优化,分为三步:使用prof-gen选项,得到一个辅助可执行程序;运行辅助可执行程序,会输出多个dyn文件;使用prof-use选项,会将dyn文件合并为dpi文件,然后利用dpi文件进行编译优化。
(1) 代码覆盖的作用:
关于代码覆盖的概念和作用,就不说明了,这本身是测试领域的一个术语了。PGO的代码覆盖的作用,简单来说:提高开发效率、减少问题、提升应用性能等。
(2) PGO代码覆盖工具的使用介绍:
1. 代码覆盖工具需要的文件:
先大概了解一下使用PGO代码覆盖需要的文件:源代码文件;使用/Qprof-gen:srcpos编译得到辅助可执行文件和.spi文件(和.spl文件,默认命名为PGOPTI.spi和PGOPTI。spl,这两个文件是编译完就会产生,不需要运行辅助可执行文件); pgopti.dpi文件,这个文件如何得到呢,当然,需要先运行辅助可执行文件,会产生.dyn文件,第一种方式是使用prof-use选项再次编译,编译器会先将.dyn文件合并为一个.dpi文件,这个在前面PGO选项中已经知道了,第二种方式是利用profmerge工具,用于合并.dyn文件,下面会介绍。
说明:如果需要使用收集的数据进行代码覆盖和profile feedback(信息反馈优化?PGO优化?),使用/Qprof-gen:scrpos选项;如果只是准备进行代码覆盖测试,可以使用/Qcov-gen选项,这个选项更节省时间和提高性能,但是,此选项只能用于win平台。
2. 代码覆盖工具的使用
上面的文件都是准备工作,编译器提供的代码覆盖工具是:codecov。
使用方法:codecov [-codecov_option]
这里的codecov的选项就不是编译器的选项了,是这个工具自己的选项了。那么使用codecov的步骤自然就是,先用编译器根据上面的说明,生成spi、dpi等文件,然后用codevov利用这些文件进行代码覆盖的测试了。
关于codecov的选项参考手册就可以了,主要选项就是指定所需的spi、dpi文件等、增加用户信息工程信息等、设置输出的颜色等,下面的实例会涉及一些常用的选项,更多选项参考手册。
(3) 简单实例:
上面都是介绍,下面用简单的例子来了解codecov的使用,这里直接用prof-use生成dpi文件,就不使用profmerge工具了,profmerge工具单独会介绍。
codecov##dir /B
test.cpp
codecov##type test.cpp
#include <stdio.h>
int foo(int a, int b)
{
return a+b;
}
int main()
{
printf("foo:%d\n", foo(1,2));
}
codecov##icl /Qprof-gen:srcpos test.cpp /nologo
test.cpp
codecov##dir /B
PGOPTI.SPI
PGOPTI.SPL
test.cpp
test.exe
test.obj
codecov##test.exe
foo:3
codecov##dir /B
4ee03044_04524.dyn
PGOPTI.SPI
PGOPTI.SPL
test.cpp
test.exe
test.obj
codecov##icl /Qprof-use test.cpp /nologo
test.cpp
remark #30052: looking at dynamic file: .\4ee03044_04524.dyn
codecov##dir /B
4ee03044_04524.dyn
pgopti.dpi
pgopti.dpi.lock
PGOPTI.SPI
PGOPTI.SPL
test.cpp
test.exe
test.obj
codecov##mkdir temp
codecov##copy pgopti.dpi temp\
1 file(s) copied.
codecov##copy PGOPTI.SPI temp\
1 file(s) copied.
codecov##cd temp
codecov##dir /B
pgopti.dpi
PGOPTI.SPI
codecov##codecov
Intel(R) C++/Fortran Compiler code-coverage tool for applications running on Int
el(R) 64, Version 12.1 Build 20111011
Copyright (C) 1985-2011 Intel Corporation. All rights reserved.
50% .. 100%
codecov##dir /B
CodeCoverage
CODE_COVERAGE.HTML
pgopti.dpi
PGOPTI.SPI
codecov##
上面是我在命令行下运行的完整过程(使用了dir命令,看到每一步生成的哪些文件,加强对PGO编译过程的理解)。总体来说:
(1) 使用编译器生成需要的spi和dpi文件(事实上,codecov工具只需要这两个文件作为输入即可)
icl /Qprof-gen:srcpos test.cpp /nologo
test.exe
icl /Qprof-use test.cpp /nologo
(2) 将生成的spi和dpi文件放到任意一个文件夹,在这个文件夹下去运行codecov工具即可
codecov
这里需要注意的是:只需要spi和dpi就足以运行codecov并得到报告了,但是,前面说到过codecov需要使用到的文件,其中就有源文件,需要注意的是,spi和dpi文件中并不包括源代码内容,其中记录了源代码的绝对路径,所以,可以将spi和dpi移动到任意路径下去运行,但是,一定不要删除或移动了源文件,否则,可以得到报告,但是报告的结果是没有错误且意义的(很多参数都是0)。
这样就完成了(codecov不加任何选项就会默认在当前目录下循环pgopti.dpi和PGOPTI.SPI文件)。输出是CODE_COVERAGE.HTML和一个CodeCoverage文件夹,很显然,这个CODE_COVERAGE.HTML就是生成的html报告的“主页”,那个CodeCoverage文件夹就是对应的一些其它网页文件了。浏览器中打开这个html,效果如下:
页面上的链接还可以查看具体的一些文件、函数等等内容,就不一一介绍了。
(4)codecov基本选项分类
1. 指定输入文件
-mname string:指定用户名(会显示在报告的某些地方)
-txtbcvrgfull file
-txtdcg file
-txtfcvrg file
-xmlbcvrg file
-xmlbcvrgfull file
-xmlfcvrg file
-ccolor color
-fcolor color
-icolor color
-pcolor color
-ucolor color
-xcolor color
