实用小代码之内存泄漏检测(二)

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

实用小代码之内存泄漏检测(二)


    继上次 实用小代码之内存泄漏检测 一文。这次继续介绍另一个我平时用于动态监测内存泄漏的代码。

    我这里所说的 动态监测内存泄漏 是指在程序执行时,以替换 malloc 和 free 函数来达到检测内存泄漏的目的,因为内存泄漏的主要来源就是 malloc 和 free 这组函数。相比那些分析源代码的检测工具,动态监测能够很好的检测循环中分配的内存是否被泄露。下面我不想多说,一切以代码来说话。

    这里的代码只是给各位一个抛砖引玉的借鉴。其中还有很多不完善的地方。比如没有多线程锁之类的问题。

/*
    PROGRAMER: Wayne Huang
    DATE: 2008.04.18
    LICENCE: GPL v2.0
*/


#define MMALLOC(s) mm_malloc(s,__FILE__,__LINE__)
#define MFREE(p) mm_free(p,__FILE__,__LINE__)
#define MOUTWE "[%s:%d] {%c} 0x%x "

typedef 
struct mmbs mmbs;
struct mmbs{
  mmbs 
*next;
  
char *file;
  
int line;
  
void *mm;
}
;

static mmbs mhandle={NULL,0,0,0};
mmbs 
*handle=&mhandle;

void *mm_malloc(unsigned int s,char *file,int line);
void mm_free(void *p,char *file,int line);
void mm_exit(int rel);

void *mm_malloc(unsigned int s,char *file,int line){
  mmbs 
*p=malloc(sizeof(mmbs)+s);
  mmbs 
*i=NULL;

  
if(p){
    p
->next=NULL;
    p
->file=file;p->line=line;
    p
->mm=&p[1];
    
    
for(i=handle;i->next;i=i->next);

    i
->next=p;
  }

  
return(p->mm);
}


void mm_exit(int rel){
  mmbs 
*t=NULL;

  
for(t=handle->next;t;t=t->next){
    printf(MOUTWE,t
->file,t->line,'E',(int)t->mm);
  }

  
if(rel){
    t
=handle->next;
    
while(t){
      handle
->next=t->next;
      free(t);
      t
=handle->next;
    }

  }

      
  
return;
}


void mm_free(void *p,char *file,int line){
  mmbs 
*now=handle,*pre=handle;
  
int nf=1;
  
if(p){
    
while(now){
      
if(now->mm==p){
    pre
->next=now->next;
    free(now);
    nf
=0;
    
break;
      }
else{
    pre
=now;
    now
=now->next;
      }

    }

    
if(nf){
      printf(MOUTWE,file,line,
'W',(int)p);
    }

  }

  
return;
}

     用 MMALLOC(size); 替代你原先代码中的 malloc(size); MFREE(p); 替代你原来的 free(p); 然后在程序退出以前 执行函数 mm_exit(1); 就可以查看报告,并将泄漏的内存一并释放。如果需要在代码执行过程中查看内存的分配情况,可以执行 mm_exit(0); 来查看。

    两个函数的不同之处在于,第一个会将未释放的内存释放掉。而第二个只是显示通过函数分配的内存情况。

    对于程序执行过程中的输出 {W} 表示释放了一个没有被申请的内存。而 {E} 表示有内存泄漏的情况。在报告中会指明代码的具体位置等相关信息。


文外音:
    原本在第一篇文章发表后,我曾记得有个人在我的文章留言里用C++写了一长串的代码,大概是我代码的两倍吧,好像还没贴完。来实现类似于我今天写的这点代码实现的功能,我粗略得看了下。其中用了符号的重载之类的。的确,我没有办法在不改变人们编程习惯的情况下用C语言实现更好的动态监测泄漏的代码。

   我个人的观点是,能用10行代码解决的事情,绝对不要用100行代码来解决。


北斗星君(黄庠魁)

 
C/C++内存泄漏及检测 wikipedia中这样定义内存泄漏:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。 阅读详情

相关推荐

浅谈C++中内存泄漏的检测

首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况:一. 在 MFC 中检测内存泄漏假如是用MFC的程序的话,很简单。默认的就有内存泄露检测的功能。

1万+

自己写内存泄露检测库

author: kevin lynx 这个内存泄露工具最基本的原理就是利用宏替换掉标准的malloc、free(暂不考虑其他内存分配函数, 如realloc、strdup),记录下每次内存分配和释放动作。因为宏的处理发生在预处理阶段,所以可以 很容易地用你自己的malloc函数替换掉标准的malloc。例如: /**//* lib.h */ #define malloc my_

痞子龙3D编程 1408

【工具】valgrind检测C++代码内存泄漏

一、valgrind介绍: valgrind是Linux下的一个开源工具,该工具用来检测c++程序是否有非法使用内存的问题,例如访问了未初始化的内存、访问数组时越界、忘记释放动态内存等问题。Linux下使用命令或者源码安装: 命令简单安装: yum install valgrind 体系结构图如下: 二、参数: --log-file=日志文件名称 --num-callers=错误记录...

天涯海角 3010

亲测免费推荐开源项目:LeakCanary智能内存泄漏检测库

LeakCanary是Square公司开发的一款Android内存泄漏检测工具,它可以自动检测应用程序中的内存泄露问题,并以友好的方式展示给开发者以便及时修复。作为一款开源免费的工具,LeakCanary已经成为Android开发中不可或缺的内存优化利器。 ## 为什么需要LeakCanary? 内存泄漏是Android应用开发中常见的问题,它会导致应用占用内存不断增加,最终引发OOM(内存溢

gitblog_00860的博客 627

