Windows平台下针对C/C++项目的内存泄漏检测方法

标签: windows 平台 项目 | 发表时间:2013-10-26 08:55 | 作者:Heath
出处:http://www.cppblog.com/

     由于语言在自动内存管理上的欠缺,C/C++在内存管理上从来都是需要程序员小心处理的一个方面,当项目代码上了一定规模,内存消耗和泄漏就会成为程序稳定运行的第一大敌。如果不在项目之初就建立内存管理和泄漏检测机制,后面蛋疼的问题就会接踵而来。这篇文章着重讨论内存泄漏检测,而内存管理与具体项目类型关系密切,后面有时间我会着重游戏项目来讨论。

     内存泄漏检测的基本步骤是:1)包装(重载)内存分配/释放API;2)进行内存分配时记下相关信息:地址、大小、调用栈;3)释放时清除之前记录的对应信息;4)程序退出时(确保在所有内存释放操作完成之后),输出剩下的记录。其中,对进行分配操作是的调用栈回溯是个重点信息,它能够帮助我们找出内存泄漏代码。

     Windows中的Dbghelp库提供了丰富的调试API。StackWalk应该是进行栈回溯最直接的一种接口了,但是它不够快。如果能先记录下调用栈上的CALL指令地址,然后在输出日志时解析出符号,将会大大降低检测机制对程序本身性能的影响。Dbghelp库中提供了Sym*FromAddr系列API,可以通过指令地址获取函数符号,那么剩下的就是如何记录指令地址的问题了。从网上借了一张x86调用栈示意图,如下:

Image(12)

     从图中可以看出,Callee的EBP始终指向Caller的EBP,EBP下面是指向Caller下一条指令(注意x86体系下栈的增长方向是小地址),因此通过EBP就可以回溯整个调用栈了。通过下面代码可以实现此功能:

Image(13)

     宏参数frame是个void*指针数组,数组的大小取决于想要回溯的栈深度。内存分配和回收的包装代码如下:

Image(14)

     我们看到,内存管理系统内部终究还是要使用语言提供的内存分配/释放API,只要配对实现了分配与释放管理,系统内部的无泄漏是很容易保证的。在这里着重讲解原理,就不重载new/delete operator了。最后看一下调用栈函数符号的回溯代码:

Image(15)

     我们用下面代码做测试用例:

Image(16)

     泄漏检测结果:

Image(17)

参考:

[1] Using DbgHelp

[2] Intel x86 Function-call Conventions - Assembly View

Heath 2013-10-26 08:55 发表评论

相关 [windows 平台 项目] 推荐:

Windows平台下针对C/C++项目的内存泄漏检测方法

- - C++博客-首页原创精华区
     由于语言在自动内存管理上的欠缺,C/C++在内存管理上从来都是需要程序员小心处理的一个方面,当项目代码上了一定规模,内存消耗和泄漏就会成为程序稳定运行的第一大敌. 如果不在项目之初就建立内存管理和泄漏检测机制,后面蛋疼的问题就会接踵而来. 这篇文章着重讨论内存泄漏检测,而内存管理与具体项目类型关系密切,后面有时间我会着重游戏项目来讨论.

【iSeed】ifanr 访谈:抢先布局 Windows Phone 平台 —— OpenXLive

- zeng - 爱范儿 · Beats of Bits
在 iOS 系统上大获成功的 OpenFeint 和 ScoreLoop ,是非常典型的第三方游戏平台. 它们给众多单机游戏插上了交互的翅膀. 那么在 Windows Phone 系统上有类似的平台吗. 当然有,国内的开发团队公布了 OpenXLive ,用它就能轻松添加积分榜、游戏成就、社交网络等功能.

跨平台沟通与 Windows Phone 7 的刺激点

- ChamPioNeer - 爱范儿 · Beats of Bits
有些事情貌似很没缘由,但仔细一分析却又耐人寻味. 比如为什么加拿大冰上曲棍球运动员一般出生在每年的前几个月. 可以看到,之前平稳增长的软件注册量,在 Kik for WP7 推出的那一刻仿佛被打了鸡血般有一个很大的涨幅. 这些增长量不仅仅是由 WP7 平台的客户带来,你要知道 Windows Phone(甚至包含 Windows Mobile )的美国市场占有率只有 2%.

不容忽视 Windows 8底层功能及开发平台

- Zhaojing - cnBeta.COM
Windows 8基于Windows 7,同时微软对其进行了性能、安全、隐私、系统可靠性等方面的改进. 在硬件需求方面,Windows 8与Windows 7完全一样. 之前也提到,除了x86和x64架构,Windows 8增加了ARM片上系统的支持.

Windows 8平台浏览器PK:IE10 vs Firefox vs Chrome

- 洞箫 - cnBeta.COM
Windows 8对HTML5标准的支持体现在很多方面,其中就包括对HTML5浏览器的支持,那么在Windows 8上究竟哪款HTML5浏览器的表现最好呢. 国外媒体日前就做了这样一个比对:IE10 vs Firefox vs Chrome,测试平台选取了惠普TouchSmart TM2笔记本.

你知道Windows 8平台预览版的死期吗?

- 洞箫 - cnBeta.COM
从Windows 8平台预览版(Build 8102 Milestone 3)于上周发布起,其死期也是已经注定的. 让我们重新描述一下:Windows 8平台预览版,生于2011年9月13日,卒于2012年3月12日. 也就是说,微软Windows 8的首个公开预览版拥有6个月的寿命,在此之前,你可以尽情享用这个免费的Windows 8.

Windows平台上编译OpenCV的Android版本

- Pei - C++博客-首页原创精华区
Android NDK(r5b或更高版本). 在opencv\android\scripts\目录下,新建wincfg.cmd文件. 关于wincfg.cmd文件的配置,可以参考opencv\android\scripts\wincmd.cfg.tmpl文件. 编译完成即可在opencv\android\build目录下得到所有的静态库文件.

NVIDIA Kal-El Windows 8 參考平台(又)動眼看

- SotongDJ - Engadget 中文版
雖然這未必是世界第一部運行 Windows 8 的 Kal-El 平板,但至少這會是第一部我們能夠接觸到,同時運行這顆矚目的 NVIDIA 4 核心處理器和 Windows 8 的裝置. 正如我們之前提到,NVIDIA 剛啟動了其 Windows 8 開發計劃,而這開發計劃的積極性也引起了我們的興趣.

5个Windows平台上的强大的文本编辑器

- vintone - 译言-电脑/网络/数码科技
5个Windows平台上的强大的文本编辑器. 【译者:ZturnLynn】.        我们在这儿介绍各种强大的软件,就是那些能让你们保持高效率的东西. 告诉我们任何你希望看到的关于Windows或是Mac OS X的内容. 或许你喜欢OS X,因为它的“简单”. 也许你偏爱Windows,因为你是个游戏发烧友.

Android、iOS & Windows Phone平台的15个设计要点

- - GamerBoom.com 游戏邦
1.在开发者的引导下理解手机框架. 手机应用顾问Jonathan Stark撰写了两本关于iPhone和Android开发的书籍. 在此他陈述如何判定最佳应用制作方式,并分享了若干优秀的开发工具. 2.如何基于“触屏”装置设计内容. 手指和拇指触控彻底改变了台式机的操作惯例. 互动设计师Josh Clark强调了在针对触屏装置设计内容时应该注意的重要问题.