C/C++内存泄漏检查之经验

C/C++内存泄漏与检测 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一... 阅读详情

C程序中最可怕的事情就是碰到内存泄漏或者内存错误,特别是对于大型的项目而言要去查一个小小的内存泄漏可要花不少功夫的。目前已经有很多这方面的工具,比较著名的如Rational Purify,不过Purify对Linux的支持比较少,而且有一种泄漏是由于运行过程中不断增长但是在程序结束的时候释放的泄漏这些工具有时也无能为力,另外一条路是通过重载new,delete,malloc等来达到内存监控的目的,这些方法比较简单灵活,而且仅用来检查自己的代码部分的错误,因此显得比较有效,不过也存在着自身的一些局限性,下面逐一介绍:

1、MFC's 重载操作符
这种方法的核心语句是:
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__,__LINE)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW
但是这种方法使用了new操作符的replacement 操作,因此就要求程序中不能使用replacement操作。但是STL中广泛的使用了new操作符的replacement方法。

2、宏替换技巧篇
int __declspec( thread ) THIS_LINE;
char __declspec( thread ) THIS_FILE[1024];
#define delete (THIS_LINE=__LINE__,strcpy(THIS_FILE, __FILE__),0)? 0 : delete
#define new (THIS_LINE=__LINE__,strcpy(THIS_FILE, __FILE__),0)? 0 : new
这种方法的缺点是THIS_FILE和THIS_LINE必须使用线程局部变量,而且最郁闷的事情是它不能够覆盖直接调用operator new的场合。而且该方法不能使用于GCC编译器

3、Hook Alloc
一般的程序内存分配都是通过CRT调用的,而且LINUX的和WINDOW的CRT实现都支持malloc hook.对于Windows程序是:_CrtSetAllocHook具体用法可以参考MSDN。而且Windows下面的这个HOOK无法获得发分配的内存地址,但是每次都有一个requestID,而且这个HOOK是同时支持alloc,malloc,realloc,delete的,删除的时候和分配的时候使用的是同一个requestID。当发现有内存泄漏的时候还需要通过alloc的时候保存的THREAD context才能够通过使用dbghelp.dll来dump出当时的代码位置。不过这个方法最大的好处是不但但连malloc,new而且你的程序就算调用了别的模块的open函数,里面调用了malloc,而你没有使用close这样的内存泄漏也能检查出来,的确非常好用。不过这种方法的致命的缺陷是对于静态对象无能为力,因为既然是hook总是需要在一个时间调用,如果在此之前就已经分配的内存是无法检测出来了。
Linux下面的hook函数是:__malloc_hook等5个函数,另外linux下面需要使用gdb去dunp出代码行,这个和windows下面不一样。windows下面的实现参考StackWalker这个工具,做得非常不错。而Linux下面则是gcc自带的mtrace,用法如下:
如果你更想读生(raw)的原始文档, 请参考glibc info的"Allocation Debugging"一章 (执行info libc); otherwise, you are with me.
glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数分配内存(如malloc, alloc...):
1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息.在需要内存泄漏检查的代码的结束调用void muntrace(void).
注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行.
2. 用debug模式编译被检查代码(-g或-ggdb)
3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息.
4. 运行被检查程序, 直至结束或muntrace被调用.
5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE)
 (mtrace foo $MALLOC_TRACE, where foo is the executible name) 如果有内存泄漏, mtrace会输出分配泄漏内存的代码位置,以及分配数量.

可惜的是目前的mtrace只能解析GCC编译出来的行数,如果是G++编译出来的它就不行了……

如何检测C/C++中的内存泄漏? WinDBG 是 Windows 应用程序的调试器,可以读取存储在调试堆中的附加信息。对于 64 位进程来说,它是 8 TB,但实际上内存受到硬件的限制,因此,它要少得多。虽然 C++ 运行时库仅捕获特定源文件中 C++ 函数造成的泄漏,但 Deleaker 在进程级别工作,存储所有分配。乍一看,一个小的忘记分配并不是一个大问题,但进行一百万次后,它很快就会成为一个严重的错误。另一个工具是 WinDBG,它是一个可以读取调试堆的多用途调试器。不幸的是,它的功能有限,而且WinDBG 的UI 并不方便。 阅读详情

