C++Builder 内存泄漏检查工具_第1页
C++Builder 内存泄漏检查工具_第2页
C++Builder 内存泄漏检查工具_第3页
C++Builder 内存泄漏检查工具_第4页
C++Builder 内存泄漏检查工具_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+Builder内存泄漏检查工具-CodeGuard一、为什么写这篇东西自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏、资源是 否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工 具CodeGuard ,非常不错,使用也挺方便的,但是摸索了很久(以及翻查了一些资料,包括HELP)才算是会用了。写这篇文章的目的希望有这方面的问 题的朋友可以借鉴一下,大家互相学习,共同进步。我的联系方法:Email: szbugszbug com,希望志同道合的朋友来信互相交流。以下这篇文章算 是拼凑出来的一篇文章,一些资料是在书上找的,一些是在HELP上看到了。二、什么是 CodeGua

2、rdCodeGuard是在是C+Builder5才出现的一个工具。CodeGuard是 C+ + Builder中一个程序在运行时期的检查器,用于检查内存或者资源的使用, 以及函数调用的验证。CodeGuard可以检测到以下的程序运行期错误:l非法的内存释放。l无效的句柄或者文件流。l非法指针。l使用已被释放的指针。l内存泄漏。l分配但最后没有释放的内存变量。l传递给函数的不正确的参数(包括VCL以及Win32函数)。l函数返回值的错误。(包括VCL以及Win32函数)。例如:在应用程序中试图多次释放相同的资源(或者已经释放了的资源)、 试图访问已经被释放的内存。三、 在BCB5中怎样使用Co

3、deGuard 配置CodeGuard如果要使用CodeGuard的话,必须有些代码编译进你的应用程序,所以在 改变以下这些设置后。必须全部重新编译(切记切记! !)。第一、打开应用 程序的工程选项的CodeGuard页框,把CodeGuard Validation前面打勾 工 程选项里,还有其他三个选项。第一个选项允许CodeGuard检查指向局部、全 局和静态变量的无效指针和数据溢出。第二个选项允许CodeGuard检测对非法 的(无效的、已删除的)对象的方法的调用。第三个选项允许CodeGuard验证 内嵌指针的访问(在某些资料上说,开启这个选项会造成程序执行速度变得很慢, 我测试过了,

4、如果工程不是很大的话不是很明显,可以接受。)一般的调试是开 打所有的选项(默认选择也是全部打开)。通过CodeGuard的配置工具,可以配置CodeGuard的一些选项,在命令 行方式执行CGCONFIG.EXE。可以见到一个对话框Preferences标签页用于设置CodeGuard这个工具的全局选项。Enable选 项可以在应用程序不重新编译的情况下使用或者不使用CodeGuard,一般来说 是都是启用她。如果使用CodeGuard的话,建议设置工程选项来禁止或者使用 CodeGuardo Stack fill frequency填充栈频率是检测对运行期栈的无效访问。 Report和Err

5、or Message Box选项是设置CodeGuard报告错误的方式。在 Report里,Statistics选项打开CodeGuard输出分配和释放内存的统计表、 被使用的Win32API的调用、资源的使用情况,并在日志文件中加上一个模块 列表,以便检查错误。Resource Leaks选项是告诉CodeGuard在应用程序 结束后报告资源泄漏的情况。选定了 Error Message Box选项后,当应用程序 不在IDE里运行时,如果CodeGuard检测到错误信息,那么将采用一个对话 框的方式告诉使用者。其他选项一般不常用,可以参见C+Builder的联机 HELP。CodeGuard

6、 配置工具中的 Resource Options 和 Function Options 页框允许用户对应用程序的资源、文件和函数调用设置各种跟踪选项。除非特殊 的原因需要改变默认的配置,否则使用缺省的设定就行了。Function Options 页上有一个比较常用的选项就是记录一个特定函数的每次调用情况。Ignored Modules页框允许你告诉CodeGuard,当检测的时候可以忽 略一些运行期的错误(一般是指某些DLL或者包)。这个选项一般不常用。四、使用 CodeGuard使用CodeGuard其实很简单,只要像之前那样配置了 CodeGuard,然后 运行你的应用程序,无论你的应用程

7、序是否在IDE中运行,CodeGuard都将 会按照CodeGuard配置的选项监视你的应用程序。同时,他还会向一个日志文 件里输出所有的信息(文件存放在你的工程所在目录中,文件名和工程名一样, 扩展名为.cgl)。例如你的工程名为C:WordTest.prg,那么CodeGuard的日 志文件为C:WordTest.cgl,它是一个文本文件,可以用任何的文本编辑器来编 辑它。在 IDE 中,可以通过Debug Window-CodeGuard Log 来查看CodeGuard的日志文件(或者用快捷键Ctrl+Atl+O)。如果你的程序在运行是出现属于CodeGuard监视的错误的时候,Cod

8、eGuard会把它输出到CodeGuard Log中。并将错误信息用一颗树”的方 式显示(使用很方便,就像使用Windows的资源管理器一样简单)。每个错误 都可以展开,以显示某种错误类型所特有的一些信息。例如:一个资源那个地方 使用了、分配以及释放;发生错误时的栈信息;并且指出了出错的代码行。这样 就可以很快的找到错误的根源!CodeGuard Log窗口上有两个按钮Stop和Clear。当Stop选中的时候, 如果这个时候程序遇到了错误,CodeGuard将停止应用程序。如果未选中,那 么程序就算遇到了错误也会继续,这样可以运行一次记录很多错误信息。当 Clear选中的时候,应用程序每次重

