谈在Debug和Release模式下输出调试信息 .

来源:互联网 发布:iterator java 编辑:程序博客网 时间:2024/03/28 21:23
在调试程序时,有时候设置断点单步运行并不能查出问题的所在,比如程序可能在运行一段时间后死掉了,或者对于Release版本运行不正常等等原因吧,这时需要通过设置一些输出信息,来帮助定位错误发生的位置,这点非常有用。根据个人编程习惯,我通常都会在程序编写过程中适当地加入一些输出信息。

       1、输出宏和函数

       ①使用TRACE,其语法类似printf,用于向Output窗口输出信息。该宏仅仅在程序的Debug版本中出现,在release版本中无效。

       ②使用printf时,在Debug和Release版本下都会输出信息。

       ③使用TRACE和printf时,既可以输出字符串,也可以输出格式化信息,如(以TRACE为例)

          TRACE(_T("This is a test\n"));

          TRACE(_T("This is NO.%d test\n"), cnt);

       ④使用OutputDebugString输出字符串信息,其函数原型如下:

               VOID OutputDebugString(LPCTSTR lpOutputString);         // lpOutputString: pointer to string to be displayed

 该函数在Debug和Release版本中都有效,但是只能输出字符串,如果想输出变量值,需要自己先格式化。例如:

             CString str;

             str.Format(_T("This is NO.%d test\n"), cnt);

             OutputDebugString(str);

       ⑤在Windows CE下,还可以使用RETAILMSG宏来输出格式化信息。如下所示:

            RETAILMSG(TRUE, (_T("This is NO.%d test\n"), cnt));

       2、查看输出的调试信息

      对于Debug版本的程序,通常是在VC IDE环境中运行,因此这时可以直接通过IDE的Output窗口来查看输出的调试信息。

      对于Release版本的程序,可以通过DebugView工具来查看系统DEBUGER中的调试信息,这时不要在IDE环境中运行程序,需要直接运行.exe文件。这个工具在网上可以下载。

      对于Windows CE下的Release版本程序,可以通过串口线将其调试串口接到电脑上,然后在DNW软件中查看输出信息。

    

      最后,还想提一下另外两个很有用的宏:ASSERTVERIFY。前者只在Debug下有效,后者在Debug和Release都有效。通常ASSERT用的比较多,但是需要注意两点:

第一,是在条件为假时输出诊断信息;

第二,由于ASSERT只在Debug版本下有效,因此千万别在其条件中执行函数,我曾经就犯过错。如

        ASSERT( func() == 3);

这条语句是执行func()函数,同时判断其返回值是否是3,如果不是3说明程序有错,则输出诊断信息。在Debug下一切正常,但是在Release下,由于ASSERT无效,导致func()函数没有执行。