vc debug 方法
VC中Debug和Release的区别

vc中debug和release的不同在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。
这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。
所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。
代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。
这也存在debug跟release的问题吗?答案是肯定的。
在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。
导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (注2)3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT 的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
vc 程序调试方法.ppt

调试可以借助“调试工具条”来进行,“调试工具 条”中的主要命令如图1所示
图1
单步执行(Step Over)
C语言的调试手段主要有:单步执行、设置断 点和运行到光标处,这三种调试手段在实践中 常常结合使用。
1. 单步执行(Step Over) 单击“单步执行(Step Over)”按钮一次,程序 执行一步,如图2所示。在程序调试过程,黄 色右箭头表示当前要执行的代码行,程序执行 的每一步都可以观察变量的值,检查程序的执 行情况。当程序执行完毕,黄色右箭头指向主 函数的“}”位置时,应单击“调试工具条”上 的“停止调试(Stop Debugging)”按钮。
C语言程序的调试方法
在编程过程中,出错是难以避免的,出错并不可 怕,关键是如何尽快找到和排除程序中的错误。
程序错误总体上有两类:语法错误和逻辑错误。 对于语法错误,编译时会产生错误信息,可以根据错 误提示信息加以修改。如果程序编译、连接都没有错 误,但运行结果与预期结果不一致,则需要通过调试 来找出程序中存在的逻辑错误,并加以排除。
设置断点后,单击工具栏上的“进入调试(Go)”按钮,程序运 行到断点处会暂停,此时程序员可以决定接下来是单步执行, 还是继续单击“Go”命令运行到下一个断点。
图3
调试工具条中主要按钮的含义如表1-1所示,其中,Step Into和Step Out的使用与函数相关 .
表1-1 调试工具条中主要按钮的含义
按钮名称 Step Over
单步执行完当停止调试
Run to Cursor 执行到光标处,需要先将光标移动到程序的指定位置
Go
运行程序至断点,需要先设置好断点
Step Into 单步执行,如果当前语句中有函数调用,则单步进入被调用函数
VC单步调试

VC调试技术程序出错的类型大致可以分为两种,语法错误和逻辑错误。
语法错误可以通过编译器的出错信息得到纠正。
然而逻辑错误则不能,所以各大IDE(集成开发环境)中都提供了debug功能,用来分析和排除程序中的逻辑错误,排除逻辑错误的过程又称调试(或debug),下面谨以VC++6.0的调试环境做介绍。
常用的调试命令主要有:step into 命令快捷键:F11 单步执行每条语句,在遇到函数的时候,系统将进入函数,单步执行其中的语句。
step over 命令快捷键:F10 单步执行每条语句,但在遇到函数时候,系统将把函数当作“一条语句”来执行,自动执行其中的内容,而不进入函数内部单步执行。
run to cursor 命令快捷键:Ctrl+F10 系统将自动执行到用户光标所指的语句前。
(这个功能很有用,可以将精力集中到有问题的地方,从而节省调试时间)Go 命令快捷键:F5 系统将编译,连接,自动运行程序,但是会在程序设置了断点(breakpoint)处停下。
BuildExcute 命令快捷键:Ctrl+F5 系统将编译,连接,运行编译好的程序代码,因此不会在断点处停留,但是在程序执行结束之后,系统会给一个Pause,以方便用户观察输出结果。
Stop debug命令快捷键:Shift+F5 本命令是用来终止动态调试过程的。
动态调试的主要方法——watch(监视变量)在程序编译通过以后,当使用了step into,step over,run to cursor, go命令使系统在程序执行的过程中停下之后,系统就会进入调试状态。
调试过程中,你的程序执行窗口会调到后台,而系统窗口中会显示你的程序,其中的黄色箭头指向的是系统下一步将要执行的语句。
而系统窗口下面的那个监视窗口就是我们将要介绍的重点. watch窗口被左右分成了两个部分,左面的那部分我们姑且称之为“自动监视区”(即variable窗口),而右面的我们称之为“手动监视区”。
在VC中使用Debug

