VC/MFC调试技术

来源:互联网 发布:淘宝自动签收时间 编辑:程序博客网 时间:2024/04/30 11:36

一、断言

1、基本概念

断言是一种让错误在运行时候自我暴露的简单有效实用的技术。它们帮助你较早较轻易地发现错误,使得整个调试过程效率更高。

断言是布尔调试语句,用来检测在程序正常运行的时候某一个条件的值是否总为真,它能让错误在运行时刻暴露在程序员面前。使用断言的最大好处在于,能在更解决错误的发源地的地方发现错误。断言具有以下特征:

.断言是用来发现运行时刻错误的,发现的错误是关于程序实现方面的。

.断言中的布尔表达式显示的是某个对象或者状态的有效性而不是正确性。

.断言在条件编译后只存在于调试版本中,而不是发布版本里。

.断言不能包含程序代码。

.断言是为了给程序员而不是用户提供信息。

使用断言最根本的好处是自动发现许多运行时产生的错误,但断言不能发现所有错误。断言检查的是程序的有效性而不是正确性,可通过断言把错误限制在一个有限的范围内。当断言为假,激活调试器显示出错代码时,可用Call Stack命令,通过检查栈里的调用上下文、少量相关参数的值以及输出窗口中Debug表的内容,通常能检查出导致断言失败的原因。_ASSERTE宏 (属于C运行时间库)还能在断言失败时显示出失效断言。下面我们讨论一下MFC库中的断言。

2、MFC库中的断言

(1) ASSERT(布尔表达式)

用MFC时最好选择ASSERT宏,它的优点是即使出现了WM_QUIT消息也能显示断言失效消息框。

(2) VERIFY(布尔表达式)

VERIFY宏中的布尔表达式在发布版本中被保留下来。VERIFY宏简化了对函数返回值的检查,一般用来检查Windows API的返回值。由于VERIFY宏里的布尔表达式在发布版本里保留了下来,因此最好尽量不要使用这个宏以实现程序代码和调试代码的完全分离。

(3 )ASSERT_VALID(指向CObject派生类对象的指针)

ASSERT_VALID宏通过调用重载的AssertValid函数来确定指向CObject派生类对象的指针是否有效。无论你什么时候从CObject派生类中得到一个对象,在对这个对象做任何操作之前都应该调用ASSERT_VALID宏。

(4) ASSERT_KINDOF(类名, 指向CObject派生类对象的指针)

这个宏用来验证指向CObject派生类对象的指针是否从某个特殊类中派生,在调用它之前先调用ASSERT_VALID宏。只有在很特殊的场合下才用得到,如检测编译器可能错过的对象类型问题。

此外,还有两个没有正式文件的ASSERT宏的变种:ASSERT_POINTER(指针,指针类型),ASSERT_NULL_OR_POINTER(指针,指针类型)。

原创粉丝点击