VC如何releas调试

合集下载

VC调试方法大全

VC调试方法大全

一、调试基础 调试快捷键F5:开始调试Shift+F5:停止调试F10 : 调试到下一句,这里是单步跟踪 F11 :调试到下一句,跟进函数内部跟踪调试1、尽量使用快捷键时行调试2、观察调试信息3、高级中断设置异常调试 重试— > 取消— > 调试 函数堆栈,用variables 或者call stack 窗口Release 调试经常测试你的Debug 和Release 版本不要移除调试代码,如用 ASSERT, TRACE 等。

初始化变量,特别是全局变量, malloc 的内存,new 的内存当你移除某个资源时,确保你移除了所有跟这个资源相关的申明(主要是在 resouce.h 文中)使用3或者4级的警告级编译你的代码,并确保没有警告, Project->setting->c/c++->warninglevel (版是项目-> 属性->C/C++-> 常规— > 警告等级)6、—debug 改成 NDEBUG 进行调试,project->setting->C/C++->Preprocessordefinitions >属性->C/C++->预处理器-> 预处理定义)(这里是debug 和Release 编译的重要不同之一)VC 调试方法大全VC 调试方法大全Shift+F11: 从当前函数中跳出Ctrl+F10: 调试到光标所在位置 F9: 设置(取消)断点 Alt+F9:高级断点设置中文(中文版是项目-7、在 Release 中调试源代码,project->setting->C/C++->debug info 选择ProgramDataBase (中文版是项目-> 属性->C/C++-> 常规-> 调试信息格式-> 用于编辑并继续"的程序数据库),Project — >setting->link 选上Generate debug info ( 中文版是项目-> 属性-> 链接器-> 调试-> 生成调试信息)8、走读代码,特别关注堆栈和指针二、TRACE 宏 当选择了 Debug 目标,并且afxTraceEnabled 变量被置为TRUE 时,TRACE 宏也就随之被激活了。

VC6.0中如何调试程序说明大全

VC6.0中如何调试程序说明大全

设置断点
将光标放到需要设置断点的行
设置断点
点击按钮
断点设置好
VC++程序调试演示
• 程序调试概述 • Debugger工具栏简介 • 启动Debugger • 变量跟踪 • 设置断点 • 快速执行到一个断点 • 结束Debugger • 快速查看变量类型
快速执行到一个断点
点击按钮
快速执行到断点设置行
* 选中Breakpoint对话框中的DATA标签,对应的页面将会弹出
* DATA页面中的Expression编辑框中写出逻辑表达式,如(X==3);
2、监视表达式发生变化断点: * 从EDIT 菜单中选中breakpoint命令,屏幕 上将会出现Breakpoint对话框。 * 选中Breakpoint对话框中的DATA标签,对 应的页面将会弹出。 * 在Expression编辑框中写出需要监视的表 达式。 * 最后按OK键返回。
4 控制程序的运行
从菜单Build到子菜单Start Debuging 选择Go程序开 始运行在Debug状态下,程序会由于断点而停顿下来后, 可以看到有一个小箭头,它指向即将执行的代码。按要求 来控制程序的运行,其中有四条命令:Step over, step Into , Step Out ,Run to Cursor。Leabharlann Debugger工具栏简介
(SHIFT+F11)确认当前子程序中没有程序错误时,该选项可 以快速执行该子程序,并停留在子程序后面的语句
Debugger工具栏简介
(CTRL+F10)快速执行到光标所在的代码处
Debugger工具栏简介
(SHIFT+F9)显示QuickWatch窗口,在该窗口可以计算表达 式的值

vc 程序调试方法.ppt

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 单步执行,如果当前语句中有函数调用,则单步进入被调用函数

关于VC60中的程序调试技巧

关于VC60中的程序调试技巧

关于VC60中的程序调试技巧调试程序可以帮助的了解程序是怎样运行的。

1、如何快速地规范代码缩进格式选中所需要规范的代码,按hift+F82、如何在Releae状态下进行调试3、Releae和Debug有什么不同。

Releae版称为发行版,Debug版称为调试版。

Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。

Releae版运行速度较快,可执行文件较小,但在其编译条件小无法执行调试功能。

Releae的e某e文件链接的是标准的MFCDLL(UeMFCinaharedortaticdll),比如MFC42.DLL。

这些DLL在安装Window的时候,已经配置,所以这些程序能够在没有安装ViualC++6.0的机器上运行。

而Debug版本的e某e链接了调试版本的MFCDLL文件,如MFC42D.DLL。

在没有安装ViualC++6.0的机器上不能运行,因为缺MFC42D.DLL等,除非选择uetaticdllwhenlink。

4、ASSERT和VERIFY有什么区别ASSERT里面的内容在Releae版本中不编译,VERIFY里面的内容仍然编译,但不再判断真假。

所以后者更安全一点。

例如ASSERT(file.Open(trFileName)),一旦到了Releae版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。

如果用VERIFY()就不会有这个问题。

5、Workpace和Project之间是什么样的关系每个Workpace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting…中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。

6、如何在非MFC程序中使用ClaWizard在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。

【Visual C++】Visual_C++6.0调试功能图解教程

【Visual C++】Visual_C++6.0调试功能图解教程

Visual C++ 6.0调试功能这是我自己在学习时整理的,希望对大家有用.其中有几个部分的内容,如下:※My Note全部由我截图并参考资料进行说明,这其中有大量的内容是调试过程中体会总结才写的.有不当之处请大家更正.※From 《Visual C++ Debugger》这本书写得非常的不错,从里面截了一些有用的图,主要是强烈推荐大家阅读这本书.※Debug Menu From MSDN这是我从Visual C++ 6.0 MSDN Library October 2001中查来的,在My Note中有很多是从那里参考的.强烈推荐大家看这份英文说明.※From 《visual C++ 6.0开发工具与调试》这是我从网络上搜索到的,问题很经典,强烈推荐大家参看学习,避免不必要的错误.My Note○常用功能:1.Restart(Ctrl+shift+F5):此debugger功能将从程序的开始(第一有效行)处全速执行,而不是从当前所跟踪的位置开始调试,这时所有变量的当前值都将被丢弃,debugger会自动停在程序的main()开始处.这时如果选择Step Over(F10)就可以逐步执行main()函数了.2. Stop Debugging(Shift+F5):此debugger功能将终止(所有)调试,并返回到常规编辑状态.3. Break(此功能常常在遇到调用函数的语句时可见.):此功能将在调试过程中的debugger当前位置挂起程序的执行,然后就可以在调试状态一修改程序的代码,接着可以用Apply Code Changes(Alt+F10)来应用修改的代码到正在调试的程序当中.如果,当前(需要,待)可以(从DOS等窗口)输入值,挂起后将不能再输入.4.Apply Code Changes(Alt+F10):此功能可以在程序正在调试程序过程中应用(挂起)修改后的源代码.如,选择Break功能并修改代码后,只要选择Apply CodeChanges(Alt+F10)就能将修改后的代码应用到正在调试的程序当中.5. Show Next Statement(Alt+Num*):此功能将显示程序代码的下一条语句,如果源代码中找不到,则在Disassembly窗口中显示语句.当在Disassembly窗口中显示时,可以单击Disassembly 返回到源代码窗口.6.Step Into(F11):此功能可以单步进入到在调试过程中所跟踪的调用函数的语句的函数内部.如,当前语句是”d.Display()”,选择Step Into(F11)后,Debugger将进入Display()函数内部并停在Display()函数内部的第一条语句上.(此时,就可以Step Over(F10)对Display()函数进行单步调试了.)7. Step Over(F10):此功能可以单步对所在函数单步调试,如果调试的语句是一个调用函数的语句时,Debugger将全速执行所调用的函数,单步(一步)通过所调用的函数,Debugger停该调用语句的下一条语句上.8.Step Out(Shift+F11):此功能将使Debugger切换回全速执行到被调用函数结束,并停在该函数调用语句的下一条语句上.当确定所调用的函数没有问题时可以用这个功能全速执行被调用函数.9. Run to Cursor(Ctrl+F10):此功能将全速执行到包含插入点光标所在的行,可以作为在插入点光标处设置常规断点的一种选择.注意,当光标处不是一个有效的执行语句时此功能将不起作用.10.Go(F5):此功能将全速执行程序直到遇到一个断点或程序结束,或直到程序暂停等待用户输入.注意,此功能最能有效的调试循环,常将断点设置在循环体内,重复的按F5全速执行循环体可以测试循环过程中的产生的变化.11.Step Into Specific Function:此功能可以可以单步通过程序中的指令,并进入指定的函数调用,此功能对于函数的嵌套层不限.From 《Visual C++ Debugger》Debug Menu From MSDNStart Debug Commands (Build menu)When you begin debugging, the Debug menu appears, replacing the Build menu on the menu bar. You can then control program execution using the commands listed in the following table.Debug Menu Commands that Control Program ExecutionThe following additional commands appear on the Debug menu:From 《visual C++ 6.0开发工具与调试》1、如何快速地规范代码缩进格式选中所需要规范的代码,按shift+F82、如何在Release状态下进行调试Project->Setting=>ProjectSetting对话框,选择Release状态。

C编程的调试技巧

C编程的调试技巧

/* include file */ #include "defs.h" #include "oaks8lib.h"
/* define common symbol
*/
/* for function to deal with OAKS8-LCDBoard peripheral */
/* define function prototype */
****************************************************************************
* History :
*""FILE COMMENT END""*******************************************************/
➢ 单步执行是最重要的调试手段!
#include <iostream.h>
int main()
{
char type = s;
static void print_dec(unsigned char *message, int dec);
/* display decimal number in LCD */
/*""FUNC COMMENT""*************************************************************
结 论1
➢ 永远不要写过长的语句,应该让代码尽可 能简单;永远不要把两条语句写在一行中, 以便于调试。
#include <iostream.h>
void main()

VC环境程序调试方法

VC环境程序调试方法

常用操作及快捷键
5. 调试程序:
开始调试: F5:运行到断点 CTRL+F10:运行到光标处 单步执行:F10 停止调试:SHIFT+F5 或 F5(后面无断点) 增加Watch(变量或表达式):直接输入 删除Watch:DEL
常用操作及快捷键
5. 调试程序:
开始调试: F5:运行到断点 CTRL+F10:运行到光标处 单步执行:F10 F10 停止调试:SHIFT+F5 或 F5(后面无断点) 增加Watch(变量或表达式):直接输入 删除Watch:DEL
一.常用操作及快捷键
1. 程序编译:CTRL+F7 2. 建立可执行文件:F7 3. 运行程序(断点无效):CTRL+F5 4. 设置/取消断点(程序运行到断点处暂停): F9
vc程序怎么调试vc如何调试c程序vc调试vc6调试vc60调试vcdll调试vc远程调试vc单步调试vc6不能调试vc调试技巧
VC程序Байду номын сангаас试方法
一.常用操作及快捷键
1. 2. 3. 4. 程序编译:CTRL+F7 建立可执行文件:F7 运行程序(断点无效):CTRL+F5 设置/取消断点(程序运行到断点处暂停): F9

VC++6.0中如何能编译运行及调试C语言程序

VC++6.0中如何能编译运行及调试C语言程序

VC++6.0中如何编译运行调试C语言程序1.启动VC++6.0 (如下图)2.单个源文件的编译运行例如下面的源代码#include<stdio.h>void main(){ int i,sum=0;for(i=1;i<=10;i++){sum=sum+i;}printf("sum=%d\n",sum);}打开VC++6.0,如图1所示(图1)选择“文件”→“新建”,打开如图2所示(图2)选择“文件”项,如图3所示(图3)选择“C++ Source File”项,并在“文件名”项目下输入“sum.c”如图4所示(图4)单击“确定”,打开如图5所示(图5)输入如上源代码,如图6所示(图6)选择按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接)。

(图7)在下端的输出窗口会有错误和警告的提示,如果没有错误选择“执行”(或按Ctrl+F5组合键)即可出现运行结果,如图8所示(图8)3.多个源文件的编译运行以上是运行单个源文件的情况,但是在程序设计时,往往是由几个人各自独立编写不同的程序,显然这些程序是不能写在一起进行编译的,这时就需要建立项目工作区来完成几个独立程序的编译,具体方法如下。

首先建立两个文本文件,分别命名为“file1.c”和“file.c”,分别在两个文件中输入如下两个源代码,然后保存。

源代码1:#include<stdio.h>void main(){void sum();sum();}源代码2:#include<stdio.h>void sum(){int i,sum=0;for(i=1;i<=10;i++){sum=sum+i;}printf("sum=%d\n",sum);}打开VC++6.0,选择“文件”→“新建”打开如图9所示(图9)选择“工作区”项,并在“工作空间名称”项目下输入“sum”如图10所示(图10)单击“确定”,打开如图11所示(图11)在左侧的“工作区窗口”显示了新建立的工作区选择“文件”→“新建”打开如图9所示,在“工程”项目下选择“Win32 Console Application”项,并在“工程名称”项目下输入工程名称,如“sum”,选择“添加到当前工作空间”项,如图12所示(图12)单击“确定”,打开如图13(图13)选择“一个空工程”项,单击“完成”,打开如图14所示(图14)单击“确定”,打开如图15所示(图15)在左侧的“工作区窗口”显示了新建立的工程选择“工程”→“添加到工程”→“文件”,打开如图16所示(图16)选择刚刚创建的两个文件,单击“确定”,打开如图17所示(图17)选择“组建”→“组建”(或按F7键),打开如图18所示(图18)在下端的输出窗口会有错误和警告的提示,如果没有错误选择“组建”→“执行”(或按Ctrl+F5)即可出现运行结果,如图19所示(图19)4.如何快速地规代码缩进格式选中所需要规的代码,按Alt+F8。

如何使用VC++调试程序 VC调试快捷键 Debug版本与Release版本

如何使用VC++调试程序 VC调试快捷键 Debug版本与Release版本

1.如何在Release状态下进行调试Project->Setting=>ProjectSetting对话框,选择Release状态。

C/C++标签中的Category 选General,Optimizations选Disable(Debug),Debut info选Program Database。

在Link 标签中选中Generate debug info复选框。

注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。

2. Release和Debug有什么不同Release版称为发行版,Debug版称为调试版。

Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。

Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。

Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。

这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。

而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。

3. ASSERT和VERIFY有什么区别ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。

所以后者更安全一点。

例如ASSERT(file.Open(strFileName))。

一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。

VC调试方法

VC调试方法

VC所依赖的开发平台Microsoft Developer Studio本身提供的调试功能并不弱,每当我们创建一个新的VC工程项目时,默认状态就是Debug(调试)版本,在"组建"(Build)菜单下的Configurations中可以看到除了调试版本还可以设置成发行(Release)版本。

调试版本由于包含了大量信息,所以它生成的可执行程序容量会远远大于发行版。

具体地,调试版本主要增加了两个内容:其一,会执行编译命令_D_DEBUG,使头文件的调试语句ifdef及其代码附加到程序中;其二,在可执行文件中加入的调试信息使开发人员能够观察变量,进行单步执行等。

在VC"组建"(Build)菜单下的"开始调试"中有4条专用的调试命令:Go,Step into,Run to Cursor,Attach to process…。

在运行程序源代码时用Go命令(而不是Execute)才能处于调试状态, Go命令会使程序运行变得缓慢下来,但可以更好地控制运行程序,我们可以在任何时刻中断程序、单步执行、查看变量、检查调用栈。

有必要详细介绍一下VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC "查看"菜单的"调试窗口"中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。

VC release版本调试方法

VC release版本调试方法

读了老罗的“仅通过崩溃地址找出源代码的出错行”(下称"罗文")一文后,感觉该文还是可以学到不少东西的。

不过文中尚存在有些说法不妥,以及有些操作太繁琐的地方。

为此,本人在学习了此文后,在多次实验实践基础上,把该文中的一些内容进行补充与改进,希望对大家调试程序,尤其是release版本的程序有帮助。

欢迎各位朋友批评指正。

一、该方法适用的范围在windows程序中造成程序崩溃的原因很多,而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃。

如原文中举的除数为零的崩溃例子。

而笔者在实际工作中碰到更多的情况是:指针指向一非法地址,然后对指针的内容进行了,读或写的操作。

例如:void Crash1(){ char * p =(char*)100; *p=100;}这些原因造成的崩溃,无论是debug版本,还是release版本的程序,使用该方法都可找到造成崩溃的函数或子程序中的语句行,具体方法的下面还会补充说明。

另外,实践中另一种常见的造成程序崩溃的原因:函数或子程序中局部变量数组越界付值,造成函数或子程序返回地址遭覆盖,从而造成函数或子程序返回时崩溃。

例如:#include void Crash2();int main(int argc,char* argv[]){ Crash2();return 0;}void Crash2(){ char p[1];strcpy(p,"0123456789");}在vc中编译运行此程序的release版本,会跳出如下的出错提示框。

图一上面例子运行结果这里显示的崩溃地址为:0x34333231。

这种由前面语句造成的崩溃根源,在后续程序中方才显现出来的情况,显然用该文所述的方法就无能为力了。

不过在此例中多少还有些蛛丝马迹可寻找到崩溃的原因:函数Crash2中的局部数组p只有一个字节大小,显然拷贝"0123456789"这个字符串会把超出长度的字符串拷贝到数组p的后面,即*(p+1)=''1'',*(p+2)=''2'',*(p+3)=''3'',*(p+4)=4。

VisualStudio中的debug和release版本的区别

VisualStudio中的debug和release版本的区别

Visual‎Studio‎中的debu‎g和rele‎a se版本的‎区别Debug通‎常称为调试版‎本,它包含调试信‎息,并且不作任何‎优化,便于程序员调‎试程序。

Releas‎e 称为发布版‎本,它往往是进行‎了各种优化,使得程序在代‎码大小和运行‎速度上都是最‎优的,以便用户很好‎地使用。

Debug 和 Releas‎e的真正秘密,在于一组编译‎选项。

下面列出了分‎别针对二者的‎选项(当然除此之外‎还有其他一些‎,如/Fd /Fo,但区别并不重‎要,通常他们也不‎会引起 Releas‎e版错误,在此不讨论)Debug 版本参数含义/MDd /MLd或/MTd使用 Debug runtim‎e librar‎y (调试版本的运‎行时刻函数库‎)/Od 关闭优化开关‎/D "_DEBUG‎"相当于 #define‎_DEBUG‎,打开编译调试‎代码开关(主要针对as‎s ert函数‎)/ZI 创建 Edit and contin‎u e(编辑继续)数据库,这样在调试过‎程中如果修改‎了源代码不需‎重新编译/GZ 可以帮助捕获‎内存错误/Gm打开最小化重‎链接开关,减少链接时间‎Releas‎e版本参数含义/MD /ML 或/MT 使用发布版本‎的运行时刻函‎数库/O1 或/O2 优化开关,使程序最小或‎最快/D "NDEBUG‎"关闭条件编译‎调试代码开关‎(即不编译as‎s ert函数‎)/GF 合并重复的字‎符串,并将字符串常‎量放到只读内‎存,防止被修改实际上,Debug 和 Releas‎e并没有本质的‎界限,他们只是一组‎编译选项的集‎合,编译器只是按‎照预定的选项‎行动。

事实上,我们甚至可以‎修改这些选项‎,从而得到优化‎过的调试版本‎或是带跟踪语‎句的发布版本‎。

哪些情况下 Releas‎e版会出错有了上面的介‎绍,我们再来逐个‎对照这些选项‎看看 Releas‎e版错误是怎样‎产生的1、Runtim‎e Librar‎y:链接哪种运行‎时刻函数库通‎常只对程序的‎性能产生影响‎。

为VC6程序的Release版本添加调试信息

为VC6程序的Release版本添加调试信息

为VC6程序的Release版本添加调试信息为VC6程序的Release版本添加调试信息众所周知,VC6项目通常默认被分为两个编译版本:Debug和Release。

前者主要用于开发调试,后者用于对外发布。

绝大多数情况下,这个两个版本在功能上是完全一致的,只不过Debug版本多出了一些便于调试的特性。

但是在极少数情况下,Debug版本和Release版本程序运行结果不一样。

例如,在Debug版本下,程序运行正常,而在Release版本下,程序却可能非法退出。

因为Release版本程序不能设置断点,无法调试跟踪,因而很难找到问题的根源。

在这种情况下,为Release 版本增加调试信息,应该是不错的选择。

最近恰恰又遇到了这种情况,写出来给大家分享。

不过是对之前某本书(《编程高手谏言》?)或某篇文章中介绍的方法的翻版而已。

为VC6程序Release版本增加调试信息的具体操作方式如下:1、菜单Build->Configuration...,点击Add按钮,从Release 版本复制一个编译选项,命名为“Releasewithdebuginfo”,当然名称随意。

2、菜单Project->Settings...,在左上角选中刚才创建的“Releasewithdebuginfo”,然后修改以下内容:a、C++|Category:General:Optimizations设置为“Disable(debug)”;选中“Generatebrowseinfo”;DebugInfo 设置为“ProgramDatabase”。

b、Link|Category:General:选中“Generatedebuginfo”。

3、菜单Build->SetActiveConfiguration...,选中“Releasewithdebuginfo”。

经过以上配置之后,编译,即可得到“带调试信息的Release程序”,可设置程序断点,可跟踪调试。

VC6.0调试技巧

VC6.0调试技巧
• ③ 单步跟踪跳出子函数(Step Out,Shift+F11),按键后,程序运 行至当前函数的末尾,然后从当前子函数跳到上一级主调函数。
• ④ 运行到当前光标处 当按下CTRL+F10后。程序运行至当前光标处所在的语句。
• ① 设置断点的方法
可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后按F9快捷键或 者单击“编译”工具条上的按钮 ,断点处所在的程序行的左侧会出现一个红色圆点。
• ② 程序运行到断点 • 选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令的下一级的
“去(Go)”调试命令,或者单击“编译(Compile)”,程序执行到第一个断点处 程序将暂停执行,该断点处所在的程序行的左侧红色圆点上添加一个黄色箭头,此时, 用户可方便地进行变量观察。继续执行该命令,程序运行到下一个相邻的断点。参考 图2-9。
• ③ 取消断点 • 只需在代码处再次按F9或者单击“编译” 。也可以打开“Breakpoints”对话框后,按
照界面提示去掉断点。
• (4) 结束程序调试,返回程序编辑环境。 选择主菜单“Debug”中的“Stop Debugging”命令,或者单击“调试(Debug)” 工具条上的 按钮,或者单击Shift+F5键,可结束程序调试,返回程序编辑环境。
sual C++6.0环境后,选择主菜单“打开工作区(Open Workspace)”命令,在“Open Workspace”对话框内找到并选择 要打开的工作区文件myexam1.dsw,单击“确定(OK)”按钮,打 开工作区。
• 在左侧的工作区窗口,单击下方的 “FileView” 选项卡,选择文件 视图显示,打开“Source”文件夹,再打开要编辑的C源程序进行编 辑和修改。如图所示。

VC程序调试技术 转共8页文档

VC程序调试技术 转共8页文档

VC程序调试技术转VC程序调试技术[转]2019-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调试的一般过程调试,说到底就是在程序的运行过程的某一阶段观测程序的状态,而在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。

所以我们所做的第一项工作就是设立断点。

VC6使用手册

VC6使用手册

VC6.0调试知识大全收藏My Note○常用功能:1、Restart(Ctrl+shift+F5):此debugger功能将从程序的开始(第一有效行)处全速执行,而不是从当前所跟踪的位置开始调试,这时所有变量的当前值都将被丢弃,debugger会自动停在程序的main()开始处.这时如果选择Step Over(F10)就可以逐步执行main()函数了.2、Stop Debugging(Shift+F5):此debugger功能将终止(所有)调试,并返回到常规编辑状态.3、Break(此功能常常在遇到调用函数的语句时可见.):此功能将在调试过程中的debugger 当前位置挂起程序的执行,然后就可以在调试状态一修改程序的代码,接着可以用Apply Code Changes(Alt+F10)来应用修改的代码到正在调试的程序当中.如果,当前(需要,待)可以(从DOS等窗口)输入值,挂起后将不能再输入.4、Apply Code Changes(Alt+F10):此功能可以在程序正在调试程序过程中应用(挂起)修改后的源代码.如,选择Break功能并修改代码后,只要选择Apply Code Changes(Alt+F10)就能将修改后的代码应用到正在调试的程序当中.5、Show Next Statement(Alt+Num*):此功能将显示程序代码的下一条语句,如果源代码中找不到,则在Disassembly窗口中显示语句.当在Disassembly窗口中显示时,可以单击Disassembly 返回到源代码窗口.6、Step Into(F11):此功能可以单步进入到在调试过程中所跟踪的调用函数的语句的函数内部.如,当前语句是"d.Display()",选择Step Into(F11)后,Debugger将进入Display()函数内部并停在Display()函数内部的第一条语句上.(此时, 就可以Step Over(F10)对Display()函数进行单步调试了.)7、Step Over(F10):此功能可以单步对所在函数单步调试,如果调试的语句是一个调用函数的语句时,Debugger将全速执行所调用的函数,单步(一步)通过所调用的函数,Debugger停该调用语句的下一条语句上.8、Step Out(Shift+F11):此功能将使Debugger切换回全速执行到被调用函数结束,并停在该函数调用语句的下一条语句上.当确定所调用的函数没有问题时可以用这个功能全速执行被调用函数.9、Run to Cursor(Ctrl+F10):此功能将全速执行到包含插入点光标所在的行,可以作为在插入点光标处设置常规断点的一种选择.注意,当光标处不是一个有效的执行语句时此功能将不起作用.10、Go(F5):此功能将全速执行程序直到遇到一个断点或程序结束,或直到程序暂停等待用户输入.注意,此功能最能有效的调试循环,常将断点设置在循环体内,重复的按F5全速执行循环体可以测试循环过程中的产生的变化.Step Into Specific Function:此功能可以可以单步通过程序中的指令,并进入指定的函数调用,此功能对于函数的嵌套层不限.From 《visual C++ 6.0开发工具与调试》1、如何快速地规范代码缩进格式选中所需要规范的代码,按shift+F82、如何在Release状态下进行调试Project->Setting=>ProjectSetting对话框,选择Release状态。

VC调试

VC调试

选择Link页,选中复选框 "Generate Debug Info ",这个选项将使连接器把调试信息写进可执行文件和DLL
如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

Watch
VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。
3.上面两点已经能应付很多种情况了,但是有时候即使在debug下也不能下断点,我以前也曾经遇到过这种问题,一个调了4层的dll,就是不能下断点.其实还除了上面的方法,还有一种最底层的实现技术:使用汇编.
对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是:
弹出Project settings对话框
选择C/C++
Category选择Precompilation Header
选择不使用预编译头。
VERIFY 和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。
关注
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:

VC快捷键以及调试方法

VC快捷键以及调试方法

基本调试
• 使用断言
程序员可以把assert看成一个在任何系统状 态下都可以安全使用的无害测试手段。如 果程序在assert处终止了,并不是说含有 该assert的函数有错误,而是调用者出了 差错,assert可以帮助我们找到发生错误 的原因。 说明:aw导航中几乎不使用断言。
基本调试
• 高级断点设置方法
VC编辑命令
• 按下Alt 键不放,点击鼠标左键拖动,可以 选择文本块、可选择列。 • 按着Ctrl键不放,单击一个单词,可以选择 一个单词,或双击。 • 将光标移在开始位置,按住shift点击鼠标左 键可选择一段(在IE浏览其中照样可用,看 不到光标而已)
VC编辑命令
• 双击鼠标左键可选择一个单词。 • 按住shift+上下方向键可选择行。 • 按住 ctrl+shift+左右方向键 可选择一个单 词。 • 按Ctrl + C 可COPY光标所在的这一行。 • 按住shift+[End] 可选择本行
基本调试
• 使用断言
void *memcpy(void *pvTo, const void *pvFrom, size_t size) { assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言 byte *pbTo = (byte *) pvTo; // 防止改变pvTo的地址 byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址 while(size -- > 0 ) *pbTo ++ = *pbFrom ++ ; return pvTo; } assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和 Release版本引起差别,assert不应该产生任何副作用。所以assert不 是函数,而是宏。

使用VC6.0对C语言程序进行调试的基本手段

使用VC6.0对C语言程序进行调试的基本手段

使用VC6.0对C语言程序进行调试的基本手段(1)设置固定断点或临时断点所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况。

这些情况一般包括:①在变量窗口(Varibles)中观察程序中变量的当前值。

程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围。

例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414。

#include <stdio.h>#include <math.h>void main(){int x;printf("Please input x:");scanf("% d", &x);printf("cos(x)=%f\n", cos(x));}在该程序中,若你没有看到问题——程序较长、较复杂时很难看出问题所在,则应该使用调试手段定位故障位置。

②在监控窗口(Watch)中观察指定变量或表达式的值。

当变量较多时,使用Varibles 窗口可能不太方便,使用Watch窗口则可以有目的、有计划地观察关键变量的变化。

③在输出窗口中观察程序当前的输出与预期是否一致。

同样地,若不一致,则此断点前运行的程序肯定在某个地方有问题。

④在内存窗口(Memory)中观察内存中数据的变化。

在该窗口中能直接查询和修改任意地址的数据。

对初学者来说,通过它能更深刻地理解各种变量、数组和结构等是如何占用内存的,以及数组越界的过程。

⑤在调用堆栈窗口(Call Stack)中观察函数调用的嵌套情况。

此窗口在函数调用关系比较复杂或递归调用的情况下,对分析故障很有帮助。

(2)单步执行程序让程序被一步一步(行)地执行,观察分析执行过程是否符合预要求。

例如,以下程序预期的功能是从键盘上读入两个数(x和y),判断x和y是否相等,相等则在屏幕上显示x=y,不相等则显示x<>y。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

首先必须明确的是,什么是Release版程序,什么是Debug版程序
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

Debug 和Release 的真正秘密,在于一组编译选项。

下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起Release 版错误,在此不讨论)
Debug 版本
参数含义
/MDd /MLd 或/MTd 使用Debug runtime library (调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数) /ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本
参数含义
/MD /ML 或/MT 使用发布版本的运行时刻函数库
/O1 或/O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
实际上,Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。

OK,知道了这些,谁还会说RELEASE版本不能调试?
只需要设置相应编译环境,RELEASE同样可以像DEBUG版本设置断点,查看参数。

步骤如下:
1、在Project Settings里选Settings For为All Configurations。

2、在C/C++标签中,Debug info 选Program Database。

3、在Link 标签中,Category选Debug,选中Debug info 复选框和Microsoft format。

现在就可以像在Debug版本中那样设置断点进行测试了,但是记住,Release版本由于代码优化,有些变量是观察不到的,行的运行顺序可能也会不同。

还有一种就是使用debugview.exe进行调试(),这个是个好东西。

debugview.exe是用来显示debug信息的,而这个debug信息就是由我们自己的application所发出的。

我们可以看msdn上的关于debug的那些函数,一个比较有用的函数是OutputDebugString(LPCTSTR msg)。

用这个函数,我们就可以把调试信息往外发出,而debugview.exe就可以接收到。

这其实是windows的一个机制,说起来也是很简单的东西,其实他们之间的交互就是一个4K 大小的share memory,
object name object type
DBWinMutex Mutex
Section (shared
DBWIN_BUFFER
memory)
DBWIN_BUFFER_RE
Event
ADY
DBWIN_DATA_READ
Event
Y
通讯的过程也就靠了上面的一个锁,两个事件。

数据存在dbwin_buffer中。

结构如下:struct dbwin_buffer { DWORD dwProcessId; char data[4096-sizeof(DWORD)];};
share memory的机制大家都知道,这里也就不多说了。

相关文档
最新文档