gcov 和 perf 使用的基本套路备忘 ubuntu

2023-11-11

一、源代码

$ cat helloSeven.c
#include <stdio.h>

void timeSeven(int count){
        for(int i=0; i<count; i++){
                if(i%7 == 0){
                        printf("i=%d is times of seven.\n",i);
                }else{
                        printf("i=%d is not times of 7.\n",i);

                }
        }
}


int main(){

        timeSeven(100);
        return 0;
}

二、编译命令

$ gcc -fprofile-arcs -ftest-coverage helloSeven.c -o helloSeven

$ ls
helloSeven  helloSeven.c  helloSeven.gcno

#运行一下binary文件,这是必要的
$ ./helloSeven

#会生成要给.gcda文件,接下来有用的
$ ls
helloSeven  helloSeven.c  helloSeven.gcda  helloSeven.gcno

$ gcov helloSeven.c
File 'helloSeven.c'
Lines executed:100.00% of 9
Creating 'helloSeven.c.gcov'

#有生成了一个文件 .c.gcov
$ ls
helloSeven  helloSeven.c  helloSeven.c.gcov  helloSeven.gcda  helloSeven.gcno


$ cat helloSeven.c.gcov

三、查看 .c.gcov 文件内容

$ cat helloSeven.c.gcov
        -:    0:Source:helloSeven.c
        -:    0:Graph:helloSeven.gcno
        -:    0:Data:helloSeven.gcda
        -:    0:Runs:1
        -:    1:#include <stdio.h>
        -:    2:
        1:    3:void timeSeven(int count){
      101:    4:        for(int i=0; i<count; i++){
      100:    5:                if(i%7 == 0){
       15:    6:                        printf("i=%d is times of seven.\n",i);
        -:    7:                }else{
       85:    8:                        printf("i=%d is not times of 7.\n",i);
        -:    9:
        -:   10:                }
        -:   11:        }
        1:   12:}
        -:   13:
        -:   14:
        1:   15:int main(){
        -:   16:
        1:   17:        timeSeven(100);
        1:   18:        return 0;
        -:   19:}
        -:   20:
        -:   21:
        -:   22:
        -:   23:
        -:   24:

每一行起头都是大概有个冒号组合  100:  或 -:

100:  表示该语句执行了100次;

-:       表示本行不可执行;

0:      表示本行可执行,但是本次测试中,没有执行到,没有覆盖到的逻辑。

四、增加可读性,使用lcov

1. 安装lcov,lcov会调用gcov

$ sudo apt install lcov

2.使用 lcov 生成 .info 文件

$ lcov -d . -t 'Test coverage' -o 'helloSeven.info' -b . -c
Capturing coverage data from .
Found gcov version: 9.4.0
Using intermediate gcov format
geninfo: WARNING: invalid characters removed from testname!
Scanning . for .gcda files ...
Found 1 data files in .
Processing helloSeven.gcda
Finished .info-file creation


$ ls
helloSeven  helloSeven.c  helloSeven.c.gcov  helloSeven.gcda  helloSeven.gcno  helloSeven.info

3. 将 .info 生成 .html 报告形式,便于查看

$ genhtml -o helloSeven_result helloSeven.info


$ ls
helloSeven  helloSeven.c  helloSeven.c.gcov  helloSeven.gcda  helloSeven.gcno  helloSeven.info  helloSeven_result
$ ls helloSeven_result/
amber.png  emerald.png  gcov.css  glass.png  hello_gcov  index.html  index-sort-f.html  index-sort-l.html  ruby.png  snow.png  updown.png
$

——————————————————————————————————————————

与上半部分无关联

五、Ubuntu 中从 Linux 源码安装perf

1.安装:

$ sudo apt-get install linux-source
$ cd /usr/src/linux-source-5.4.0/
$ sudo tar -jxf linux-source-5.4.0.tar.bz2
opencl@opencl-PC:/usr/src/linux-source-5.4.0$ cd linux-source-5.4.0/
$ cd tools/perf/
$ make
$ sudo make install


将 perf perf-*  trace 等 复制到 /usr/local/bin/中去,使其可使用超级用户权限执行

$ perf list


$ perf list

List of pre-defined events (to be used in -e):

  duration_time                                      [Tool event]

  branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]
  branch-misses OR cpu/branch-misses/                [Kernel PMU event]
  bus-cycles OR cpu/bus-cycles/                      [Kernel PMU event]
  cache-misses OR cpu/cache-misses/                  [Kernel PMU event]
  cache-references OR cpu/cache-references/          [Kernel PMU event]


...

/*****************************************************

使用perf list命令可以列出所有能够触发perf采样点的事件。

(1)不同的系统会列出不同的结果该列表很。但是按照事件类型都可以归为以下三类:

1)Hardware Event:由PMU硬件产生的事件,比如cache命中;

2)Software Event:内核软件产生的事件,比如进程切换;

3)Trachpoint Event:内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

(2)同时还可以显示特定模块支持的perf事件:hw/cache/pmu都是硬件相关的;tracepoint基于内核的ftrace;sw实际上是内核计数器。

1)hw/hardware显示支持的硬件事件相关,如: perf list hardware

2)sw/software显示支持的软件事件列表: perf list sw

3)cache/hwcache显示硬件cache相关事件列表: perf list cache

4)pmu显示支持的PMU事件列表: perf list pmu  
5) tracepoint显示支持的所有tracepoint列表,这个列表就比较庞大: perf list tracepoint
————————————————
版权声明:本文为CSDN博主「焱齿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mijichui2153/article/details/103225756

*******************************************************/


2.perf top 

查看整个系统的性能信息:

$ sudo perf top

查看某个进程的性能信息,通过pid:

$ perf top --pid 12345
$ perf top -p 12345

1. Annotate  函数的反汇编和汇编指令的热点
2. Zoom into perf DSO  当前DSO的热点
3. Expand callchain  一级调用关系
4. 函数符号内存映射

$ sudo perf top --call-graph graph


3.perf stat


$ sudo perf stat -e cycles        ....
$ sudo perf stat -e instructions  ....


4.perf record & perf report


编译执行:

$ gcc -g -O0 helloSeven.c -o helloSeven
$ sudo perf record -a -g ./helloSeven
$ ls
helloSeven  helloSeven.c  perf.data

$ perf report


5.其他命令:

$ perf bench
$ perf mem
$ perf timechart

6.perf 原理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcov 和 perf 使用的基本套路备忘 ubuntu 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