linux下利用valgrind工具进行内存泄露检测和性能分析

valgrind通常用来成分析程序性能及程序中的内存泄露错误

一 Valgrind工具集简绍

Valgrind包含下列工具:

1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。

2、callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。

3、cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。

4、helgrind:用于检查多线程程序的竞态条件。

5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

6、lackey:

7、nulgrind:

这几个工具的使用是通过命令:valgrand –tool=name 程序名来分别调用的,当不指定tool参数时默认是 –tool=memcheck

二 Valgrind工具详解

1.Memcheck

最常用的工具,用于检测程序中的内存问题,所有对内存的读取和写入都将被检测到,所有对Malloc、Free、new和Delete的调用都将被捕获。因此,它可以检测到以下问题:

[En]

The most commonly used tool, used to detect memory problems in the program, all read and write to memory will be detected, and all calls to malloc, free, new, delete will be captured. Therefore, it can detect the following problems:

1、对未初始化内存的使用;

2、读/写释放后的内存块;

3、读/写超出malloc分配的内存块;

4、读/写不适当的栈中内存块;

5、内存泄漏,指向一块内存的指针永远丢失;

6、不正确的malloc/free或new/delete匹配;

7、memcpy()相关函数中的dst和src指针重叠。

这些问题通常是CCompact+程序员最头疼的问题,而Memcheck在这方面可以提供很大帮助。

[En]

These problems are often the biggest headaches for CCompact + programmers, and Memcheck can be of great help here.

例如:

[En]

For example:

将程序编译生成可执行文件后执行:valgrind –leak-check=full ./程序名
输出如下:

[En]

The output is as follows:

==4832== Memcheck, a memory error detector
==4832== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al.

==4832== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==4832== Command: ./tmp
==4832==
==4832== Invalid write of size 4 // 内存越界
==4832== at 0x804843F: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== Address 0x41a6050 is 0 bytes after a block of size 40 alloc’d
==4832== at 0x4026864: malloc (vg_replace_malloc.c:236)
==4832== by 0x8048435: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832== Source and destination overlap in memcpy(0x41a602c, 0x41a6028, 5) // 踩内存
==4832== at 0x4027BD6: memcpy (mc_replace_strmem.c:635)
==4832== by 0x8048461: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832== Invalid free() / delete / delete[] // 重复释放
==4832== at 0x4025BF0: free (vg_replace_malloc.c:366)
==4832== by 0x8048477: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== Address 0x41a6028 is 0 bytes inside a block of size 40 free’d
==4832== at 0x4025BF0: free (vg_replace_malloc.c:366)
==4832== by 0x804846C: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832== Use of uninitialised value of size 4 // 非法指针
==4832== at 0x804847B: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832==
==4832== Process terminating with default action of signal 11 (SIGSEGV) //由于非法指针赋值导致的程序崩溃
==4832== Bad permissions for mapped region at address 0x419FFF4
==4832== at 0x804847B: test (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832== HEAP SUMMARY:
==4832== in use at exit: 0 bytes in 0 blocks
==4832== total heap usage: 1 allocs, 2 frees, 40 bytes allocated
==4832==
==4832== All heap blocks were freed — no leaks are possible
==4832==
==4832== For counts of detected and suppressed errors, rerun with: -v
==4832== Use –track-origins=yes to see where uninitialised values come from
==4832== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 11 from 6)
Segmentation fault

从valgrind的检测输出结果看,这几个错误都找了出来。

2.Callgrind

和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

生成可视化的图形需要下载gprof2dot:http://jrfonseca.googlecode.com/svn/trunk/gprof2dot/gprof2dot.py

这是一个python脚本,下载并修改其权限chmod+7 gpro2dot.py,并将此脚本添加到$PATH路径下的任何文件夹,我将其放在/usr/bin目录中,这样就可以直接在终端下执行gpro2dot.py。

[En]

This is a python script, download it and modify its permission chmod + 7 gprof2dot.py, and add this script to any folder in the $PATH path, I put it in the / usr/bin directory, so you can execute gprof2dot.py directly under the terminal.

Callgrind可以生成程序性能分析的图形,首先来说说程序性能分析的工具吧,通常可以使用gnu自带的gprof,它的使用方法是:在编译程序时添加-pg参数,例如:

首先执行GCC-pg-o tmp tmp.c,然后运行程序。/tMP,程序运行结束后,会在当前目录下生成一个gmon.out文件(这个文件需要gprof来分析程序)

[En]

First execute gcc-pg-o tmp tmp.c, then run the program. / tmp, after the program is finished, it will generate a gmon.out file in the current directory (this file gprof is needed to analyze the program)