相关推荐

《Vscode配置C/C++环境必备插件:这5款插件让开发如虎添翼》

还在为C/C++开发中的代码规范、内存泄漏和性能瓶颈抓狂?本文揭秘5款让Vscode化身全流程开发利器的神级插件!从一键格式化代码到智能静态分析,从内存泄漏检测到可视化性能剖析,手把手教你搭建专业级开发环境,让调试信息直观呈现,代码质量尽在掌握!

Start_mswin的博客 1252

C语言中检测内存泄露的代码

忘了从哪看到的了,但是感觉很好用,所以放在这里仅作记录。 //===================================================== #include #ifdef _DEBUG #define new    new(_NORMAL_BLOCK,__FILE__, __LINE__) #endif inline void EnableMemL

why_ny的专栏 1437

【C/C++工具】C++代码检查工具

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对CPP代码检查工具做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1086

C代码的内存区域

一直以来, 从未深入理解内存中的代码段, 数据段, BSS段, 堆栈 …, 现在项目需要, 编译的代码大了一点点, flash/ram 不够, 需要优化代码, 因此需要先了解哪些是占 Flash空间, 哪些是占 Ram 空间之后. 才能对应进行优化, 东翻西找了一大堆资料后, 总算是整明白了, 整理成笔记, 方便自己也方便别人, 何乐而不为呢. 1. 名词-五大段 1.1. BSS段 BSS:(B...

LikeShadow 675

豆包大模型API调用两种方法

ps: 因为是自用,所以这里图方便采用硬编码密钥的形式;如果有需求/安全风险,建议参考官方教程设置ARK_API_KEY环境变量的方式。坏处是:看别人的教程走了一大圈弯路hh;基础调用的话方法一就可以满足了,也比较方便快捷,容易上手。将 <Model> 替换为 Endpoint ID即可。创建就按照提示填写信息就行,需要实名认证,有免费额度。绿框框里就是Endpoint ID。

kkkkkkkkkasey的博客 1万+

Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。

weixin_45719141的博客 1万+

C/C++查找内存泄露的方法

快速有效的查找内存泄露!

weixin_44960499的博客 4059

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6565

Window Hook 技术详解

Hook简介 微软的MSDN中,对Hook的解释为: A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain

cx1990820的专栏 8691

bartender 10.1破解版|bartender条码打印10.1

点击下载出处:BarTender10.1破解版 bartender10.1破解版是一款专业的条码打印软件,在行业内广受好评,通过使用bartender我们可以将标签设计这个复杂的过程变得更简便,在设计中快速调整,即刻打印,非常迅速,BarTender10.1破解版不仅支持的标签类型包括EPC Class 1 、Gen2 、ISO 18000-6b 、ISO 15693 、Tag-It 、I-CO...

weixin_44924147的博客 6万+

DCN交换机通过boot模式升级

LIC导入成功后,输入enable进入特权模式,把网线接到通讯网口上,配置好对应interface vlan地址,在enable模式用 copy tftp://x.x.x.x/xxxxxx_nos.img nos.img待提示write ok时,reload设备完成升级。交换机启动后,在显示以下信息时输入“Ctrl+B”,一定得是手动按“Ctrl+B”进入的boot模式才能正常升级。升级交换机成功,在BootROM模式下,执行命令run或reboot,回到CLI配置界面。# 交换机通过boot模式升级。

m0_72501865的博客 947

PC-Lint 经验(中文)

PC-Lint 经验(中文) 【下载地址】PC-Lint经验中文 PC-Lint 是一款专注于C/C++代码静态检查的强大工具,能够有效发现数组越界、内存泄漏、未初始化变量等潜在问题。本文基于PC-Lint用户手册,结合个人经验,详细介绍了其安装、配置及与常用开发工具的集成方法。通过掌握PC-Lint的强类型检查、变量跟...

gitblog_06716的博客 630

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 365

securecrt遇到一个致命的错误且必须关闭_谈谈如何利用 valgrind 排查内存错误

导读Valgrind 最为开发者熟知和广泛使用的工具莫过于 Memcheck,它是检查 c/c++ 程序内存错误的神器,报告结果非常之精准。本文主要分享作者在使用该神器解决内存问题的过程中积累的一些实战经验,希望帮助你快速定位问题甚至在编码阶段就规避这些问题。Memcheck 可以检查哪些内存错误?Memcheck 可以检查 c/c++ 程序中常见的以下问题:内存泄漏,包括进程运行过程中的泄漏和进...

weixin_39840606的博客 626

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 243

Clang静态分析拯救百万级代码:内存泄漏检测的5个关键步骤

掌握C语言内存泄漏的Clang静态检测,5步精准定位并修复问题。适用于大型C项目,结合静态分析工具深入解析资源管理漏洞,提升代码稳定性与性能。方法实用高效,值得收藏。

VarPerch的博客 951

怀旧版电脑GBC模拟器

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

securecrt遇到一个致命的错误且必须关闭_高性能服务器之路 | 浅谈 Valgrind 内存错误检查神器 Memcheck...

本文是 高性能服务器开发 第一篇导读Memcheck 可以检查哪些内存错误?使用 Memcheck 解决问题的原则原则 1,内存非法读写错误一定要解决原则 2,变量未初始化错误一定要解决原则 3,开启 -show-reachable=yes 命令行选项原则 4,周密思考!保证 Memcheck 测试到程序的每一个逻辑分支Memcheck 四种指针丢失情形的代码演示definitely l...

weixin_39891694的博客 663

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C/C++内存问题检查利器—Purify (一)

C/C++内存问题检查利器——Purify 陈皓一、           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA—Quality Assessment)占了整个软件工程的30% -50%,但有这么一种说法,即使是最优秀测试专家设计出来的测试案例,也无法彻底地检测到内存上的问题。     使用C/C++开发的团队一定有被其内存问题折磨过的

