2024年5月25日发(作者:)

C++Builder 内存泄漏检查工具-CodeGuard

一、为什么写这篇东西

自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏、资源是

否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工

具――CodeGuard,非常不错,使用也挺方便的,但是摸索了很久(以及翻查

了一些资料,包括HELP)才算是会用了。写这篇文章的目的希望有这方面的问

题的朋友可以借鉴一下,大家互相学习,共同进步。我的联系方法:Email:

szbug@,希望志同道合的朋友来信互相交流。以下这篇文章算

是拼凑出来的一篇文章,一些资料是在书上找的,一些是在HELP上看到了。

二、什么是CodeGuard

CodeGuard是在是C++Builder5才出现的一个工具。CodeGuard是

C++Builder中一个程序在运行时期的检查器,用于检查内存或者资源的使用,

以及函数调用的验证。

CodeGuard可以检测到以下的程序运行期错误:

l

非法的内存释放。

l

无效的句柄或者文件流。

l

非法指针。

l

使用已被释放的指针。

l

内存泄漏。

l

分配但最后没有释放的内存变量。

l

传递给函数的不正确的参数(包括VCL以及Win32函数)。

l

函数返回值的错误。(包括VCL以及Win32函数)。

例如:在应用程序中试图多次释放相同的资源(或者已经释放了的资源)、

试图访问已经被释放的内存。

三、在BCB5中怎样使用CodeGuard――配置CodeGuard

如果要使用CodeGuard的话,必须有些代码编译进你的应用程序,所以在

改变以下这些设置后。必须全部重新编译(切记切记!!!)。第一、打开应用

程序的工程选项的CodeGuard页框,把CodeGuard Validation前面打勾 工

程选项里,还有其他三个选项。第一个选项允许CodeGuard检查指向局部、全

局和静态变量的无效指针和数据溢出。第二个选项允许CodeGuard检测对非法

的(无效的、已删除的)对象的方法的调用。第三个选项允许CodeGuard验证

内嵌指针的访问(在某些资料上说,开启这个选项会造成程序执行速度变得很慢,

我测试过了,如果工程不是很大的话不是很明显,可以接受。)一般的调试是开

打所有的选项(默认选择也是全部打开)。

通过CodeGuard的配置工具,可以配置CodeGuard的一些选项,在命令

行方式执行。可以见到一个对话框

Preferences标签页用于设置CodeGuard这个工具的全局选项。Enable选

项可以在应用程序不重新编译的情况下使用或者不使用CodeGuard,一般来说

是都是启用她。如果使用CodeGuard的话,建议设置工程选项来禁止或者使用

CodeGuard。Stack fill frequency填充栈频率是检测对运行期栈的无效访问。

Report和Error Message Box选项是设置CodeGuard报告错误的方式。在

Report里,Stiatistics选项打开CodeGuard输出分配和释放内存的统计表、

被使用的Win32API的调用、资源的使用情况,并在日志文件中加上一个模块

列表,以便检查错误。Resource Leaks选项是告诉CodeGuard在应用程序

结束后报告资源泄漏的情况。选定了Error Message Box选项后,当应用程序

不在IDE里运行时,如果CodeGuard检测到错误信息,那么将采用一个对话

框的方式告诉使用者。其他选项一般不常用,可以参见C++Builder的联机

HELP。

CodeGuard配置工具中的Resource Options和Function Options

页框允许用户对应用程序的资源、文件和函数调用设置各种跟踪选项。除非特殊

的原因需要改变默认的配置,否则使用缺省的设定就行了。Function Options

页上有一个比较常用的选项就是记录一个特定函数的每次调用情况。

Ignored Modules页框允许你告诉CodeGuard,当检测的时候可以忽

略一些运行期的错误(一般是指某些DLL或者包)。这个选项一般不常用。

四、使用CodeGuard

使用CodeGuard其实很简单,只要像之前那样配置了CodeGuard,然后

运行你的应用程序,无论你的应用程序是否在IDE中运行,CodeGuard都将

会按照CodeGuard配置的选项监视你的应用程序。同时,他还会向一个日志文

件里输出所有的信息(文件存放在你的工程所在目录中,文件名和工程名一样,

扩展名为.cgl)。例如你的工程名为C:,那么CodeGuard的日

志文件为C:,它是一个文本文件,可以用任何的文本编辑器来编

辑它。

在IDE中,可以通过<菜单>View->Debug Window->CodeGuard Log

来查看CodeGuard的日志文件(或者用快捷键Ctrl+Atl+O)。

如果你的程序在运行是出现属于CodeGuard监视的错误的时候,

CodeGuard会把它输出到CodeGuard Log中。并将错误信息用一颗“树”的方

式显示(使用很方便,就像使用Windows的资源管理器一样简单)。每个错误

都可以展开,以显示某种错误类型所特有的一些信息。例如:一个资源那个地方

使用了、分配以及释放;发生错误时的栈信息;并且指出了出错的代码行。这样

就可以很快的找到错误的根源!

CodeGuard Log 窗口上有两个按钮Stop和Clear。当Stop选中的时候,

如果这个时候程序遇到了错误,CodeGuard将停止应用程序。如果未选中,那

么程序就算遇到了错误也会继续,这样可以运行一次记录很多错误信息。当

Clear选中的时候,应用程序每次重新运行将清空日志中的信息。

在CodeGuard Log窗口中,双击单个错误的节点的时候,如果存在源代码

的话,IDE窗口会自动跳到那一行代码上。如果不存在源代码的话,则显示CPU

窗口。图三中,出现的错误是资源泄漏。当你的鼠标双击Tform1:Button1Click

这一行的时候,会自动跳到源代码中出现错误的那一行。

当CodeGuard检测到一个错误的时候,并找到出现问题的源代码时,剩下

的工作就是如果改正你的代码。这个过程可以配合监视和数据断点来实现,效果

更加好!

五、CodeGuard中的错误以及原因