Linux C程序内存泄露检测

Linux内存泄漏检测方法总结 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示内存检测方式无非分为两种:1、维护一个内存操作链表,当有内存申请操作时,将其加入此链表中,当有释放操作时,从申请操作从链表中移除。 阅读详情

对于程序员来说,最痛苦的就是内存的申请与释放。内存泄露也是程序中经常遇到的问题。为了更好的定位内存泄露问题,我们有必要熟悉一些内存泄露的检测工具。今天主要找到了以下四个内存检测工具,使用起来都比较方便。

valgrind

 安装valgrind,执行下列程序

#include <stdlib.h>

void func()
{
        int *p = malloc(10*sizeof(int));
        p[10] = 0;
}

int main()
{
        func();
        return 0;
}

编译:
 gcc -g -o valgrindtst valgrindtst.c

执行内存检测:

valgrind --tool=memcheck -leak-check=full ./valgrindtst

内存检测结果:

==19896== Memcheck, a memory error detector
==19896== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==19896== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==19896== Command: ./valgrindtst
==19896==
==19896== Invalid write of size 4
==19896==    at 0x80483DF: func (valgrindtst.c:6)
==19896==    by 0x80483F1: main (valgrindtst.c:11)
==19896==  Address 0x401a050 is 0 bytes after a block of size 40 alloc'd
==19896==    at 0x40072D5: malloc (vg_replace_malloc.c:291)
==19896==    by 0x80483D5: func (valgrindtst.c:5)
==19896==    by 0x80483F1: main (valgrindtst.c:11)
==19896==
==19896==
==19896== HEAP SUMMARY:
==19896==     in use at exit: 40 bytes in 1 blocks
==19896==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==19896==
==19896== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==19896==    at 0x40072D5: malloc (vg_replace_malloc.c:291)
==19896==    by 0x80483D5: func (valgrindtst.c:5)
==19896==    by 0x80483F1: main (valgrindtst.c:11)
==19896==
==19896== LEAK SUMMARY:
==19896==    definitely lost: 40 bytes in 1 blocks
==19896==    indirectly lost: 0 bytes in 0 blocks
==19896==      possibly lost: 0 bytes in 0 blocks
==19896==    still reachable: 0 bytes in 0 blocks
==19896==         suppressed: 0 bytes in 0 blocks
==19896==
==19896== For counts of detected and suppressed errors, rerun with: -v
==19896== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 12 from 8)

检测到内存泄露与数组越界的错误

mtrace

 libc提供的内存检测工具。一般系统中都自带该工具。

#include <stdlib.h>
#include <mcheck.h>

void func()
{
        int *p = (int*)malloc(100*sizeof(int));
}

int main()
{
        setenv("MALLOC_TRACE", "logfile",1);
        mtrace();
        func();
        return 0;
}

编译:gcc -g -o mtracetst mtracetst.c
执行程序后,生成logfile文件,内容如下:

= Start
@ ./mtracetst:[0x8048436] + 0x8a35428 0x190
@ /lib/libc.so.6:(clearenv+0x7c)[0x26a87c] - 0x8a35008
@ /lib/libc.so.6:(tdestroy+0x47)[0x318747] - 0x8a35080
@ /lib/libc.so.6:(tdestroy+0x4f)[0x31874f] - 0x8a350a0

内容不太好理解,使用perl语言实现的bin程序mtrace可以将这些内容转换为可读内容,如下:

[root@localhost test]# mtrace logfile
$* is no longer supported at /usr/bin/mtrace line 2.
- 0x0000000008a35008 Free 3 was never alloc'd 0x26a87c
- 0x0000000008a35080 Free 4 was never alloc'd 0x318747
- 0x0000000008a350a0 Free 5 was never alloc'd 0x31874f

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000008a35428    0x190  at 0x8048436

memwatch

 A memory leak detection tool. Basically, you add a header file to your souce code files, and compile with MEMWATCH defined or not. The header file MEMWATCH.H contains detailed instructions. This is a list of some of the features present in version 2.71:
