设为首页 加入收藏

TOP

如何使用Visual C++调试程序?
2014-11-23 20:01:13 】 浏览:10070
Tags:如何 使用 Visual 调试 程序

与 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 ) ) )
     
 
        
      
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC代码的编写和调试---编写易于调.. 下一篇VC++ Studio使用技巧

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目