当前位置:编程学习 > VC++ >>

如何使用Visual C++调试程序?

    与 DOS 程序相比,Windows 程序动辄达几万行、十几万行,调试相当复杂。幸好 Visual C++ 提供了功能强大的调试器( Debugger ),使我们可以在源代码、汇编级别上进行调试,在调试中可以使用断言、TRACE 宏输出结合单步执行来综合调试。

    1、如何使用编译、连结的出错信息

   

   如图所示,在编译、连结阶段 Output 窗口会向我们输出当前编译的信息,如果遇到错误,它会向我们报告错误在第几行、是什么错误。这时在错误提示行上双击左键,就可以定位到程序中的出错处,此时就可以根据出错提示修改我们的代码。如这个例子中是一个语法错误——漏写了一个分号。当然,有时真正的错误并不在该行(通常是由某几个错误之间的相关性导致)。这就需要我们在附近几行仔细察看。
    如果对所报错误不太理解,可以加亮该错误提示行,然后按F1键,则可察看该错误的较详细解释。(当然,前提是你的英文水平不错)

    常见错误:

    ☆ 语法错误 :
    请检查是否缺少了分号(行结束符),if、else是否匹配、switch 语句用法是否对等。注意,宏定义、包含文件定义结束不需分号,而类定义结束需要分号。
    ☆ 变量、函数未定义、重定义:
     请检查变量大小写、是否包含了相应的头文件(包括你自己的和 MFC、Windows 的)。
    ☆ 连接错误:
    这种错误一般发生在你的程序中使用了动态连结库(dll)的时候(不管是你的还是Windows本身的)。此时,可以察看是哪个函数出错。比如你调用了一个 Windows API,而MSDN中的说明写到这个函数需要包含哪个头文件(.h)、输入哪个库(.lib),那么就要在你的工程设置里加入这个库。方法是选择菜单:Project->Settings,转到Link选项卡,在 Object/Library modules 输入框中输入相应的模块,如图示。

    如果我们改正了所有的错误,编译通过了,但结果不正确,那么我们就必须使用调试的办法了。主要有两种。

    2、使用断言进行运行时调试

    运行时调试是指按 Ctrl+F5 执行程序,在运行时测试。(单步调试时按 F5)此时我们的程序与Debugger是"相对"独立的。
    如果你的程序运行时好时坏,或者有时会执行非法操作,而你觉得自己的设计又没有问题,那么此时最适合使用断言进行运行时调试。方法是使用 ASSERT 宏( MFC 宏大多数在程序的发行版 Release 中是不产生代码的,仅在 Debug 版中有用)。
    断言是指你对一个条件进行判断,假定它真。我们编程时编写的部分代码总是需要一定条件的,条件满足时执行,反之不执行。如果你的程序运行时好时坏,或者有时会执行非法操作,一定是由于部分代码的执行条件有时成立,有时不成立。这时可以在这些代码前面加上 ASSERT 宏判断条件(用法:ASSERT(条件表达式)),当条件满足时程序顺利执行,当条件不满足时,Debugger 会弹出图示的窗口:

    这时 Debugger 告诉我们:“你的程序运行时第 317 行的那个断言条件没有满足!” 哈哈,这下我们知道错在哪里了。
    这种错误通常发生在一个可能非法的对象指针、数组下标越界等会造成非法访问不属于应用程序的内存的时候。
    断言使用简单、功能强大,所以我们在平时编程序时就应该养成加入断言的习惯 。大致有如下几种情况:

    ◎ 通过指针分配了一块内存,必须使用断言判断指针有效性。使用 ASSERT(pObject!=NULL);
    ◎ 对于函数调用,必须使用断言判断参数的有效性。这些参数包括指针,限制范围的数等。
    ◎ 对于数组访问,必须使用断言判断下标的有效性,特别是当使用函数传递参数时。
    ◎ 其它一些情况,请自己总结。

    例子:

         // example for ASSERT
         CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
         ASSERT( pcage!= NULL )
         ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )

		
	
补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,