- ANSI C
- Logging to file or user function using TRACE() macro
- Fault tolerant, can repair it’s own data structures
- Detects double-frees and erroneous free’s
- Detects unfreed memory
- Detects overflow and underflow to memory buffers
- Can set maximum allowed memory to allocate, to stress-test app
- ASSERT(expr) and VERIFY(expr) macros
- Can detect wild pointer writes
- Support for OS specific address validation to avoid GP’s (segmentation faults)
- Collects allocation statistics on application, module or line level
- Rudimentary support for threads (see FAQ for details)
- Rudimentary support for C++ (disabled by default, use with care!)

 

下载,解压,在解压目录中,写如下测试程序:

#include <stdlib.h>
#include "memwatch.h"

int main()
{
        char *p1 = NULL, *p2 = NULL;
        p1 = malloc(100*sizeof(char));
        p2 = malloc(1000*sizeof(char));
        free(p2);
}


编译: gcc -g -o memwatchtst -DMEMWATCH -DMEMWATCH_STDIO memwatchtst.c memwatch.c执行结果:

[root@localhost memwatch-2.71]# ./memwatchtst
MEMWATCH detected 1 anomalies
在当前目录下生成memwatch.log文件,打开,内容如下:

============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============

Started at Wed Jan 15 01:30:01 2014

Modes: __STDC__ 64-bit mwDWORD==(unsigned long)
mwROUNDALLOC==8 sizeof(mwData)==32 mwDataSize==32


Stopped at Wed Jan 15 01:30:01 2014

unfreed: <1> memwatchtst.c(7), 100 bytes at 0x9ea11f0   {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ................}

Memory usage statistics (global):
 N)umber of allocations made: 2
 L)argest memory usage      : 1100
 T)otal of all alloc() calls: 1100
 U)nfreed bytes totals      : 100

gc

垃圾回收器、内存泄露检测

安装gc,然后可以执行下列测试程序

#include <gc.h>
#include <stdio.h>
#include <stdlib.h>
#include <gc/leak_detector.h>
void test()
{
        int i;
        char *p;
        for(i=0; i < 10000; i++)
        {
                p = GC_malloc(100000*sizeof(int));
                if(NULL == p)
                {
                        printf("NO memory\n");
                        break;
                }
        }

}

void chkmem()
{
        int *p[10];
        int i;
        GC_find_leak = 1;
        for(i=0; i < 10; i++)
        {
                p[i] = (int *)malloc(sizeof(int)+i);
        }
        for(i=0; i<7;i++)
        {
                free(p[i]);
        }
        for(i=3; i < 10; i++)
        {
                 p[i] = (int *)malloc(sizeof(int)+i);
        }
        CHECK_LEAKS();
}
int main()
{
        test();
        chkmem();
}

编译:

 export export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

 gcc -g -o gctst gctst.c -lgc

执行结果:

[root@localhost test]# ./gctst
Leaked composite object at start: 0x93d2000, appr. length: 400008
Leaked composite object at start: 0x93b2fa0, appr. length: 16
Leaked composite object at start: 0x93b2fb0, appr. length: 16
Leaked composite object at start: 0x93b2fc0, appr. length: 16
Leaked composite object at start: 0x94f8000, appr. length: 400008
Leaked composite object at start: 0x9496000, appr. length: 400008
Leaked composite object at start: 0x9434000, appr. length: 400008
[root@localhost test]#
注:test函数说明gc有自动回收内存的机制;chkmem函数说明,gc可以检测内存泄露

 

valgrind和memwatch的输出信息比较适合我们的阅读习惯,可以很容易定位内存泄露的位置。

gc有垃圾内存回收机制。

【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南 Valgrind 是一个非常强大的工具,主要用于内存管理错误检测,以及 CPU 和内存分析。 阅读详情

相关推荐

Plecs仿真进阶:半桥LLC谐振变换器从开环到闭环的实战解析

本文通过Plecs软件,详细解析了半桥LLC谐振变换器从开环模型搭建到闭环控制实现的完整仿真流程。文章深入探讨了谐振参数设置、关键波形解读,并重点分享了基于PI控制器的闭环调试实战经验与参数整定技巧,帮助工程师高效掌握这一高效拓扑的仿真与设计方法。

