【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析...

Valgrind是一个强大的Linux程序调试和分析工具,能够检测内存泄漏、越界访问、非法指针等问题。通过--leak-check选项,可以检查程序的内存泄漏情况,--log-file参数将检测信息写入日志。Valgrind的memcheck工具能检测未初始化内存、使用野指针、内存越界、不匹配的内存释放等问题。此外,还能分析cache命中率、多线程竞态条件,并提供详细的错误定位信息,有助于优化代码和解决内存相关错误。
摘要由CSDN通过智能技术生成

目录

即看即用

详细

简介

Valgrind工具详解

安装

使用

检测内存泄漏

其他内存问题

memcheck 工具的常用选型

其他选项

附录 其他类似工具

实例分析:

03. 使用未初始化的内存

04. 使用野指针

05. 动态内存越界访问

06. 分配空间后没有释放

07. 不匹配使用delete或者free

08. 两次释放同一块内存

1. sample::printx()

valgrind的原理

valgrind--memcheck原理


即看即用

1、没有安装的先在程序运行的主机上安装,安装教程见:1.4安装。

2、使用:

命令:

valgrind  --leak-check=full  --log-file=leak.log   /proc/path/proc_name

参数说明:--leak-check=full 信息显示具体泄漏位置

     --log-file=leak.log 将检测信息输入到日志leak.log中

     /proc/path/proc_name 需要检测的程序

3、报错信息和说明:

==29646== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)

==29646== malloc/free: in use at exit: 10 bytes in 1 blocks.   //指示在程序退出时,还有多少内存没有释放。

==29646== malloc/free: 1 allocs, 0 frees, 10 bytes allocated.  // 指示该执行过程malloc和free调用的次数。

==29646== For counts of detected errors, rerun with: -v     // 提示如果要更详细的信息,用-v选项。

==29646== searching for pointers to 1 not-freed blocks.

==29646== checked 56,164 bytes.

==29646==

==29646== LEAK SUMMARY:

==29646==    definitely lost: 10 bytes in 1 blocks. //确定的内存泄露(Definitely lost)

==29646==    possibly lost: 0 bytes in 0 blocks.   //可能的内存泄露(Possibly lost)

(发现了一个指向某块内存中部的指针,而不是指向内存块头部。这种指针一般是原先指向内存块头部,后来移动到了内存块的中部,还有可能该指针和该内存根本就没有关系,检测工具只是怀疑有内存泄漏)

==29646==    still reachable: 0 bytes in 0 blocks.// still reachable: 表示泄漏的内存在程序运行完的时候,仍旧有指针指向它,因而,这种内存在程序运行结束之前可以释放。一般情况下valgrind不会报这种泄漏,除非使用了参数 --show-reachable=yes。

==29646==    suppressed: 0 bytes in 0 blocks.

==29646== Rerun with --leak-check=full to see details of leaked memory.

==29661==  10 bytes in 1 blocks are definitely lost in loss record 1 of 1

==29661==  at 0x401A846: malloc (vg_replace_malloc.c:149)

==29661==  by 0x804835D: main (memleak.c:6)

==29776==   Invalid write of size 1             //堆内存越界被查出来(非法写操作)

==29776==    at 0x80483D2: main (invalidptr.c:7)

==29776==    Address 0x4159034 is 2 bytes after a block of size 10 alloc'd

==29776==    at 0x401A846: malloc (vg_replace_malloc.c:149)

==29776==    by 0x80483C5: main (invalidptr.c:6)

==29776==

==29776==    Source and destination overlap in memcpy(0x4159029, 0x4159028, 5) //踩内存

==29776==    at 0x401C96D: memcpy (mc_replace_strmem.c:116)

==29776==    by 0x80483E6: main (invalidptr.c:9)

==29776==

==29776==    Invalid free() / delete / delete[] //重复释放

==29776==    at 0x401B3FB: free (vg_replace_malloc.c:233)

==29776==    by 0x8048406: main (invalidptr.c:16)

==29776== Address 0x4159028 is 0 bytes inside a block of size 10 free'd

