当前位置:天才代写 > tutorial > C语言/C++ 教程 > 如安在BCB中利用CodeGuard

如安在BCB中利用CodeGuard

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:739

副标题#e#

一、为什么写这篇对象

本身在利用BCB5写一些措施时需要查抄许多对象,譬喻内存泄漏、资源是否有释放等等,在利用了许多东西后,觉察BCB5自己自带的东西–CodeGuard,很是不错,利用也挺利便的,可是探索了好久(以及翻查了一些资料,包罗HELP)才算是会用了。写这篇文章的目标但愿有这方面的问题的伴侣可以警惕一下,各人相互进修,配合进步。我的接洽要领:Email:szbug@szbug.com,但愿志同道合的伴侣来信相互交换。以下这篇文章算是拼凑出来的一篇文章,一些资料是在书上找的,一些是在HELP上看到了。首先声明本人的语文及英语程度十分有限,有写错可能翻译错的处所,还望给位指出。出格感激XX的恋爱帮我校对……

二、什么是CodeGuard

CodeGuard是在是C++Builder5才呈现的一个东西。CodeGuard是C++Builder中一个措施在运行时期的查抄器,用于查抄内存可能资源的利用,以及函数挪用的验证。

CodeGuard可以检测到以下的措施运行期错误:

犯科的内存释放。

无效的句柄可能文件流。

犯科指针。

利用已被释放的指针。

内存泄漏。

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

通报给函数的不正确的参数(包罗VCL以及Win32函数)。

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

譬喻:在应用措施中试图多次释放沟通的资源(可能已经释放了的资源)、试图会见已经被释放的内存。

三、在BCB5中奈何利用CodeGuard–设置CodeGuard

假如要利用CodeGuard的话,必需有些代码编译进你的应用措施,所以在改变以下这些配置后。必需全部从头编译(切记切记!!!)。第一、打开应用措施的工程选项的CodeGuard页框,把CodeGuard Validation前面打勾.

工程选项里,尚有其他三个选项。第一个选项答允CodeGuard查抄指向局部、全局和静态变量的无效指针和数据溢出。第二个选项答允CodeGuard检测对犯科的(无效的、已删除的)工具的要领的挪用。第三个选项答允CodeGuard验证内嵌指针的会见(在某些资料上说,开启这个选项会造成措施执行速度变得很慢,我测试过了,假如工程不是很大的话不是很明明,可以接管。)一般的调试是开打所有的选项(默认选择也是全部打开)。

通过CodeGuard的设置东西,可以设置CodeGuard的一些选项,在呼吁行方法执行CGCONFIG.EXE。可以见到一个对话框.

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可能包)。这个选项一般不常用。


#p#副标题#e#

四、利用CodeGuard

利用CodeGuard其实很简朴,只要像之前那样设置了CodeGuard,然后运行你的应用措施,无论你的应用措施是否在IDE中运行,CodeGuard都将会凭据CodeGuard设置的选项监督你的应用措施。同时,他还会向一个日志文件里输出所有的信息(文件存放在你的工程地址目次中,文件名和工程名一样,扩展名为.cgl)。譬喻你的工程名为C:\Word\Test.prg,那么CodeGuard的日志文件为C:\Word\Test.cgl,它是一个文本文件,可以用任何的文本编辑器来编辑它。

在IDE中,可以通过<菜单>View->Debug Window->CodeGuard Log来查察CodeGuard的日志文件(可能用快捷键Ctrl+Atl+O)。

假如你的措施在运行是呈现属于CodeGuard监督的错误的时候,CodeGuard会把它输出到CodeGuard Log中。并将错误信息用一颗"树"的方法显示(利用很利便,就像利用Windows的资源打点器一样简朴)。每个错误都可以展开,以显示某种错误范例所特有的一些信息。譬喻:一个资源谁人处所利用了、分派以及释放;产生错误时的栈信息;而且指出了堕落的代码行。这样就可以很快的找到错误的来源!

#p#分页标题#e#

CodeGuard Log窗口上有两个按钮Stop和Clear。当Stop选中的时候,假如这个时候措施碰着了错误,CodeGuard将遏制应用措施。假如未选中,那么措施就算碰着了错误也会继承,这样可以运行一次记录许多错误信息。当Clear选中的时候,应用措施每次从头运行将清空日志中的信息。

在CodeGuard Log窗口中,双击单个错误的节点的时候,假如存在源代码的话,IDE窗口会自动跳到那一行代码上。假如不存在源代码的话,则显示CPU窗口。图三中,呈现的错误是资源泄漏。当你的鼠标双击Tform1:Button1Click这一行的时候,会自动跳到源代码中呈现错误的那一行。

当CodeGuard检测到一个错误的时候,并找到呈现问题的源代码时,剩下的事情就是假如纠正你的代码。这个进程可以共同监督和数据断点来实现,结果越发好!

五、CodeGuard中的错误以及原因(这一章由于小我私家的程度有限,不免漏、错)