weixin_29231263的博客 278

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

目录 即可即用 简介 Valgrind工具详解 安装 使用 检测内存泄漏 其他内存问题 memcheck 工具的常用选型 其他选项 附录 其他类似工具 即可即用 1、没有安装的先在程序运行的主机上安装,安装教程见:1.4安装。 2、使用: 命令: valgrind--leak-check=full --log-file=leak.log/...

我的笔记本 8015

【VAX 小番茄安装详细步骤】

本文详细介绍了在VS2022环境下安装Visual Assist X(番茄助手)的步骤及常见问题解决方案。主要内容包括:安装前的兼容性设置(需修改为Windows7兼容模式)、安装流程(卸载旧版本、勾选对应VS版本、替换关键dll文件)以及常见问题处理(如安装失败、工具栏图标缺失等)。文章提供了完整的下载链接和操作截图,特别强调了安装失败后的清理方法(注册表、安装目录和残余文件删除)。最后给出了安装成功后的测试运行指引。

qq_23962581的博客 1715

C/C++内存检测工具valgrind--memcheck

Valgrind简介 Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核 —— 一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,我们可以使用它的工具:Memcheck。 Valgrind安装 方法 1. valgrind官网:http://valgrind.org下载 方法 2. Ubuntu: sudo apt-get install

Peerless__的博客 3759

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

通过采用下面方法检查内容,还是系统无法更新下载,但是错误代码变成了——下载错误 - 0x80004002-到底如何解决?必须重装系统吗?-这个到底是系统问题,还是硬件问题?

‌。

qq_15963745的博客 335

C++内存分析工具

c++ 内存分析工具

xiaofeilongyu的博客 4619

正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真

调节方波信号的占空比,也就是改变输出信号的高低电平时间比例,可以设置电容不同的充放电时间来达到目的,RP2可以使得电容具有不同的充放电时间,其中二极管起到限制电流流向的作用。假设U+>U,那么输出端就达到正向饱和,电容开始充电,当电容电压大于同相输入端电压时,此时电容开始放电,由此往复,从而产生方波信号。3,正反馈支路占优势,电路开始起振并不是稳定的,振荡会不断增大,最终将导致运放饱和,输出的波形是削波失真的正弦波。通常在电路中引入负反馈,例如使用负温度系数的热敏电阻,以自动稳定增益,防止输出波形失真。

XU157303764的博客 5319

Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed

springboot启动时会自动注入数据源和配置jpa  解决:在@SpringBootApplication中排除其注入  @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})  ...

qq_41220455的博客 9万+

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1041

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数本文禁止转载!项目简介:YOLOv5检测器:DeepSort追踪器:运行demo:训练自己的模型:调用接口:创建检测器:调用检测接口: 本文禁止转载! 项目简介: 使用YOLOv5+Deepsort实现车辆行人追踪和计数,代码封装成一个Detector类,更容易嵌入到自己的项目中。 代码地址(欢迎star): https://github.com/Sharpiless/Yolov5-deepsort-inference 最终效果:

梁瑛平的博客 5万+

spring_统一异常处理