陈皓专栏 【空谷幽兰,心如皓月】 4万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

转载:在Linux平台中调试C/C++内存泄漏方法

<br />以下转自IBM<br /> <br /> 韩兆兵 (hanzb@cn.ibm.com), 软件工程师, IBM<br /> <br />刘盈 (cdlliuy@cn.ibm.com), 软件工程师, IBM<br /> <br />强晟 (qiangsh@cn.ibm.com), 软件工程师, IBM               2008 年 5 月 15 日<br /> <br /> <br /> <br />由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导

alexmahone_xie的专栏 1251

C++中内存泄漏,内存溢出区别及检查方法

c/c++中内存泄露和内存溢出的区别 内存泄漏的几种情况: 1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存 2.没有正确地清除嵌套的对象指针 3.在释放对象数组时在delete中没有使用方括号 方括号是告诉编译器这个指针指向的是一个对象数组,同时也告诉编译器正确的对象地址值并...

顺其自然~专栏 4899

【转】C/C++内存泄漏及检测

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34212762的博客 124

C/C++代码常规检查

一个不会写C/C++代码的黑客不是好黑客,那么如何提高自己的代码水平呢?我觉得是不停的写代码,不停的去犯错误,在错误中快速成长,然后3年之内,你就一览众山小了,因为加班状态下3年就是10000小时的专家定律,哈哈。C/C++ Coding检查必须要做的2项:一个是cppcheck静态检查,一个是valgrind动态检查。C/C++代码静态检查Ubuntu下安装:apt-get install cp...

ailx10 427

C++内存泄漏排查

linux c++内存泄漏排查方案汇总 参考:https://www.cnblogs.com/kex1n/p/11572313.html 使用mtrace分析内存泄漏 参考:https://zhuanlan.zhihu.com/p/83547768

lv_zj的专栏 6602
上一篇: VC ListCtrl中嵌入进度条
下一篇: Grub4dos启动linux
oeichenwei
博客等级 码龄23年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值