内存泄漏的疑惑(100分)

lovechen508 2006-09-04 09:09:20
现在遇到一个比较奇怪的问题。

产品在debug和release下表现出不同的内存泄漏状况。

在debug下面,内存缓慢增长。但是release下,内存泄漏则快得多。由于时间比较短,不可能全面阅读代码,所以感觉没有什么头绪。

unix环境,会不会和编译选项有关?

另外有purify工具,别人也没能跑出什么明显的bug出来。

各位有什么好的思路和建议。谢谢!
...全文
637 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
benjiam 2006-09-05
  • 打赏
  • 举报
回复
purify 在那里有下载?
tiantang3gm 2006-09-05
  • 打赏
  • 举报
回复
我模糊记得purify检测内存泄露的原理:
如果发生了内存分配操作,那么purify会标记该操作,如果发现内存释放就删除该标记,如果到进程结束仍然没有内存分配标记没有删除,那么就判定该标记所在地方内存泄露。

建议察看指向指针的指针的释放问题。比如list中一个node一个node释放,最后释放header
一点建议吧,祝你好运。

我曾努力和内存泄露斗争过
ps.不要把太依赖于测试,写好一个模块测试一个模块。软件设计方法的确很烦人,但是效果很好。
elson_hao 2006-09-05
  • 打赏
  • 举报
回复
mark
无聊客 2006-09-05
  • 打赏
  • 举报
回复
统一楼上,一个一个模块放开,对于一些怀疑的模块,写死代码加大调用力度,加快重现频率
lovechen508 2006-09-05
  • 打赏
  • 举报
回复
感谢各位的关心。

to buptwaitme2002(大漠孤鹰):

的确在压力测试暴露了问题。现在是基本是1M/min的增长速度。

to jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!):

代码的质量基本是有保障的。没有一眼就能识别的明显泄漏问题。

另外,代码采用了较多的OO技术。且不可能单步调试。断点什么的都不能用。只能用log的方式。

to tiantang3gm() :

purify GUI上的水龙头工具究竟有什么用途?同事说是系统内存分配的snapshot。不准确,但我以前的一个类似的问题就是通过该工具找出来的。有purify的专家可以提供建议么,谢谢

to cnstar9988(小星星) :

Sorry, 公司使用的是正版purify. 我没有注册码。我们都是通过NFS使用该工具。

今天扫描了一下代码,缩小了范围。c++ 代码大概一万行左右。想结合testcase进一步研究。有什么进展和大家一起讨论。谢谢大家关注。

今天在阅读代码的时候有一些感受:

如果能够通过函数名称判断函数内部是否进行了内存分配就好了,就不用进去看了

返回指针的函数如果暴露了内部状态又不希望调用者改变的话,最好返回const.否则我必须通过指针返回的东西该不该释放。也要到该函数中检查。

项目中广泛用到了异常,指针的内存释放就比较痛苦。尽量使用RAII技术和异常安全技术(例如:auto_ptr)尤为重要。谁分配谁释放的责任必须清晰明了。

以上感受不一定正确,希望能讨论一下。


BenjaminHuang 2006-09-05
  • 打赏
  • 举报
回复
Purify都测不出来?感觉比较奇怪。
zmzbs123 2006-09-05
  • 打赏
  • 举报
回复
确实比较棘手,目前帮不上,jf
cnstar9988 2006-09-05
  • 打赏
  • 举报
回复
有purify for linux的注册码吗?
hziee_ 2006-09-05
  • 打赏
  • 举报
回复
purify 是什么冬冬,第一次听说。。。
xlzxlich 2006-09-05
  • 打赏
  • 举报
回复
把代码大段封掉,再慢慢放开,缩小范围.
OOPhaisky 2006-09-05
  • 打赏
  • 举报
回复
不要把设计当成细节去处理!!
现在怎么办?
......
mmosquito 2006-09-04
  • 打赏
  • 举报
回复
贴段代码给楼主,不过在unix下大半没法用。只能祝你好运了。

int g_debugsize = 10240;

int YourAllocHook(int nAllocType, void *pvData,
size_t nSize, int nBlockUse, long lRequest,
const unsigned char * szFileName, int nLine )
{
char *operation[] = { "", "allocating", "re-allocating", "freeing" };
char *blockType[] = { "Free", "Normal", "CRT", "Ignore", "Client" };

if ( nBlockUse == _CRT_BLOCK ) // Ignore internal C runtime library allocations
return( TRUE );

if (!( ( nAllocType > 0 ) && ( nAllocType < 4 ) ))
return true;
if (!( ( nBlockUse >= 0 ) && ( nBlockUse < 5 ) ))
return true;

if (nSize >= g_debugsize)
{
printf( "Memory in %s, line %d: %s a %d-byte '%s' block (#%ld)\n",
szFileName, nLine, operation[nAllocType], nSize,
blockType[nBlockUse], lRequest );
return( TRUE ); // Allow the memory operation to proceed
}
return TRUE;
}

_CrtSetAllocHook(YourAllocHook);
iambic 2006-09-04
  • 打赏
  • 举报
回复
唉,慢慢找吧,祝楼主好运。
czm1203 2006-09-04
  • 打赏
  • 举报
回复
一般没什么好办法。
如果没有什么辅助工具可以确定泄漏点的话,那就只能调试,一步一步的缩小范围。
重新仔细分析下逻辑上的问题了。
herman~~ 2006-09-04
  • 打赏
  • 举报
回复
关注

IT有个圈儿 2006-09-04
  • 打赏
  • 举报
回复
这个一般很棘手!
公司的已经找了2天了!
jixingzhong 2006-09-04
  • 打赏
  • 举报
回复
整个工程逻辑上是否存在缺陷 ?
buptwaitme2002 2006-09-04
  • 打赏
  • 举报
回复
可能设计中有缺陷,在压力测试时出了问题
tiantang3gm 2006-09-04
  • 打赏
  • 举报
回复
purify都没看到 有问题。
晕~~~

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