2 案例的引入 1 实体类的编写: package com.zs.bussiness.pojo; import lombok.Data; import javax.validation.constraints.NotNull; @Data public class OrderParam { @NotNull private Long goodsId; @NotNull private Long userId; @NotNull private Integer

一个搬砖工人 1648

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux下C程序内存泄露检测

Linux下C程序内存泄露检测 在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在linux下编写程序的一个大问题。  是不是说没有一种内存检查工具能够在linux使用呢,也不是,像valgrind工具...

weixin_30707875的博客 86

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python c语言库 内存泄露_Linux C程序内存泄露检测

对于程序员来说,最痛苦的就是内存的申请与释放。内存泄露也是程序中经常遇到的问题。为了更好的定位内存泄露问题,我们有必要熟悉一些内存泄露的检测工具。今天主要找到了以下四个内存检测工具,使用起来都比较方便。valgrind安装valgrind,执行下列程序#include void func(){int *p = malloc(10*sizeof(int));p[10] = 0;}int main()...

weixin_39540426的博客 114

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Tools】Linux下C和C++程序中内存泄露检测

00. 目录 文章目录00. 目录01. 前言02. valgrind安装03. 使用未初始化的内存04. 使用野指针05. 动态内存越界访问06. 分配空间后没有释放07. 不匹配使用delete或者free08. 两次释放同一块内存09. 总结10. 附录 01. 前言 C/C++运行高效,不管是操作系统内核还是对性有要求的程序(比如游戏引擎)都要求使用C/C++来编写,其实C/C++强大的一...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 5868

Linux下C和C++程序中内存泄露检测

01. 前言 C/C++运行高效,不管是操作系统内核还是对性有要求的程序(比如游戏引擎)都要求使用C/C++来编写,其实C/C++强大的一点在于能够使用指针自由地控制内存的使用,适时的申请内存和释放内存,从而做到其他编程语言做不到的高效地运行。但是内存管理是一把双刃剑,用好了削铁如泥,用不好自断一臂。在申请堆上内存使用完之后中如果做不到适时有效的释放,那么就会造成内存泄露,久而久之程序就会将系统...

黑马程序员官方博客 1069

如何发现内存泄漏

http://www.dewen.org/q/579/?ts=edm20120823&e=NDA0NzQwMzcwQHFxLmNvbQ%3D%3D 1. 如何发现内存泄漏    ps -aux 2. 静态分析    **2.1 手动检测** #include #include #include int LeakTest(char * Para) { if(NUL

tanqiuwei的专栏 3234

【开发工具】【Valgrind】内存问题检测工具(valgrind)的使用

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

诸葛一帆丶的博客 2912

内存泄漏检测神器valgrind

title: 内存泄漏检测神器valgrind categories:[内存检测] tags:[valgrind] date: 2022/01/08 作者:hackett 微信公众号:加班猿 1.概述 Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind 发行版目前包括七个生产质量工具:一个内存错误检测器、两个线程错误检测器、一个缓存和分支预测分析器、一个调用图生成缓存和分支预测分析器,以及两个不同的堆分析器。它还包括一个实验性的 SimPoint 基本块矢量生.

hackett的博客 2425

Python编程基础:第三十节 文件检测File Detection

检测指定路径下是否存在该文件

wzy628810的博客 1100

Android应用方法隐藏及反调试技术浅析

原文地址: http://www.freebuf.com/articles/terminal/75944.html 0x00 前言 Android应用的加固和对抗不断升级,单纯的静态加固效果已无法满足需求,所以出现了隐藏方法加固,运行时动态恢复和反调试等方法来对抗,本文通过实例来分析有哪些对抗和反调试手段。 0x01 对抗反编译 首先使用apktool进行反

Omnictech的专栏 3822

Rootkit隐藏进程和端口检测

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。 例如:inetd或者login,为攻击者提供后门;隐藏攻击者的目录和进程的程序,ps、netstat等常见命令。 rootkit检测也成为主机安全一项重要功能,针对rootkit中最常见隐藏进程、端口检测,主要分为两种检测思路...

手牵手科技 2908

准确识别ELF文件使用的libc.so版本,LibcSearcher 工具的使用

准确到小数点100位,识别ELF文件使用的libc.so版本,LibcSearcher 工具的使用

ifthengg的博客 2697

android 系统内存检查

1.     Introduction Android对内存的使用包括内存泄漏和内存越界,内存泄漏会导致系统内存减少,最终分配不到内存,这样大的程序就不能运行,甚至系统没有内存而崩溃。Android中kernel和应用程序都可能会有内存泄漏和越界。对于Java代码,在越界的时候虚拟机会加以检查并抛出异常。而对于C/C++代码,越界的时候就悄无声息地让程序出错或crash 2.     

u011279649的专栏 2152

内存泄漏一招搞定:valgrind

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

feikudai8460的博客 912
上一篇: 字符串中的字符包含问题
下一篇: splint的安装与使用
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值