您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

性能工具之 C/C++ 分析工具 valgrind

时间:2021-07-09 11:14:33  来源:CSDN  作者:编程Class

一、前言

其实对 C/C++ 的应用来说,查看函数时间调用和内存消耗调用的有很多工具,valgrind 这个工具算是做得比较不错的一个。建议直接用 yum 安装,有的说可以安装更新的版本,像我这种不喜欢各种找依赖条件的,就直接 yum 了。

二、快速使用

1、查看内存越界和泄露的情况

它的使用也非常简单,比如下面这个例子,可以查看内存越界和泄露的情况。只要用 valgrind 调用一下被测试的程序即可。

memcheck:

[root@7dgroupSample10]# vi test5.c
[root@7dgroupSample10]# gcc -Wall -o test5 test5.c
[root@7dgroupSample10]# valgrind --tool=memcheck --leak-check=full ./test5
==318==Memcheck, a memory error detector
==318==Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==318==Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==318==Command: ./test5
==318==
==318== Invalid write of size 4 //内存越界
==318==    at 0x40054E: f (in/root/GDB/Sample10/test5)
==318==    by 0x40055E: main (in/root/GDB/Sample10/test5)
==318==  Address 0x51f7068 is 0bytes after a block of size 40 alloc'd
==318==    at 0x4C29BFD: malloc(in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==318=    by 0x400541: f (in/root/GDB/Sample10/test5)
==318=    by 0x40055E: main (in/root/GDB/Sample10/test5)
==318==
==318==
==318==HEAP SUMMARY:
==318==     in use at exit: 40 bytes in 1 blocks
==318==   total heap usage: 1 allocs, 0 frees, 40bytes allocated
==318==
==318== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 //内存泄露
==318==    at 0x4C29BFD: malloc(in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==318==    by 0x400541: f (in/root/GDB/Sample10/test5)
==318==    by 0x40055E: main (in/root/GDB/Sample10/test5)
==318==
==318==LEAK SUMMARY:
==318==    definitely lost: 40 bytes in 1 blocks
==318==    indirectly lost: 0 bytes in 0 blocks
==318==      possibly lost: 0 bytes in 0 blocks
==318==    still reachable: 0 bytes in 0 blocks
==318==         suppressed: 0 bytes in 0 blocks
==318==
==318==For counts of detected and suppressed errors, rerun with: -v
==318==ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 1 from 1)
[root@7dgroupSample10]#

2、查看引用次数,命中率等信息

再看一下它的其他工具:

cachegrind: Cache分析器,可以查看引用次数,命中率等信息。

[root@7dgroupSample10]# valgrind --tool=cachegrind ./test5
==1655==Cachegrind, a cache and branch-prediction profiler
==1655==Copyright (C) 2002-2013, and GNU GPL'd, by Nicholas.NEThercote et al.
==1655==Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==1655==Command: ./test5
==1655==
--1655--warning: L3 cache found, using its data for the LL simulation.
--1655--warning: specified LL cache: line_size 64 assoc 20  total_size 31,457,280
--1655--warning: simulated LL cache: line_size 64 assoc 30  total_size 31,457,280
==1655==
==1655== I   refs:      152,928
==1655== I1  misses:        765
==1655== LLi misses:        759
==1655== I1  miss rate:    0.50%
==1655== LLi miss rate:    0.49%
==1655==
==1655== D   refs:       51,260 (39,547 rd   + 11,713 wr)
==1655== D1  misses:      2,861 ( 2,321 rd   +    540 wr)
==1655== LLd misses:     2,384  ( 1,891 rd   +   493 wr)
==1655== D1  miss rate:     5.5% (  5.8%     +    4.6% )
==1655== LLd miss rate:     4.6%(   4.7%     +   4.2%  )
==1655==
==1655== LL refs:        3,626  ( 3,086 rd   +   540 wr)
==1655== LL misses:      3,143  ( 2,650 rd   +   493 wr)
==1655== LL miss rate:      1.5%(   1.3%     +   4.2%  )
[root@7dgroupSample10]# 

3、查看函数调用关系及时间消耗

callgrind: 查看函数调用关系及时间消耗

[root@7dgroupSample10]# valgrind --tool=callgrind /usr/sbin/Nginx
==1713==Callgrind, a call-graph generating cache profiler
==1713==Copyright (C) 2002-2013, and GNU GPL'd, by Josef Weidendorfer et al.
==1713==Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==1713==Command: /usr/sbin/nginx
==1713==
==1713==For interactive control, run 'callgrind_control -h'.
==1713==
==1713==Events    : Ir
==1713==Collected : 8916001
==1713==
==1713==I   refs:      8,916,001

[root@7dgroupSample10]# ll
总用量 884
-rw-------.1 root root   5047 4月  17 21:12 cachegrind.out.1655
-rw-------.1 root root 129128 4月  17 21:15callgrind.out.1702
-rw-------. 1 root root 128813 4月 17 21:16 callgrind.out.1713

这个结果可以生成调用图。

如下所示:

性能工具之 C/C++ 分析工具 valgrind

 

还可以用 kcachegrind(有 linux 和 windows 版本)打开 out 文件。

如下所示 :

性能工具之 C/C++ 分析工具 valgrind

 

在这个图的下面还有一个百分比图例,直接双击可以一层层 drill down下去,直到一个具体的函数。也可以直接看到相应的源码(前提是有 ELF 文件)。

三、总结

这个工具有它的局限性,就是它不能 attach 进程。如果要查看运行中的进程的内存消耗和函数消耗情况,可以使用其他工具。有感兴趣的以后我再写如何查看运行中的C/C++剖析工具。

工具用好了事半功倍,但是前提是理解原理。

转载于
https://blog.csdn.net/zuozewei/article/details/118460011?utm_medium=distribute.pc_feed_v2.none-task-blog-yuanlijihua_tag_v1-2.pc_personrecdepth_1-utm_source=distribute.pc_feed_v2.none-task-blog-yuanlijihua_tag_v1-2.pc_personrec



Tags:valgrind   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、前言其实对 C/C++ 的应用来说,查看函数时间调用和内存消耗调用的有很多工具,valgrind 这个工具算是做得比较不错的一个。建议直接用 yum 安装,有的说可以安装更新的版本,像...【详细内容】
2021-07-09  Tags: valgrind  点击:(407)  评论:(0)  加入收藏
▌简易百科推荐
前几天有个后端程序员的朋友和小慕吐槽:今年大部分的时间一直在重复着「增删改查」,回顾这一年基本没啥进步,内卷严重啊,这样下去好怕被裁员啊!在现实情况中,好像大多数人都会遭遇...【详细内容】
2022-10-25  慕课网  今日头条  Tags:C++   点击:(9)  评论:(0)  加入收藏
“协程”(coroutine),就是把Linux epoll的异步IO机制通过长跳转(long jmp)封装起来,形成一个在用户看来“连续的”流程。所有操作系统的异步IO,都分为启动函数和回调函数。以Linux...【详细内容】
2022-10-08  底层技术栈  今日头条  Tags:C语言   点击:(38)  评论:(0)  加入收藏
经过我前面介绍的C++学习书籍、博客网站、在线视频学习网站(没有看过的同学可以到我的主页翻看),相信大家已经有一些C++基础的,有了理论,需要通过项目来提升自身技术能力,下面推荐...【详细内容】
2022-10-07  程序员柠檬橙  今日头条  Tags:C++   点击:(46)  评论:(0)  加入收藏
微软的Windows长期霸占80%以上的市场份额,Windows视窗界面开启了全世界绝大多数人使用电脑的启蒙之旅,更为震撼的是非洲支教小伙竟然手绘office界面教孩子们学习电脑知识。 1...【详细内容】
2022-09-27  汇聚魔杖  今日头条  Tags:C++   点击:(35)  评论:(0)  加入收藏
上升沿和下降沿在我们开发上位机时使用率非常高,常见于消息触发、脉冲归档等。但是在C#中没有类似PLC中的上升沿、下降沿那样的指令,需要我们自己编码来实现。首先我们创建一...【详细内容】
2022-09-27  HwLib  今日头条  Tags:C#   点击:(112)  评论:(0)  加入收藏
很多人会有一个疑问C语言编译器为什么能够用C语言编写?今天就来带大家一探究竟!所谓C语言编译器,就是把编程得到的件,比如.c,.h的件,进行读取,并对内容进行分析,按照C语言的规则,将...【详细内容】
2022-09-25  互联共商     Tags:C语言   点击:(37)  评论:(0)  加入收藏
C风格的面向对象设计,是从Linux内核代码流行开的一种设计模式。C++并不适合编写系统内核代码,但内核里的很多模块又非常的OOP[呲牙]所以Linux之父就想出了这么一套C风格的OOP,...【详细内容】
2022-09-25  互联网资讯看板     Tags:框架   点击:(35)  评论:(0)  加入收藏
编译 | 核子可乐、Tina微软 Azure CTO 向旧语言猛烈开炮,C++ 之父对此进行了辩护。微软 Azure CTO Mark Russinovich 呼吁放弃 C 和 C++ 这两门久经时间考验,被广泛应用于高性...【详细内容】
2022-09-21  InfoQ     Tags:C++   点击:(44)  评论:(0)  加入收藏
函数指针函数也有自己的地址,函数名/&函数名 就是函数的地址 1.1基本形式在 数组指针的学习中我们了解到int arr[5]; int (*pa)[5] = &arr;//pa是数组指针指针变量pa的类型...【详细内容】
2022-09-07  互联网资讯看板   网易号  Tags:C语言   点击:(83)  评论:(0)  加入收藏
本示例主要是讲明sql解析的原理。前言阅读本文需要有一定正则表达式基础 正则表达式基础教程 ,和编译原理的基础。有使用过VUE的伙伴可能知道vue是自定了模版解析编译器的,vue...【详细内容】
2022-09-01  中年农码工    Tags:c#   点击:(71)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条