相关研究表明软件的编写中,大多数时间和精力是花在了调试上。好的调试方法也是编写好程序的关键。下面将介绍常用的集中调试技巧,主要有断言、轨迹、断点等。
1、断言assert
断言就是判断,assert断言有两种,分别是assert和ASSERT。其中,前者是标准C++中的宏,后者是MFC中的宏。断言的功能是测试它的参数,若参数为0 ,则中断执行并打印一段说明消息。在Release版本的程序中它不起任何作用。assert和ASSERT的使用方法一样。
说明:ASSERT宏同assert使用方法一样,但需要包含afx.h头文件,afx.h是MFC的头文件。VERIFY和TRACE宏都需要MFC的支持。
2、verify
verify也是一种断言,不仅可以断言简单变量,含可以断言含有函数的表达式。它是MFC中的宏,使用时写作VERIFY。
3、assert与Verify的差异
ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。但是在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERUFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。VERIFY与ASSERT用在程序调试上并无本质上的区别,但是建议尽量使用ASSERT宏。因为VERIFY在Release版本中虽然不输出,但仍然要做计算,这会浪费不必要的CPU时间。
4、轨迹跟踪
轨迹跟踪就是人为地加入输出语句,可以是输出变量的值,也可以是输出特定的记号。经过这样处理的程序在运行时会输出一系列的轨迹,通过观禅这些输出就可以分析出程序运行了哪些语句,在哪里出了问题。这种方法有时比使用调试器要轻便和快捷许多。
5、断点
断点时调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是常用的技巧。调试时,只有设置了断点并是程序回到调试器,才能对程序进行在线调试。断点有条件断掉、数据断点、消息断点3种。
条件断点就是带有条件判断的断点。只有当满足该条件时,断点才能中断,否则继续执行下一条语句。
数据断点是对某个表达式进行监视,当表达式的值发生改变时,就发生中断,进入跟踪状态。一般情况下,这个表达式应该由运算符和全局变量构成。
消息断点VC也支持对Windows消息进行解惑,即当某个特定消息发生时产生中断,进入跟踪状态。
——摘自《C++从入门到精通》 秦广军等编著