然后执行gprof。/tmp|gpro2dot.py|点-Tpng-o report.png,打开report.png结果:

[En]

Then execute gprof. / tmp | gprof2dot.py | dot-Tpng-o report.png, and open the report.png result:

它表明测试被调用了5次,程序消耗的时间百分比就是测试函数。

[En]

It shows that test has been called 5 times, and the percentage of time consumed in the program is the test function.

再来看 Callgrind的生成调用图过程吧,执行:valgrind –tool=callgrind ./tmp,执行完成后在目录下生成”callgrind.out.XXX”的文件这是分析文件,可以直接利用:callgrind_annotate callgrind.out.XXX 打印结果,也可以使用:gprof2dot.py -f callgrind callgrind.out.XXX |dot -Tpng -o report.png 来生成图形化结果:

它生成的结果非常详细,甚至可以识别函数条目和库函数调用。

[En]

The results it generates are so detailed that even function entries and library function calls are identified.

3.Cachegrind

Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。

广告宣传:在过去的几个月里,Valgrind自己已经使用该工具将性能提高了25%-30%。正如早先报道的那样,KDE的开发者Team也感谢valgrind在提高KDE性能方面的帮助。

[En]

To advertise: valgrind itself has used the tool to improve performance by 25% and 30% in the past few months. As reported earlier, team, the developer of kde, also thanked valgrind for its help in improving kde performance.

它的使用方法也是:valgrind –tool=cachegrind 程序名,

4.Helgrind

它主要用于检查多线程程序中的竞争问题。Helgrind查找可由多个线程访问但并不总是锁定的内存区域。这些区域通常是线程失去同步的地方,并可能导致难以发现的错误。Helgrind实施了一种名为“橡皮擦”的竞争检测算法,并进行了进一步改进,以减少报告的错误数量。然而,Helgrind仍处于实验阶段。

[En]

It is mainly used to check for competition problems in multithreaded programs. Helgrind looks for areas of memory that are accessed by multiple threads but are not always locked. These areas are often places where threads lose synchronization and can lead to errors that are difficult to discover. Helgrind implements a competition detection algorithm called “Eraser” and makes further improvements to reduce the number of errors reported. However, Helgrind is still in the experimental stage.

首先,让我们举一个竞争的例子:

[En]

First of all, let’s give an example of competition:

这段程序的竞态在30~32行,我们想要的效果是3个线程分别对全局变量累加50次,最后全局变量的值为150,由于这里没有加锁,很明显竞态使得程序不能达到我们的目标。我们来看Helgrind是如何帮我们检测到竞态的。先编译程序:gcc -o test thread.c -lpthread ,然后执行:valgrind –tool=helgrind ./test 输出结果如下:
49c0b70: 1
49c0b70: 2
==4666== Thread #3 was created
==4666== at 0x412E9D8: clone (clone.S:111)
==4666== by 0x40494B5: pthread_create@@GLIBC_2.1 (createthread.c:256)
==4666== by 0x4026E2D: pthread_create_WRK (hg_intercepts.c:257)
==4666== by 0x4026F8B: pthread_create@ (hg_intercepts.c:288)
==4666== by 0x8048524: main (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666==
==4666== Thread #2 was created
==4666== at 0x412E9D8: clone (clone.S:111)
==4666== by 0x40494B5: pthread_create@@GLIBC_2.1 (createthread.c:256)
==4666== by 0x4026E2D: pthread_create_WRK (hg_intercepts.c:257)
==4666== by 0x4026F8B: pthread_create@
(hg_intercepts.c:288)
==4666== by 0x8048500: main (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666==
==4666== Possible data race during read of size 4 at 0x804a028 by thread #3
==4666== at 0x804859C: threadfn (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666== by 0x4026F60: mythread_wrapper (hg_intercepts.c:221)
==4666== by 0x4048E98: start_thread (pthread_create.c:304)
==4666== by 0x412E9ED: clone (clone.S:130)
==4666== This conflicts with a previous write of size 4 by thread #2
==4666== at 0x80485CA: threadfn (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666== by 0x4026F60: mythread_wrapper (hg_intercepts.c:221)
==4666== by 0x4048E98: start_thread (pthread_create.c:304)
==4666== by 0x412E9ED: clone (clone.S:130)
==4666==
==4666== Possible data race during write of size 4 at 0x804a028 by thread #2
==4666== at 0x80485CA: threadfn (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666== by 0x4026F60: mythread_wrapper (hg_intercepts.c:221)
==4666== by 0x4048E98: start_thread (pthread_create.c:304)
==4666== by 0x412E9ED: clone (clone.S:130)
==4666== This conflicts with a previous read of size 4 by thread #3
==4666== at 0x804859C: threadfn (in /home/yanghao/Desktop/testC/testmem/a.out)
==4666== by 0x4026F60: mythread_wrapper (hg_intercepts.c:221)
==4666== by 0x4048E98: start_thread (pthread_create.c:304)
==4666== by 0x412E9ED: clone (clone.S:130)
==4666==
49c0b70: 3
……

55c1b70: 51
==4666==
==4666== For counts of detected and suppressed errors, rerun with: -v
==4666== Use –history-level=approx or =none to gain increased speed, at
==4666== the cost of reduced accuracy of conflicting-access information
==4666== ERROR SUMMARY: 8 errors from 2 contexts (suppressed: 99 from 31)

helgrind成功的找到了竞态的所在位置,标红所示。
5. Massif

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

Massif对内存的分配和释放做profile。程序开发者通过它可以深入了解程序的内存使用行为,从而对内存使用进行优化。这个功能对C++尤其有用,因为C++有很多隐藏的内存分配和释放。

此外,Lawkey和Nulgrind也将提供。Lackey是一个很少使用的小工具;Nulgrind只是向开发人员展示如何创建工具。我们不会做介绍的。

[En]

In addition, lackey and nulgrind will also provide. Lackey is a small tool that is rarely used; Nulgrind just shows developers how to create a tool. We won’t make introductions.

三 使用Valgrind

Valgrind使用起来非常简单,你甚至不需要重新编译你的程序就可以用它。当然如果要达到最好的效果,获得最准确的信息,还是需要按要求重新编译一下的。比如在使用memcheck的时候,最好关闭优化选项。

valgrind命令的格式如下:

valgrind [valgrind-options] your-prog [your-prog options]

一些常见选项如下:

[En]

Some common options are as follows:

-h –help

显示帮助信息。

[En]

Displays help information.

–version

显示valgrind内核的版本,每个工具都有自己的版本。

[En]

Displays the version of the valgrind kernel, with each tool having its own version.

-q –quiet

静默运行,只打印错误消息。

[En]

Run quietly, printing only error messages.

-v –verbose

打印更详细的信息。

[En]

Print more detailed information.

–tool=

最常用的选项。运行valgrind中名为TOOLNAME的工具。如果省略工具名称,则默认情况下运行Memcheck。

[En]

The most commonly used option. Run the tool named toolname in valgrind. If the tool name is omitted, memcheck runs by default.

–db-attach=

绑定到调试器以便于调试错误。

[En]

Bind to the debugger to facilitate debugging errors.

Original: https://www.cnblogs.com/kex1n/p/11573526.html
Author: 小 楼 一 夜 听 春 雨
Title: linux下利用valgrind工具进行内存泄露检测和性能分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7099/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux服务查看

    (1)#service servicename status比如查看防火墙:#service iptables status(2)#chkconfig –list |grep 服…

    Linux 2022年8月13日
    0330
  • TortoiseGit提交每次都需要输入账号密码的解决办法

    解决办法: 小乌龟-右键-设置里面 在其中加上 : [user] name = lidebing email = lidebing@qq.com [credential] help…

    Linux 2022年8月30日
    0390
  • linux 操作sqlite3示例

    一.修改表中数据示例 1.找到要修改的db文件,这里是db.sqlite3文件, 找到要修改的表,修改密码名和密码 [root@iZwz927xptl8kw8zqrmwvcZ db…

    Linux 2022年8月13日
    0290
  • shell相关知识1

    组命令,就是将多个命令划分为一组,或者看成一个整体。 用法区别 Shell 组命令的写法有两种: { command1; command2;. . .; }(command1; c…

    Linux 2022年9月14日
    0250
  • Linux编译安装、压缩打包与定时任务服务

    一、编译安装 即使用源代码编译安装的方式,编译打包软件。特点: 可以自定制软件; 可以按需构建软件; 编译安装案例 1、下载源代码包(这里以Nginx软件包源代码为例) wget …

    Linux 2022年9月10日
    0180
  • linux安装elasticsearch

    安装步骤 下载ES wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.11.2-l…

    Linux 2022年8月11日
    0560
  • linux 常规部署教程

    1.查看端口yum -y install net-toolsnetstat -ant |grep 8898 2.查看文件前100行 tail -n 100 lmtc-member-…

    Linux 2022年8月11日
    0540
  • Linux CPU affinity指定程序运行

    csharp;gutter:true; 在Linux中,我们知道可以通过nice、renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行。&…

    Linux 2022年8月24日
    0270
  • centos7 环境搭建

    centos7 环境搭建 CentOS-7-x86_64-DVD-1511.isovmware12 安装 使用iso安装系统; 修改yum源到光盘 先把光盘CentOS-7-x86…

    Linux 2022年8月24日
    0380
  • ubuntu php7.2安装php-redis扩展

    首先查看有没有phpize命令 如果没有 phpize的话, 安装php-dev扩展, 执行 我的php版本是php7.2根据php版本,选择以下之一 php-dev php5-d…

    Linux 2022年8月26日
    0230
  • sonarqube集成gitlab身份验证

    官方操作手册 预置条件 增加gitlab身份验证,需要qa@pconline.com.cn是管理员权限 gitlab增加application https://git.pc.com…

    Linux 2022年8月30日
    0330
  • FinalShell—一体化服务器管理软件(SSH客户端)

    下面附上一些截图和官方连接: 官网:http://www.hostbuf.com/ FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运…

    Linux 2022年9月14日
    0420
  • git error: does not have a commit checked out

    问题描述:git add 文件夹时,提示 error: ‘文件夹/’ does not have a commit checked out 问题原因:确认要…

    Linux 2022年8月30日
    0460
  • XShell免费版的安装配置教程以及使用教程(超级详细)

    ​一、 XShell的作用 XShell可以在Windows界面下来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。它支持 RLOGIN、SFTP、SERIAL、T…

    Linux 2022年9月10日
    0190
  • SpringBoot入门-Redis(六)

    package com.vast; import com.vast.dao.AccountRepository; import com.vast.dao.IAccountMybat…

    Linux 2022年9月14日
    0210
  • 如何使用CMake构建c++项目

    1. c++项目构建与CMake简介 在Windows系统上我们通常使用 Visual Studio(VS)来生成我们的c++项目。我们只需在VS相应的层次目录中添加相应的文件即可…

    Linux 2022年9月10日
    0250
  • Linux性能监控文章参考

    Linux IO实时监控iostat命令详解 posted @2017-12-24 09:58 ArcerZhang 阅读(110 ) 评论() 编辑 Original: http…

    Linux 2022年8月20日
    0300
  • Git 配置 ssh-key 免密登录

    Git 配置 ssh-key 免密登录 一、git 配置免密登录主要是用于初次安装 git 后进行初始化配置 1、首先在项目根目录的空白处右键单击【git bash here】 2…

    Linux 2022年8月30日
    02690
  • 查看和修改Linux中的环境变量

    查看系统中的环境变量: printenv env export set 暂时的添加环境变量: export PYTHONPATH=$PYTHONPATH:/usr/local/tm…

    Linux 2022年8月24日
    0280
  • [编译] 8、在Linux下搭建 stm8 单片机的开发烧写环境(makefile版)

    一、SDCC(Small Device C Compiler)编译环境搭建 1.1、下载 1.2、编译 1.3、测试 二、Hex2Bin+命令行烧写工具配置使用 2.1、下载工具安…

    Linux 2022年8月24日
    0380
  • linux安装wkhtmltox

    1、下载安装wkhtmltox系统环境 这里我的系统环境是CentOS 6-64bit 所以选择:Linux CentOS 6 – 64bit 下载下来后是一个rpm包 [wkht…

    Linux 2022年8月20日
    0820
  • Linux性能优化【转】

    高并发和响应快对应着性能优化的两个核心指标: 吞吐和 延时 应用负载角度:直接影响了产品终端的用户体验 系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈,…

    2022年8月24日
    0320
  • Ubuntu20.04安装微信,QQ,企业微信

    3.终端输入: sudo apt-get install -f -y ./ukylin-wine_70.6.3.25_amd64.deb sudo apt-get install …

    Linux 2022年8月26日
    0350
  • git squash

    在 merge pr 的时候,默认是有三种选项的,分别是 普通的 merge rebase merge squash merge 这实际上对应于我们合并分支的几种方式,所以我将以本…

    Linux 2022年8月30日
    0230
  • docker Redis 安裝路徑

    /usr/local/etc posted @2022-01-14 17:35 刘大飞 阅读(15 ) 评论() 编辑 Original: https://www.cnblogs….

    Linux 2022年9月14日
    0330
  • IDEA使用Git出现push to origin/master was rejected错误解决方案

    在IDEA中配置码云的URL,如下图 切换到自己项目所在的目录,右键选择GIT BASH Here 在terminl窗口中依次输入命令: git pull git pull ori…

    Linux 2022年8月30日
    0270

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部