9、新运行将清空日志中的信息。在CodeGuard Log窗口中,双击单个错误的节点的时候,如果存在源代码 的话,IDE窗口会自动跳到那一行代码上。如果不存在源代码的话,则显示CPU 窗口。图三中,出现的错误是资源泄漏。当你的鼠标双击Tform1: Button1 Click 这一行的时候,会自动跳到源代码中出现错误的那一行。当CodeGuard检测到一个错误的时候,并找到出现问题的源代码时,剩下 的工作就是如果改正你的代码。这个过程可以配合监视和数据断点来实现,效果 更加好!五、CodeGuard中的错误以及原因CodeGuard可以检测到很多运行期的错误!通常很容易就可以从 CodeGuard

10、的含义找出错误的根源。对于大多数的错误,CodeGuard 一般会 显示的包括:发生错误的地方、资源分配、资源释放、资源被分配以及被访问字 节数。Access In Freed Memory如果内存被释放了,在后面还继续访问,就会发生这个错误。在C/C+ +中,通 常使用new或者malloc分配内存,用delete和free释放。以下是一个访问 了被释放的内存的例子:void foo() TMyClass * MyClass = new TMyClass(); delete MyClass;MyClass-xxxx = 10;/MyClass 已经被释放了CodeGuard会报告已被释放的内

11、存在何处被访问,内存原来被分配的地方以及 内存在哪里被释放的。Method Called On Freed Object这个错误跟前一个错误类似。起因是由于调用了已被释放的对象的方法而不是访 问已被释放的内存!void foo() TMyClass * MyClass = new TMyClass(); delete MyClass;MyClass-xxxx (10);CodeGuard将显示在何处调用了已释放对象的方法,对象被创建的地方以及对 象被释放的地方。Refere nee To Freed Resource在程序中试图多次(两次以上)释放同一个资源,CodeGuard将检测到这个错

12、误,有好几种方法都会产生这个错误!例如:void foo() TMyClass * MyClass = new TMyClass(); delete MyClass; delete MyClass;CodeGuard将报告资源在何处第二次被释放,从而引起这个错误的。还会报告 资源在何处分配,在何处首次释放。Method Called On Illegally Casted Object如果在程序中对有效的内存范围之外的方法的调用将会引起这个错误。void foo()TMyClass * MyClass = new TMyClass5;MyClass5.xxxx(); /No such MyCl

13、ass5delete MyClass;CodeGuard将报告对象调用的方法定义的地方,以及这个方法被调用的地 方以及对象或者内存被分配地方。Resource Type Mismatch如果在程序中释放资源和定义(分配)时候不一致,会出现这个错误。 void foo()TMyClass * MyClass = new TMyClass2; delete MyClass;Code1TMyClass * MyClass = new TMyClass();delete MyClass;Code2在 Code1 以及 Code2 都会引发 Resource Type Mismatch 错误,CodeG

14、uard 将会报告资源在何处以不一致的方式被释放,以及资源是在哪里被分配的地方。Access Overr un当访问非法内存区域的内存时会造成这个错误(所访问的内存在合法内存区域之 后),通常情况下是数组下标引用超出原来定义的。void foo() TMyClass * MyClass = new TMyClass2;MyClass2.abc = 10; /No such MyClass2 delete MyClass;char *ch = new char5;strcpy(ch, “123456”);/Error delete ch; CodeGuard报告出错的地方,资源在哪里分配的。Ac

15、cess Un derr un当访问非法内存区域的内存时会造成这个错误(所访问的内存在合法内存区域之 前)。void foo() TMyClass * MyClass = new TMyClass2;MyClass-1.abc = 10; /No such MyClass2 delete MyClass;CodeGuard报告出错的地方,资源在哪里分配的。Unin itialized Stack Access ing访问栈中为被初始化的区域将会造成这个错误。 void foo1(int *Ptr)int Var;* Ptr = &Var;void foo()int * Ptr;foo1(&Pt

16、r);*Ptr = 100;CodeGuard将会报告何处访问还没有被初始化的栈。Access In In valid Stack当在程序中尝试访问栈底部的内存的时候出现这个错误!void foo()char str20;strcpy(&str-1, “szbug”);CodeGuard报告发生错误的地方。Bad Parameter这个错误通常是出现无效的文件或者其他资源句柄作为参数传递给VCL或者Win32API函数时发生的。Void foo()FILE * Stream; fclose(Stream);CodeGuard将报告使用了不正确参数的函数在何处被调用。Function Failu

17、re这个错误是CodeGuard在捕获VCL以及Win32API函数的返回值如果出现错 误时引发的。viod foo()CopyFile(“c:abcabc.txt”,“d:abcacb.txt”,true);如果这个函数由于某种原因失败了,那么CodeGuard将会捕获并报告Function Failure错误!Resource Leak如果在程序中资源(包括Winwos资源,内存资源等等),分配了,在程序的 最后没有释放!将引发Resource Leak错误。Void foo()char *ch = new char10;CodeGuard将报告资源创建的地方,以及所泄漏的字节数。六 运行

18、后会生产同名的CGL文件,里面包括函数的调用次数和使用到的DLL. 如果有泄露的话,会指出在来!Fun cti ons called: delete (35 times) SysReallocMem (26 times) SysFreeMem (464 times) SysGetMem (472 times) realloc (1 times) memcpy (1 times) delete (2 times) free (26 times) new (14 times) new (40 times) calloc (5 times) malloc (20 times)Resource types used:object array (14

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论