CodeGuard可以检测到许多运行期的错误!凡是很容易就可以从CodeGuard的寄义找堕落误的来源。对付大大都的错误,CodeGuard一般会显示的包罗:产生错误的处所、资源分派、资源释放、资源被分派以及被会见字节数。

1. Access In Freed Memory

假如内存被释放了,在后头还继承会见,就会产生这个错误。在C/C++中,凡是利用new可能malloc分派内存,用delete和free释放。以下是一个会见了被释放的内存的例子:

void foo()
{
TMyClass *MyClass = new TMyClass();
delete MyClass;
MyClass->xxxx = 10; //MyClass已经被释放了
}

CodeGuard会陈诉已被释放的内存在那里被会见,内存本来被分派的处所以及内存在那边被释放的。

2. Method Called On Freed Object

这个错误跟前一个错误雷同。起因是由于挪用了已被释放的工具的要领而不是会见已被释放的内存!

void foo()
{
TMyClass *MyClass = new TMyClass();
delete MyClass;
MyClass->xxxx (10);
}

CodeGuard将显示在那里挪用了已释放工具的要领,工具被建设的处所以及工具被释放的处所。

3. Reference To Freed Resource

在措施中试图多次(两次以上)释放同一个资源,CodeGuard将检测到这个错误,有好几种要领城市发生这个错误!譬喻:

void foo()
{
TMyClass *MyClass = new TMyClass();
delete MyClass;
delete MyClass;
}

CodeGuard将陈诉资源在那里第二次被释放,从而引起这个错误的。还会陈诉资源在那里分派,在那里首次释放。

4. Method Called On Illegally Casted Object

假如在措施中对有效的内存范畴之外的要领的挪用将会引起这个错误。

void foo()
{
TMyClass *MyClass = new TMyClass[5];
MyClass[5].xxxx(); //No such MyClass[5] delete []MyClass;
}

CodeGuard将陈诉工具挪用的要领界说的处所,以及这个要领被挪用的处所以及工具可能内存被分派处所。

5. Resource Type Mismatch

假如在措施中释放资源和界说(分派)时候纷歧致,会呈现这个错误。

void foo()
{
TMyClass *MyClass = new TMyClass[2];
delete MyClass; //Code1
TMyClass *MyClass = new TMyClass();
delete []MyClass; //Code2
}

在Code1以及Code2城市激发Resource Type Mismatch错误,CodeGuard将会陈诉资源在那里以纷歧致的方法被释放,以及资源是在那边被分派的处所。

#p#副标题#e#

6. Access Overrun

当会见犯科内存区域的内存时会造成这个错误(所会见的内存在正当内存区域之后),凡是环境下是数组下标引用超出本来界说的。

void foo()
{
TMyClass *MyClass = new TMyClass[2];
MyClass[2].abc = 10; //No such MyClass[2] delete [] MyClass;
char *ch = new char[5];
strcpy(ch, "123456"); //Error
delete []ch;
}

CodeGuard陈诉堕落的处所,资源在那边分派的。

7. Access Underrun

当会见犯科内存区域的内存时会造成这个错误(所会见的内存在正当内存区域之前)。

void foo()
{
TMyClass *MyClass = new TMyClass[2];
MyClass[-1].abc = 10; //No such MyClass[2] delete [] MyClass;
}

CodeGuard陈诉堕落的处所,资源在那边分派的。

8. Uninitialized Stack Accessing

会见栈中为被初始化的区域将会造成这个错误。

void foo1(int **Ptr)
{
int Var;
*Ptr = &Var;
}
void foo()
{
int *Ptr;
foo1(&Ptr);
*Ptr = 100;
}

CodeGuard将会陈诉那里会见还没有被初始化的栈。

9. Access In Invalid Stack

当在措施中实验会见栈底部的内存的时候呈现这个错误!

void foo()
{
char str[20];
strcpy(&str[-1], "szbug");
}

CodeGuard陈诉产生错误的处所。

10. Bad Parameter

这个错误凡是是呈现无效的文件可能其他资源句柄作为参数通报给VCL可能Win32API函数时产生的。

Void foo()
{
FILE *Stream;
fclose(Stream);
}

CodeGuard将陈诉利用了不正确参数的函数在那里被挪用。

11. Function Failure

这个错误是CodeGuard在捕捉VCL以及Win32API函数的返回值假如呈现错误时激发的。

#p#分页标题#e#

viod foo()
{
CopyFile("abc.txt", "acbd.txt", true);
//假如这个函数由于某种原因失败了,
//那么CodeGuard将会捕捉并陈诉Function Failure错误!
}

12. Resource Leak

假如在措施中资源(包罗Winwos资源,内存资源等等),分派了,在措施的最后没有释放!将激发Resource Leak错误。

Void foo()
{
char *ch = new char[10];
}

CodeGuard将陈诉资源建设的处所,以及所泄漏的字节数。

六、CodeGuard还可以检测到应用措施的许多错误,这里只说说一些常见的错误,其他的错误和例子请拜见C++Builder的HELP。但愿各人通过CodeGuard找出措施中的错误以及Bug!

 

    关键字:

天才代写-代写联系方式