GCOV/LCOV,GPROF
GCOV
在使用gcov工具前,请确认编译程序时并没有用到“优化”选项。
gcc -fprofile-arcs -ftest-coverage sourcefile.c -o sourcefile
此时目录下会生成 sourcefile.gcno
./sourcefile
此时目录下会生成 sourcefile.gcda
gcov sourcefile.c
此时目录下会生成 sourcefile.c.gcov
- .gcno文件由 -ftest-coverage 选项产生。它包含重建基本块图的信息和相应块的源码行号。
- .gcda文件由 -fprofile-arcs 选项产生。它包含跳转次数、计数器以及一些概要信息。
这两个文件是运行gcov命令时需要用到的文件,与 object file 在同一路径下。 (若使用 -fprofile-dir 选项,则.gcda文件可以生成在不同的路径下)
gcov中记录的执行次数是累计的,即如果不删除之前的.gcda文件就再次执行程序,则记录的执行次数会累加。
LCOV
该工具需要有gcov生成的.gcno和.gcda文件,不需要.gcov
lcov --capture --directory projrct-dir --output-file coverage.info
genhtml coverage.info --output-derectory out
以上两行命令的简化
lcov -c -d project_dir -o coverage.info
genhtml coverage.info -o out
用浏览器打开out目录下的index.html即可。
GPROF
用户手册
在编译时加上-pg
选项。
运行可执行程序,此时会在同路径下生成gmon.out文件。
gprof executable_name gmon.out
输出分析报告。
分析报告内容:
flat profile 表格显示每个函数消耗的处理器时间、调用次数等。
- 每一列的参数是什么含义在表格的下面有解释。
- 可使用
-p
选项来只输出flat profile表格
call graph 表格显示每个函数的调用关系,调用花费了多少时间。
- [n]为该函数的序号,其上为调用它的函数,其下为被它调用的函数。
- 每一块之间用虚线
- - -
隔开。 - 同样,在表格下面也有对表格的解释。
- 可使用
-q
选项来只输出call graph表格
gprof只能分析应用程序消耗的用户时间,无法得到内核空间的运行时间。
建议使用 time 命令来查看程序运行时间的组成
time executable_name
如果嫌gprof的输出不太直观,可以使用gprof2dot工具,自动用dot语言画出流程图。