51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 14259|回复: 26
打印 上一主题 下一主题

[讨论] 内存泄漏如何测试?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-6-23 16:09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
面临一个问题,一直没有搞清楚:

如何测试内存泄漏?
1.怎么知道程序中是否存在内存泄漏?
2.如何定位内存泄漏?内存泄漏出现在哪儿?是那个函数或哪几个函数引起的呢?
3.如何预防内存泄漏?

欢迎大家参与讨论,共同学习!
谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-6-23 17:25:40 | 只看该作者
各位没有遇到这个问题么?
自己先顶一下!
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2006-6-23 17:54:09 | 只看该作者
如果是用VC++写的程序,在DEBUG模式下关闭程序就可以看到有没有内存泄漏;如果是用别的工具写的也是有专门的内存测试泄漏工具的
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-6-23 22:01:41 | 只看该作者
内存泄露我也不是很了解,上课时听老师讲过,我来试着回答一下:
内存泄漏是指程序在运行过程中申请的内存,在程序结束时没有被释放。如申请的指针没有释放,或其他需要占用系统内存的变量。内存泄漏可通过代码走读来发现和定位,也可以用专用的工具来测试和定位,工具有rational公司的purify等。预防内存泄漏的唯一方法就是要求程序员在程序结束时,必须将每个申请的内存都释放。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2006-6-24 00:46:37 | 只看该作者
在.net平台下,代码托管,这方面的问题少的多了.
针对C++,BoundsChecker采用一种被称为 Code Injection的技术,来截获对分配内存和释放内存的函数的调用。简单地说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进程的地址空间(这可以通过system-level的Hook实现),然后它会修改进程中对内存分配和释放的函数调用,让这些调用首先转入它的代码,然后再执行原来的代码。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2006-6-24 08:37:32 | 只看该作者
只说大概了解的吧
Win32编程中常见内存错误:内存分配错误,使用未初始化的内存,内存泄露,使用已经释放的资源
lz所说内存泄露需要坚持一条原则:确保没有返回的但已经分配的缓冲区不再使用时被释放.特别是当有一些分支有公共的释放代码时,需要确保所有适当的内存都被释放了
广义的说,内存泄露不仅包含堆内存泄露,还包含系统资源的泄露,比如核心态HANDLE,GDI Object,SOCKET,INterface等
比如说你建立了逻辑画笔,逻辑画刷,这个大刷子用完了必须从hdc删除,要不会留下无效句柄
检查,反正我用BoundsChecker
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2006-6-25 15:14:55 | 只看该作者
谢谢各位的回复与讨论!

1.使用工具测试可以知道程序中是否存在内存泄漏。如BoundsChecker。
2.还是使用工具,要么白盒测试,检查源代码。
3.坚持一条原则:确保没有返回的但已经分配的缓冲区不再使用时被释放.特别是当有一些分支有公共的释放代码时,需要确保所有适当的内存都被释放了

楼上讲的非常好哟,学到不少!

可是,我测试的是嵌入式系统,又没有测试工具,该如何解决这种问题呢?
期待大家继续讨论!
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2006-6-26 09:53:32 | 只看该作者
你如果没有工具,那只好检查代码了。
Purify确实是个不错的工具。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2006-6-26 14:05:19 | 只看该作者
唉,上次被人问到这个问题,不知怎么回答
我们公司小,都没有测试工具的,Purify,Load,Win 等都没有接触过