==29776==    at 0x401B3FB: free (vg_replace_malloc.c:233)

==29776==    by 0x80483F8: main (invalidptr.c:15)

==29776==

==29776==   Use of uninitialised value of size 4 //非法指针(size 4 ,32bit设备),导致coredump

==29776==    at 0x804840D: main (invalidptr.c:19)

==29776== 

==29776== Process terminating with default action of signal 11 (SIGSEGV): dumping core

==29776== Bad permissions for mapped region at address 0x80482AD

==29776==    at 0x804840D: main (invalidptr.c:19)

==29776==

详细

简介

https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html

    Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等。Valgrind可以检测内存泄漏和内存越界,还可以分析cache的使用等,灵活轻巧而又强大。    

Valgrind的最新版是3.2.3,该版本包含下列工具:

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

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

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

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

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

    6、lackey:

    7、nulgrind:

Valgrind工具详解


Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示:


valgrind支持的工具:memcheck  addrcheck cachegrind Massid helgrind  Callgrind,运行时必须指明想用的工具,如果省略工具名,默认运行memcheck

1,memcheck


1),使用未初始化的内存
2),读/写已经被释放的内存
3),读/写内存越界
4),读/写不恰当的内存栈空间
5),内存泄露,指向一块内存的指针永远丢失
6),使用malloc/new/new[]和free/delete/delete[]不匹配
7),memcpy()相关函数中的src和dst的内存重叠
常用选项:--leak-check=<no|summary|yes|full> [default:summary]

2,cachegrind

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

    作一下广告:valgrind自身利用该工具在过去几个月内使性能提高了25%-30%。据早先报道,kde的开发team也对valgrind在提高kde性能方面的帮助表示感谢。

3,helgrind


查找多线程中的竞争数据寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。

4,Callgrind


收集程序运行时的一些数据,函数调用关系等信息,汉可以有选择的进行cache模拟,在运行结束后,它会把分析数据写入一个文件,callgrind_annotate可以吧这个文件的内容转化成可读的形式


一般用法:

        valgrind --tool=callgrind ./test   会在当前目录下生成callgrind.out.[pid]

killall callgrind   结束程序
callgrind_annotate --auto=yes callgrind.out.[pid] > log
vi  log
5,Massif
堆栈分析器,能测量程序在堆栈中使用了多少内存
6,lackey
lackey是一个实例程序,以其为模板可以创建你自己的工具,在程序结束后,它打印一些基本的关于程序执行统计数据

5. Massif

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

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

此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。

Valgrind的参数(所有工具都适应)
--tool=<name>
-h --help
--version
-q --quiet     安静的运行,只打印错误信息
--verbose     更详细的信息
--trace-children=<yes|no> 跟踪子进程,默认no
--trace-fds=<yes|no>    跟踪打开的文件描述符,默认no
--time-stamp=<yes|no>    增加时间戳到LOG信息,默认no
--log-fd=<number>     输出log信息到文件描述符
--log-file-exactly=<file>   输出log信息到file
--xml=yes         将信息以xml格式输出,只有memcheck可用
--num-callers=<number>
--error-exitcode=<number>  如果发现错误则返回错误码
--db-attach=<yes|no>    当出现错误,valgrind会自动启动调试器,默认no
--db-command=<command>   启动调试器的命令行选项

valgrind(memcheck)包含7类错误

1,illegal read/illegal write errors  
 提示信息:[invalid read of size 4]
2,use of uninitialised values 
  提示信息:[Conditional jump or move depends on uninitialised value]
3,use of uninitialised or unaddressable values in system calls  
  提示信息:[syscall param write(buf) points to uninitilaised bytes]
4,illegal frees  
  提示信息:[invalid free()]
5,when a heap block is freed with an inappropriate deallocation function  
  提示信息:[Mismatched free()/delete/delete[]]
6,overlapping source and destination blocks
  提示信息:[source and destination overlap in memcpy(,)]
7,memory leak detection
 1),still reachable 
    内存指针还在还有机会使用或释放,指针指向的动态内存还没有被释放就退出了
 2),definitely lost

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值