如何轻松检测内存泄漏(仅7KB)

本文还有配套的精品资源,点击获取 简介:本技术分享将介绍如何使用一种高效且低开销的方法来轻松检测和追踪内存泄漏问题。内存泄漏在不自动管理内存的编程语言中尤为常见,可能导致应用性能下降甚至崩溃。文章将涉及一种轻量级的解决方案,可能包括特殊的技巧或工具来快速定位内存泄漏。此外,将提供相关的源码和资源,以及如何利用C运行时库的调试功能来实现内存泄漏检测。 1. 内存泄漏...

weixin_29301059的博客 1353

malloc内存泄漏检测

通过宏定义检测malloc产生的内存泄漏,vc++ 6.0,vc++8.0可用。

内存泄露检测方案和代码实现

文章目录1 内存泄露核心及原因2 内存泄露的危害3 常用的检查内存泄露的工具4 内存泄露检测的4种方案和代码实现内存泄露检测围绕两个问题解决定位到代码中行的方法方法1方法2方法3 (此方法不推荐使用,编译时也会出现不推荐使用的编译警告)(了解即可)方法4总结 1 内存泄露核心及原因 内存泄露(C/C++) 涉及函数: 1 malloc/calloc/relloc new 2 free delete 其核心是 有分配没有释放 内存分配和释放没有做到匹配 2 内存泄露的危害

qq_39329062的博客 1744

C 语言检测内存泄露的方法(例子)

C 语言检测内存泄露的方法 提供了例子 供大家参考 封装了malloc free函数

内存泄露的检测

介绍几种常见平台下的内存泄露检测工具 Visual C++ 在 Windows 系统下查找和修复内存泄露 使用方法 在Microsoft Visual C++中,其调试库内建了对内存泄漏的支持; 对于下面这个代码: 登录后复制 #include <iostream> int main(){ int*...

cnzzs的博客 356

检查代码内存泄露

检查代码可能存在内存泄露的地方,不同于vld,安装简单,内部有说明文档,按照说明文档操作即可

Shell脚本查看进程内存真实占用情况

主要介绍了Shell脚本查看进程内存真实占用情况,本文直接给出实现代码,需要的朋友可以参考下

实用小代码之内存泄漏检测

相信很多人在用C语 言编写程序时,常常会用到动态内存分配的函数。而使用这样的函数,往往会一不留神就造成内存泄漏。虽然说世面上有很难多检查内存泄漏的工具,功能也很强 大。不过我平时用的简单检测方式是使用我这里介绍的这三个函数。相对来说,还是比较不错的,也是一种解决内存泄漏问题的方法之一吧。int *_mem_check(void)...{  static int c=0;  return(&

phphot 1963

详解Java内存泄露的示例代码

通过一个Demo来简要介绍下ThreadLocal和ClassLoader导致内存泄露最终OutOfMemory的场景。下面通过示例代码给大家分享Java内存泄露的相关知识,感兴趣的朋友一起看看吧

C/C++ 内存泄漏检测

C/C++ 内存泄漏检测

weixin_61021362的博客 9090

【Ultrascale+ MPSOC学习记录】6、从eMMC启动翻车

因为MPSOC还有一种启动模式是eMMC,接下来咱就实现从eMMC启动。

ryo891012的博客 474

CANoe.Diva实战:基于CDD的UDS诊断自动化测试全流程解析

本文详细解析了使用CANoe.Diva进行基于CDD的UDS诊断自动化测试的全流程,包括环境搭建、CDD文件配置、测试范围设置、用例生成与验证、CANoe集成测试及报告分析。通过实战经验分享,帮助工程师快速掌握诊断自动化测试技巧,提升测试效率与质量。

weixin_29258297的博客 218

预防和检测内存泄漏:实用技巧

内存泄漏(Memory leak)是指程序在运行过程中分配的内存资源没有被正确释放,导致这部分内存无法再被程序使用,最终消耗了系统的可用内存。

fumeidonga的博客 1007

逆向分析TikTok的Cronet网络库:定位libsscronet.so并Hook关键SSL函数

本文深入探讨了逆向分析TikTok的Cronet网络库的技术细节,重点介绍了如何定位libsscronet.so并Hook关键SSL函数。通过Java到Native的调用链路追踪、So库定位策略和SSL验证函数的动态Hook技巧,帮助开发者突破定制化网络库的协议加密防护,实现流量解密和协议分析。

weixin_27875131的博客 969

使用 Valgrind 检测内存泄漏

Valgrind 是一个编程工具,用于内存调试、内存泄漏检测以及性能分析。Valgrind 工具集中的 Memcheck 是用于检测内存管理和线程错误的主要工具。

阿乐的博客 2481

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8333

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

valgrind检测内存泄漏教程

如果命令输出 Valgrind 的版本信息,说明已经成功安装了 Valgrind。如果命令无法识别 valgrind 命令,那么就说明还没有安装 Valgrind 或者环境变量配置不正确。

MrWangHao的博客 7066

量化投资进阶:Fama-French三因子模型实战解析与Python实现

本文深入解析了Fama-French三因子模型,并提供了完整的Python实战指南。文章阐述了该模型如何通过引入市值因子(SMB)和价值因子(HML),对传统CAPM模型进行重要扩展,以更精准地解释股票收益来源。详细演示了使用Python获取数据、执行回归分析并解读结果(包括关键的阿尔法α)的全过程,并探讨了该模型在量化策略构建、风格诊断和业绩归因中的核心应用。

yog99的博客 1126
上一篇: 《荒漠甘泉》4月17日
下一篇: 《荒漠甘泉》4月18日
VisionCat
博客等级 码龄24年 459粉丝 83原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值