呵呵,继续学习!
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2006-6-28 13:35:34 | 只看该作者
哦?帖子沉了?
各位没有补充么?
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2006-6-29 15:17:52 | 只看该作者
我们现在是java的程序,通过使用Jprobe的Memory Debuger进行内存的测试,感觉还是挺有效果的
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2006-6-29 16:06:40 | 只看该作者
那不用工具也不要看代码,就从内存的使用情况能否来确定有内存泄露现象?
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2006-6-29 17:25:00 | 只看该作者
用jprobe看一下吧
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2006-6-29 18:00:59 | 只看该作者
偶是测试的,每次都是从Task Manager里观察,有无Memory leak.
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2006-6-29 18:01:50 | 只看该作者
task manager有时候会误报。
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2006-6-30 09:38:02 | 只看该作者
4楼的兄弟说的已经很明白了,使用工具,如果贵公司使用的记事本来编程,那么你只能用眼睛去看程序了,如果是使用开发工具来开发的C++和程序或是VC++的程序,那么你就可以使用NUMEGA来进行内在泄漏的测试(其中包括BoundsChecker)这个网上有很多下载的,使用也很简单,在2000年左右的时候比较胜行,但后来随着开发平台的不断转移,接触的比较少了,不过做硬件或是底层开发用到C的时候,还是大有用场 。
回复 支持 反对

使用道具 举报

该用户从未签到

17#
 楼主| 发表于 2006-7-20 17:17:20 | 只看该作者
楼上的兄弟可否 讲的具体一点,小弟很有兴趣哦,还没有找到下载该工具的地方啊
我是做 SOC 的软件测试,与硬件联系紧密,希望对此有更多了解!
谢谢。

[ 本帖最后由 Chenny 于 2006-7-20 17:24 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2006-7-20 17:18:13 | 只看该作者
这里怎么不能贴 附件啊
本来想 贴一些从网上搜到的相关文档与大家共享的。
回复 支持 反对

使用道具 举报

该用户从未签到

19#
 楼主| 发表于 2006-7-20 17:22:42 | 只看该作者
From Baidu:
在测试工作中,需要接触到各种类型的测试工具。一般来说,有以下一些类型的工具:
测试管理工具:可以帮助完成测试计划、跟踪测试运行结果等的工具。这类工具还包括有助于需求、设计、编码测试及缺陷跟踪的工具;
静态分析工具:分析代码而不执行代码。这种工具检测某些缺陷比用其它方法更有效,开销也更小。这种工具一般可以度量代码的各种指标,如McCabe测定复杂度,Logiscope度量代码和规范的复合度等等;
覆盖率工具:这种工具评估通过一系列测试后,软件被执行的程度。这种工具大量的被应用于单元测试中,如PureCoverage、TrueCoverage、Logiscope等;
动态分析工具:这种工具评估正在运行的系统。例如,检查系统运行过程中的内存使用情况,是否有内存越界、内存泄露等等,这类工具有Purify、BoundChecker等;
测试执行工具:这类工具可使测试能够自动化进行,并且各个层次(单元测试、集成测试、系统测试)的执行工具都有。例如系统测试阶段有功能测试自动化工具,如Robot、Winrunner、SilkTest等;还有性能测试工具,如Loadrunner、SilKPerformer等。

白盒测试工具主要有:
内存资源泄漏检查:Numega中的bouncechecker,Rational的Purify
代码覆盖率检查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope, Macabe公司的Macabe
代码性能检查:Numega中的truetime,Rational的Quantify
代码静态度量分析质量检查工具:logiscope和Macabe

黑盒测试工具主要有:
客户端功能测试:MI公司的winrunner,compuware的qarun,Rational的robot
服务器端压力性能测试: MI公司的winload,compuware的qaload,Rational的SQA load等等
Web测试工具:MI公司的Astra系列,rsw公司的e-test suite
测试管理工具:rational的test manager,compuware的qadirector等
缺陷跟踪工具:trackrecord,Testtrack

单元测试工具:
测试框架: delphi dunit
java junit
c++ cppunit
Visual Basic VBUnit
(.NET platform) NUnit
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2006-7-20 18:06:46 | 只看该作者
如果是在实在是找不到工具,而代码也不太明白的话,在测试时间允许的情况吓干脆写个循环,运行个几万次,几十万次。如果正常运行估计就没有问题了。这是没有办法中的最傻的,最笨的办法了。

如果开发的时候用JAVA,或.NET开发软件的话可能这问题就比较少了,我记得它们都有所谓的内存回收机制,好像是自动把以前申请过的内存空间而现在没有用到的给释放掉。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-24 20:46 , Processed in 0.089388 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表