在VC中使用Debug1.选定Debug编译选项Build -> Set Active Configuration -> Win32 Debug或者在Build工具栏上的ListBox中选择Debug。
Debug定义了_DEBUG宏,而Release定义了NDEBUG宏。
2.先按F12编译Browse信息这样编译后可以查到变量定义。
3.执行Debug按F5(注意,如果按Ctrl+F5 是Run,起不到Debug的作用)。
在Debug时一定要把Debug工具栏拉出来,方便调试。
4.Breakpoints(F9)用Alt+F9可以对所有的断点进行编辑。
对指令地址(EIP)指定断点当EIP的值为指定值时中断。
如下图:是对SetWindowLong的地址进行设置的(注意:一定要在前面加0x)。
对内存地址设置断点当指定内存地址发生变化时中断(在运行时设置才管用)。
5.Show Next Statement(Alt+Num *)显示当前指令所处的代码位置6.Step Over(F10)单步追踪,遇到Call语句不进入7.Step Into(F11)单步追踪,遇到Call语句进入8.Step Out(Shift+F11)跳出当前函数调用9.Run to Cursor(Ctrl+F10)运行到光标所处位置10.Memory Leaks内存泄漏。
要想检查到memory leaks,必须包含<afx.h>头文件(实际上是#pragma comment(lib, "mfc42ud.lib")在起作用)。
注意:内存泄漏是一个十分严重的问题,尤其对于需要长时间运行的程序(进程长时间保留在内存中)更是如此。
有一个重要的事实是,当进程正常退出时,操作系统负责清空该进程的所有内存。
11.QuickWatch(Shift+F9)可以更改变量运行时的值。
12.Watch窗口输入"err,hr"可以动态查看GetLastError信息。
vs2015 debug条件编译

vs2015 debug条件编译全文共四篇示例,供读者参考第一篇示例:VS2015 Debug条件编译是指在使用Visual Studio 2015进行调试时,在代码中通过条件编译来控制特定代码块的执行。
在软件开发过程中,条件编译是一种常用的技术,可以根据不同的需求在不同的编译环境下编译出不同的代码。
在调试阶段,通过条件编译可以灵活地控制代码的执行流程,使开发人员更方便地进行调试工作。
在VS2015中,条件编译可以通过使用预处理指令来实现。
在代码中使用#if、#ifdef、#ifndef、#else、#elif和#endif等预处理指令可以控制代码在不同环境下的编译。
在调试环境下,通过设置条件编译宏可以使特定代码块在调试时执行,而在发布版本中不被编译进去,从而帮助开发人员快速定位问题并进行调试。
在进行Debug条件编译时,需要注意以下几点:1. 定义条件编译宏:在项目的属性设置中,可以设置不同的编译配置,如Debug和Release。
在Debug配置中,可以设置特定的条件编译宏,如DEBUG,使代码中包含在#ifdef DEBUG 和#endif之间的代码块会在Debug环境下编译执行。
3. 调试Debug环境下的代码:在Debug环境下,由于条件编译所包含的代码会被编译执行,可以更方便地进行代码调试。
可以设置断点、观察变量值等操作来定位代码问题。
4. 优化Release版本的代码:在Release环境下,不包含调试信息和条件编译宏的代码会被编译执行,可以提高代码的执行效率。
在进行条件编译时,需要注意对Debug和Release版本的代码逻辑进行优化处理。
第二篇示例:VS2015是微软公司推出的集成开发环墶(IDE)软件,它可以帮助开发人员在Windows平台上进行更加方便和高效的软件开发工作。
在进行软件开发过程中,debug(调试)是一个非常重要的步骤,它可以帮助开发人员找出代码中的bug并进行修复。
vs2015 debug条件编译

vs2015 debug条件编译在Visual Studio 2015中,条件编译是一种非常有用的技术,它允许在调试时根据特定条件来执行或跳过代码块。
这在调试复杂的程序时非常有用,因为它可以帮助我们针对特定情况执行特定的代码,或者跳过一些不必要的代码。
下面我将从几个方面详细介绍在VS2015中如何进行条件编译的调试。
1. 使用条件断点,在VS2015中,你可以设置条件断点来在特定条件下暂停程序的执行。
在设置断点后,右键单击断点,然后选择“条件”,在弹出的对话框中输入你想要的条件,比如变量的特定值或者表达式的真值。
当程序执行到这个断点时,它会检查条件,只有在条件满足时才会暂停程序。
2. 使用条件编译指令:在代码中,你可以使用预处理指令来实现条件编译。
比如,你可以使用`#if`、`#else`和`#endif`来根据条件编译不同的代码块。
例如:csharp.#define DEBUG.// ...#if DEBUG.Console.WriteLine("Debug 模式下执行的代码");#else.Console.WriteLine("非 Debug 模式下执行的代码");#endif.在这个例子中,当`DEBUG`被定义时,`Console.WriteLine("Debug 模式下执行的代码")`会被编译进程序,否则会编译`Console.WriteLine("非 Debug 模式下执行的代码")`。
3. 使用条件编译属性:在VS2015中,你还可以使用属性来实现条件编译。
你可以在项目属性中设置不同的条件编译标识符,然后在代码中使用这些标识符来进行条件编译。
比如,在项目属性中设置了一个名为`DEBUG`的条件编译标识符,那么你可以在代码中这样使用:csharp.#if DEBUG.// 这里是在 Debug 模式下执行的代码。
vc错误解决
现象是用 debug中的 step info或者run to cursor合着设置断点会出现One or morebreakpoints cannot and have been disabled. Execution will stopat the beginning of the program.解决方法,1.在project->setting->c/c++-general->debug info->program databse for edit and continue ;2.edit->breakpoints->removeall;3.build-> active project configuration->*.exe win32 debug.经过以上三步,ok!另一篇:一、两种调试方式:1、Debug模式:2、Release模式:单击菜单[Project]->[Settings…],出现"Project Settings"对话框,选择“Release”状态;将C/C++标签中的Category选择General,Optimizations选Disable (Debug),Debug info选Program Database;在Link标签中选中Generate debug info复选框。
注:Release模式稍好点,因为某些情况程序只能在Release下运行,如“显示对话框的DLL”在Debug下显示出窗口后就死在那里。
二、调试中可能的错误:“不能调试”、“断点错误”。
1、“不能调试”:“One or more breakpoints cannot and have been disabled. Execution will stop at the beginning of the program.”2、“断点错误”:"One or more breakpoints are not positioned on valid lines.These breakpoints have been moved to the next valid line."注意:“不能调试”跟“断点错误”不是一回事,“断点错误”会禁用某些错误断点,但“不能调试”则会禁用所有断点。
VC的工程设置解读Project—Settings
VC的工程设置解读Project—SettingsVC工程设置可能会直接影响到工程的正确性,有时是BUG产生的直接原因,在出现莫名其妙的错误,首先应考虑到是否是工程设置有问题,这无论对于开发还是测试,都是很必要的,本文大致介绍一下工程设置选项。
工程选项的快捷建是Alt+F7, 左边的列表可以选择要设置的工程编译方式(Debug或Release),如果多个工程,还可以选择要设置的工程。
右边是一个属性页,内容十分丰富,依次是:General , Debug , C/C++ , Link , Resource , MIDL , Browse Info , Custom Build , Pre-link Step , Post-build step下面主要介绍一下我们常用到的选项:一、General: 设置工程的一般特性,组合框为是否选用MFC静态库,默认为共享的DLL方式,对一些不支持MFC42的机器环境来说,选择静态编译还是有必要的。
底下的两个编辑框表示编译中的文件输出路径。
二、Debug:设置工程调试的选项。
1.Excutable for debug session : 如果是dll的工程,需要指定启动它的exe文件路径,如果是exe工程,默认当前工程。
2.Work directory 设置调试程序的工作路径,默认exe当前路径3.Program arguments 程序启动命令行参数,作控制台程序的时候经常要用三、C/C++ : 这一页内容很多,选择项通过Category(种类)来设置,包括:1.General2.Warning leve 警告级别,VC默认为3,一般不更改3.Optimizations优化级别,DEBUG下设为Disable(Debug),就是不优化,在追求效率或者编译结果的时候可以选择最大速度或最小尺寸的选项,不过微软不保证优化的准确性。
4.Waring as error : 不用多说了,经常忽略警告的人不会选这项吧?5.Generate browse info : 产生浏览信息,在编辑调试加了一些功能,单会产生很大的编译文件,建议不要选。
VisualStudio中的debug和release版本的区别
VisualStudio中的debug和relea se版本的区别Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和 Release的真正秘密,在于一组编译选项。
下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release版错误,在此不讨论)Debug 版本参数含义/MDd /MLd或/MTd使用 Debug runtime library (调试版本的运行时刻函数库)/Od 关闭优化开关/D "_DEBUG"相当于 #define_DEBUG,打开编译调试代码开关(主要针对ass ert函数)/ZI 创建 Edit and continu e(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译/GZ 可以帮助捕获内存错误/Gm打开最小化重链接开关,减少链接时间Release版本参数含义/MD /ML 或/MT 使用发布版本的运行时刻函数库/O1 或/O2 优化开关,使程序最小或最快/D "NDEBUG"关闭条件编译调试代码开关(即不编译ass ert函数)/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改实际上,Debug 和 Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
哪些情况下 Release版会出错有了上面的介绍,我们再来逐个对照这些选项看看 Release版错误是怎样产生的1、Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。
VC程序调试技术 转
VC程序调试技术转VC程序调试技术[转]2010-04-24 16:49在开发程序的过程中,经常需要查找程序中的错误,这就需要利用调试工具来帮助你进行程序的调试,当然目前有许多调试工具,而集成在VC中的调试工具以其强大的功能,一定使你爱不释手。
下面我们先来介绍VC中的调试工具的使用。
1 VC调试工具1.1调试环境的建立在VC中每当建立一个工程(Project)时,VC都会自动建立两个版本:Release版本,和Debug版本,正如其字面意思所说的,Release版本是当程序完成后,准备发行时用来编译的版本,而Debug版本是用在开发过程中进行调试时所用的版本。
DEBUG版本当中,包含着MICROSOFT格式的调试信息,不进行任何代码优化,而在RELEASE版本对可执行程序的二进制代码进行了优化,但是其中不包含任何的调试信息。
在新建立的工程中,你所看到是DEBUG版本,若要选择RELEASE版本,可以选择菜单PROJECT中的SETTING命令,这时屏幕上面弹出PROJECT SETTEING对话框,在SETTING FOR下拉列表中选择RELEASE,按OK退出。
在调试程序的时候必须使用DEBUG版本,我们可以在Project Setting对话框的C/C++页中设置调试选项。
各个选项的含意如下:Program Database表示产生一个存储程序信息的数据文件(.PDB),它包含了类型信息和符号化的调试信息;Line Numbers Only表示程序经过编译和链接产生的.OBJ 或.EXE文件仅仅包含全局和外部符号以及行号信息;C7 Compatible表示产生一个.OBJ或.EXE文件行号信息以及符号化的调试信息;None表示不产生任何调试信息。
1.2调试的一般过程调试,说到底就是在程序的运行过程的某一阶段观测程序的状态,而在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。
所以我们所做的第一项工作就是设立断点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
了解调试,首先要知道"断点"这个概念.断点就是程序运行中可能会中断的地方,方便开发者在程序运行的过程中查看程序当前的运行状态,比如变量的值,函数的返回值等等.究竟怎么使用断点呢?1.调试快捷键F9——在当前光标所在的行下断点,如果当前行已经有断点,则取消断点.F5——调试状态运行程序,程序执行到有断点的地方会停下来.F10——单步执行程序.F11——和F10的区别是,如果当前执行语句是函数调用,则会进入函数里面.CTRL+F10——运行到光标所在行.SHIFT+F11——跳出当前所在函数.特别说明:a.有的地方不能下断点.比如空行,基本类型定义语句(不初始化),等等非执行语句.比如int i; // 此行不能下断点字串7int j = 0; // 这里可以下CString str; // 这里可以下int k = Max(i, j); // 这里可以下b.不是所有断点都会(断).比如下断点的语句在程序里面没有被执行.c.此外,ALT+F9还可以下条件断点,不过这个不常用,有兴趣的可以自己研究:)2.如何调试Release版的程序?有些程序在debug下运行的很好,但在release下却总是失败,默认情况下release是不能调试的.怎么解决呢?其实"debug"和"release"都只是一个代号而已,各自对应一组不同的编译选项.在release的默认设置下,ALT+F7 ,调出工程设置对话框,切换到link选项卡,勾选"Generate debug info",然后再切换到C/C++选项卡,在"Optimizations"里面选"Disable(Debug)",在下面的"Debug info"里面选"Program Database for Edit and Continue".然后点OK保存设置,重新编译程序,下断点即可.3.上面两点已经能应付很多种情况了,但是有时候即使在debug下也不能下断点,我以前也曾经遇到过这种问题,一个调了4层的dll,就是不能下断点.其实还除了上面的方法,还有一种最底层的实现技术:使用汇编.细心的人可能会发现,有时候在调试状态下当程序出现异常的时候,光标会指向汇编代码,而这个代码就是int 3,这其实是一个中断.在你的代码的任意地方加上__asm{int 3};用debug编译,然后直接运行程序.当程序执行到上述代码的时候,就会出现一个框,告诉你说一大堆信息,说程序错了,下面有"调试"、"终止"、"忽略",不用理,点调试就可以进入跟踪了。
这种方法我还没有失手过:)蓝水晶回复于05日14点35分VC调试入门概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。
不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。
这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。
本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。
设置为了调试一个程序,首先必须使程序中包含调试信息。
一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。
为了增加调试信息,可以按照下述步骤进行:? 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings 打开)? 选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:命令行 Project settings 说明无 None 没有调试信息/Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息/Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等/Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。
/ZI Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。
这个选项同时使#pragma设置的优化功能无效? 选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL? 如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。
选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。
断点断点是调试器设置的一个代码位置。
当程序运行到断点时,程序中断执行,回到调试器。
断点是最常用的技巧。
调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。
设置断点:可以通过下述方法设置一个断点。
首先把光标移动到需要设置断点的代码行上,然后? 按F9快捷键? 弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。
打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。
一般情况下,直接选择line xxx 就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。
去掉断点:把光标移动到给定断点所在的行,再次按F9就可以取消断点。
同前面所述,打开Breakpoints 对话框后,也可以按照界面提示去掉断点。
条件断点:可以为断点设置一个条件,这样的断点称为条件断点。
对于新加的断点,可以单击Conditions 按钮,为断点设置一个表达式。
当这个表达式发生改变时,程序就被中断。
底下设置包括“观察数组或者结构的元素个数”,似乎可以设置一个指针所指向的内存区的大小,但是我设置一个比较的值但是改动范围之外的内存区似乎也导致断点起效。
最后一个设置可以让程序先执行多少次然后才到达断点。
数据断点:数据断点只能在Breakpoints对话框中设置。
选择“Data”页,就显示了设置数据断点的对话框。
在编辑框中输入一个表达式,当这个表达式的值发生变化时,数据断点就到达。
一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入 g_bFlag这个全局变量的名字,那么当程序中有g_bFlag= !g_bFlag时,程序就将停在这个语句处。
消息断点:VC也支持对Windows消息进行截获。
他有两种方式进行截获:窗口消息处理函数和特定消息中断。
在Breakpoints对话框中选择Messages页,就可以设置消息断点。
如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。
如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。
值WatchVC支持查看变量、表达式和内存的值。
所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被称为Watch的机制来观看变量和表达式的值。
在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。
单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。
注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。
Memory由于指针指向的数组,Watch只能显示第一个元素的值。
为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。
在 Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
VariblesDebug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。
特别是当前指令涉及的变量,以红色显示。
寄存器Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。
进程控制VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。
各个快捷键功能如下:快捷键说明F5 继续运行F10 单步,如果涉及到子函数,不进入子函数内部F11 单步,如果涉及到子函数,进入子函数内部CTRL+F10 运行到当前光标处。
Call Stack调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。
单击Debug工具条上的Call stack 就显示Call Stack对话框。
在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。
单击这些函数名可以跳到对应的函数中去。
其他调试手段系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:宏名/函数名说明TRACE 使用方法和printf完全一致,他在output框中输出调试信息ASSERT 它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。
对于系统中出现这个宏导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。
例如,对于一个还没有创建的窗口调用SetWindowText等。
VERIFY 和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。
关注一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:? 对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。
? 一些函数返回错误,需要用其他函数获得错误的具体信息。
例如accept返回INVALID_SOCKET表示accept失败,为了查明具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。