VC调试技术

合集下载

VC程序调试.

VC程序调试.

VC程序调试VC程序调试调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。

不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。

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

在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go 程序会在执行到端点处停下来,如果要继续执行可以再选Go。

通过选择VC"工具"菜单下的"源浏览器"可以生成一个.BSC文件,使用浏览器可以从中发现多种信息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。

在使用微软程序开发库MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就是使程序具有"维护"性。

VC6.0调试方法

VC6.0调试方法

VC6.0调试⽅法
1.打开你要调试代码的⼯作空间。

2.按快捷键F5或点击以下图⽚上标记的图标进⼊调试模式。

3.打开调试⼯具条,⼀般情况下当你按F5键后会⾃动弹出,如果没有弹出的话,右击⼯具栏空⽩处,会弹出下图,选中调试,就会出现调试⼯具条。

4.接下来,在监视窗⼝中添加你要监视数据变化的变量。

5.按F11逐语句的调试代码,如果某⼀语句是⼀函数,你不希望进⼊该函数时,F10逐过程来查看,在代码的调试过程中,通过监视窗⼝查看变量值的变化,从⽽确定代码是否有问题。

6.如果希望跳出某⼀函数时,按快捷键Shift+F11,或者直接点击调试⼯具条上的按钮就可以跳出该函数了。

7.如果只是希望调试某⼀部分代码的话,可以设置断点来调试,调试⽅法如上,只是在要调试的代码之间⽤断点来分开。

设置断点时,光标放在你要设置断点的那⾏,按F9或点击编译微型条上⾯的类似⼿状的按钮即可。

VC调试

VC调试

VC调试入门概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。

不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件。

这里简要的根据经验列出调试中比较常用的技巧。

本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。

设置为了调试一个程序,首先必须使程序中包含调试信息。

一般情况下,一个从AppWizard 创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。

为了增加调试信息,可以按照下述步骤进行:∙打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)∙选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:∙选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL∙如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。

选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

断点断点是调试器设置的一个代码位置。

当程序运行到断点时,程序中断执行,回到调试行在线调试。

设置断点:可以通过下述方法设置一个断点。

首先把光标移动到需要设置断点的代码行上,然后∙按F9快捷键∙弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints 打开。

打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。

关于VC代码的编写和调试

关于VC代码的编写和调试

关于VC代码的编写和调试一、调试版本与发布版本有时程序能在调试版本运行但不能运行于发布版本,反之也有可能。

一般说来,一个发布版本意味着某些类型的优化,而一个调试版本则没有优化。

下面我们来看看它们的区别:1、特别针对调试版本的编译选项(1)/MDd,/MLd或者/MTd调试版本的运行时刻库有调试符号,使用了调试堆,调试堆的目的是发现内存破坏和内存泄漏,并且向用户报告源代码的哪个地方出了问题。

特性:.调试版本的运行时刻库对内存的分配作了跟踪,允许用户检查内存泄漏。

.在刚分配的内存里写上0xCD的字节模式,用0xCD来填充刚分配的内存,有助于发现数据未被初始化的错误。

.在被释放的内存写上0xDD的字节模式,有助于发现已被释放的内存。

.在缓冲区的两边分配了四字节的保护数据,并用0xFD的字节模式作初始化,来检查写内存的上溢出和下溢出。

.在每个内存分配的地方对源代码文件名和行号作了记录,有助于用户在源代码中对内存分配进行定位。

(2)/Od这个选项用来关闭优化开关。

因为未被优化的代码直接对应于源代码,所以比优化后的代码更容易读懂。

未被优化的代码编译和链接会更快,会有更短的调试周期。

而由于优化,发布版本不见得会比调试版本运行得好,优化代码要求编译器做一些假设,去除冗余,但有时这个假设是错误的,并且去掉的冗余也有可能隐藏错误。

如发布版本的帧指针(EBP寄存器)省略(FPO)隐藏了函数原型不匹配的错误;在同步异常模式(只能由throw语句抛出,编译器默认,由/GX编译选项设置)下,异常处理程序可能被优化掉,会阻止程序中的C++异常处理代码安全地捕获结构异常,在这种情况下,你必须使用异步异常模式(采取任何指令都会产生异常的机制,由/Eha编译选项设置)。

(3)/D “_DEBUG”打开条件编译调试代码开关。

只有这个符号被定义,调试代码才会被编译,MFC使用_DEBUG符号来确定到底链接的是哪个版本的MFC类库。

在调试版本中,内联默认情况下是被关闭的。

关于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 studio高效调试手段与技巧

visual studio高效调试手段与技巧

visual studio高效调试手段与技巧以下是一些提高在Visual Studio中调试的效率的手段和技巧:1. 使用断点:设置断点是最基本的调试技巧,可以在代码中设置断点,程序执行到断点处时会暂停执行,可以检查变量的值、调用堆栈等信息。

2. 条件断点:可以设置断点在满足特定条件时才会触发,可以通过右键单击断点并选择“条件”选项来设置条件。

3. 数据查看窗口:可以在调试过程中实时查看变量的值,可以通过将鼠标悬停在变量上或者在代码中插入watch表达式来查看变量的值。

4. 自动变量窗口:可以在断点处展开查看变量的值,也可以通过选择变量并点击右键选择"Add to Auto's"将其添加到自动变量窗口中。

5. 输出窗口:可以使用输出窗口来向控制台打印输出信息,可以使用Debug类中的方法如Debug.WriteLine()或者在代码中使用System.Diagnostics.Debug.WriteLine()来输出调试信息。

6. 即时窗口:可以在调试过程中临时执行一些代码,可以在即时窗口中输入表达式,可以检查变量的值、调用函数等。

7. 异常窗口:可以捕获和处理异常,可以在调试过程中查看程序中的异常信息。

8. 调试启动选项:可以在调试过程中选择以不同的方式启动程序,如选择启动应用程序或选择附加到进程。

9. 追踪点:可以设置追踪点,当程序运行到追踪点时,会以消息框的形式显示追踪点的信息。

10. 单步调试:可以使用单步调试功能逐行执行代码,可以逐过程调试、逐语句调试等。

11. 查找调用层次:可以使用“调用层次窗口”或者“调用栈窗口”来查看方法的调用层次信息。

12. 保存调试状态:可以在调试过程中保存断点和调试信息的状态,可以在下一次打开解决方案时恢复调试状态。

希望这些技巧能帮助您提高在Visual Studio中的调试效率。

VC调试技巧之断点

VC调试技巧之断点
例如:在Main.c的第100行设一个位置断点,而test1.dll和test2.dll都使用了该行,但只想在test1.dll的调用中启动断点,具体用法如图6
图6
图3
当MMI_fixed_matrix_menu.highlighted_row的值发生改变时,就会弹出警告框(如图4)并把程序停到改变该变量值的地方(如图5)
图4
图5
若想知道变量是在何处被改为某个特定值,此时可将断点条件改为“MMI_fixed_matrix_menu.highlighted_row==0”,当条件满足时,断点启动。
此外,还可以利用数据断点跟踪数组的越界导致覆盖其他变量等十分棘手的问题。
3.消息断点(MESSAGE BREAKPOINT)
该断点用得很少,且一般可以用上述两种断点替代。
4.高级断点
高级断点的语法由两部分组成:1.上下文(CONTEXT)-----即函数,源文件,可执行文件
2.变量,表达式或绝对位置
int tmp = getValue();// A行
res /= tmp;//B行
}
return res;
}
运行代码,发现程序崩溃于B行,原因是tmp的值为0了,此时就需要在A行设置一个断点,然后进入getValue函数内部中查看运行状态。由于断点在循环体内,可能需狂按F5几百次。使用位置断点的断点跳跃就可以大大减少体力劳动。
VC调试技巧之断点
1.位置断点(LOCATION BREAKPOINT)
在代码中按F9设置一个位置断点,然后按F5运行,是最常用的断点方式,但是遇到如下代码时,就十分头疼了。
int test(void)
{
int i = 0, res=99999999999;

VCMFC调试技术

VCMFC调试技术

VCMFC调试技术VC/MFC调试技术(上)在VC程序中使用调试语句为了更好地对程序调试,可以使用如下方法:使用断言、使用跟踪语句、使用异常和返回值。

一、断言1、基本概念断言是一种让错误在运行时候自我暴露的简单有效实用的技术。

它们帮助你较早较轻易地发现错误,使得整个调试过程效率更高。

断言是布尔调试语句,用来检测在程序正常运行的时候某一个条件的值是否总为真,它能让错误在运行时刻暴露在程序员面前。

使用断言的最大好处在于,能在更解决错误的发源地的地方发现错误。

断言具有以下特征:.断言是用来发现运行时刻错误的,发现的错误是关于程序实现方面的。

.断言中的布尔表达式显示的是某个对象或者状态的有效性而不是正确性。

.断言在条件编译后只存在于调试版本中,而不是发布版本里。

.断言不能包含程序代码。

.断言是为了给程序员而不是用户提供信息。

使用断言最根本的好处是自动发现许多运行时产生的错误,但断言不能发现所有错误。

断言检查的是程序的有效性而不是正确性,可通过断言把错误限制在一个有限的范围内。

当断言为假,激活调试器显示出错代码时,可用Call Stack命令,通过检查栈里的调用上下文、少量相关参数的值以及输出窗口中Debug表的内容,通常能检查出导致断言失败的原因。

_A SSER TE 宏(属于C运行时间库)还能在断言失败时显示出失效断言。

下面我们讨论一下MFC库中的断言。

2、MFC库中的断言(1) A SSER T(布尔表达式)用MFC时最好选择A SSER T宏,它的优点是即使出现了WM_QU IT消息也能显示断言失效消息框。

(2) V ERIFY(布尔表达式)VERIFY宏中的布尔表达式在发布版本中被保留下来。

VERIFY宏简化了对函数返回值的检查,一般用来检查Wi ndows A PI 的返回值。

由于VERIFY宏里的布尔表达式在发布版本里保留了下来,因此最好尽量不要使用这个宏以实现程序代码和调试代码的完全分离。

VC程序调试技术 转

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

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

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

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

visual studio高效调试手段与技巧

visual studio高效调试手段与技巧

visual studio高效调试手段与技巧在使用Visual Studio进行调试时,可以采取一些技巧和方法来提高调试效率。

下面是一些常用的高效调试手段和技巧:1. 设置断点:断点是调试一个程序最常用的工具之一。

在需要调试的代码行上设置断点,程序运行时会暂停在该断点处,可以查看并分析变量的值、检查代码执行流程等。

可以使用条件断点来在满足特定条件的情况下暂停程序的执行。

断点的设置可以通过点击代码行左侧的空白处或使用快捷键“F9”来完成。

2. 条件断点:通过条件断点可以更精确定位到问题发生的条件和位置。

在设置断点时,可以右键点击断点,在“条件”选项中输入条件表达式,当该条件满足时程序会暂停执行。

3. 数据窗口:数据窗口是一个非常有用的工具,可以通过它查看变量和表达式的值,甚至可以在调试状态下修改变量的值。

在调试状态下,可以通过快捷键“Ctrl + Alt + W, 1”来打开数据窗口,然后可以输入需要查看的变量名或表达式,以获取相关的值。

4. 自动变量窗口:自动变量窗口会显示当前调试上下文中的所有自动变量,可以通过快捷键“Ctrl + Alt + V, L”来打开自动变量窗口。

这对于查看局部变量的值非常有用。

5. 即时窗口:即时窗口可以在调试过程中通过交互式的方式执行一些代码,可以输入变量名、表达式或函数调用来查看相应的返回值。

可以通过快捷键“Ctrl + Alt + I”打开即时窗口。

6. 调试输出窗口:通过在代码中插入调试输出语句,可以将一些调试信息输出到调试输出窗口中。

可以使用“System.Diagnostics.Debug.WriteLine()”来输出调试信息,然后在调试过程中可以查看输出的信息,帮助我们分析代码的执行情况。

7. 追踪点:追踪点是另一种不需要暂停程序执行的调试技巧。

与断点不同,设置追踪点不会暂停程序的执行,而是在满足条件时输出调试信息。

可以通过在代码中使用“System.Diagnostics.Trace.WriteLine()”来设置追踪点,在调试输出窗口中可以看到相关的调试信息。

VC调试方法大全

VC调试方法大全

VC调试方法大全VC调试方法大全一、调试基础调试快捷键F5:开始调试Shift+F5: 停止调试F10:调试到下一句,这里是单步跟踪F11:调试到下一句,跟进函数内部Shift+F11: 从当前函数中跳出Ctrl+F10: 调试到光标所在位置F9:设置(取消)断点Alt+F9: 高级断点设置跟踪调试1、尽量使用快捷键时行调试2、观察调试信息3、高级中断设置异常调试重试->取消->调试函数堆栈,用variables或者call stack 窗口Release调试1、经常测试你的Debug和Release版本2、不要移除调试代码,如用ASSERT, TRACE等。

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

VC调试技术

VC调试技术

VC程序调试
调试工具 查看工具 高级调试技术
使用查看工具
程序停下来后,可以利用工具查看变量、堆栈、 内存等 1 1、弹出式信息: : 方法:鼠标停在变量,或者选中的表达式上即 可弹出 2、变量窗口: 菜单view/debug windows/variables,或右击 菜单右边空格处选择 有auto、locals、this三个选项卡(3类型)
VC程序调试
调试工具 查看工具 高级调试技术
高级调试技术
1、TRACE宏 例子:TRACE( "Integer = %d, String = %s\n", i, sz ); 支持可变参数(类似printf()函数),一次最多512 个 字符 ,输出的内容会出现在最下方的output窗口 2、ASSERT宏 例子:ASSERT( pcage!= NULL ) ,参数是逻辑表达式, 若为真不起作用,为假,弹出对话框警告,作abort、 igore、retry选择其一。 在debug版本起作用,release版本不起作用
VC程序调试
调试工具 查看工具 高级调试技术
VC程序调试
调试工具 查看工具 高级调试技术
调试工具-工程的调试属性
1、工程的调试属性 (1)Debug版本:包含调试信息,不进行代码优 化,程序调试时用,文件大,放在debug目录下 (2)Release版本:开发完成后,程序发行时, 需编译成Release版本,不包含调试信息,对 代码进行优化,文件小,放在release目录下 2、如何设置: 菜单project/settings…/ 注意:工程生成时缺省设置是debug
使用查看工具
3、观察窗口(watch):查看添加的变量和表达 式,可以改变变量的值 view/debug windows/watch 菜单view/debug windows/watch,或右击菜单 右边空格处选择 4、内存窗口:输入地址,查看内存 菜单view/debug windows/memory,或右击菜 单右边空格处选择 5、寄存器窗口:查看寄存器 菜单view/debug windows/registers,或右击菜 单右边空格处选择

C语言程序调试实用技巧

C语言程序调试实用技巧

C语言程序调试实用技巧C语言程序调试实用技巧:C语言程序的调试是程序员日常工作中不可或缺的一部分,技术水平的高低也往往在调试过程中展现。

下面我将介绍几种实用的技巧,帮助程序员提高C语言程序的调试效率和质量。

1. 使用断点调试:在程序中设置断点可以帮助程序员在特定位置暂停程序的执行,观察变量的值或代码的执行顺序。

在调试过程中,通过设置断点可以方便地查找程序中的问题,快速定位bug所在的位置。

2. 输出调试信息:在程序中添加一些输出语句可以帮助程序员跟踪程序的执行过程,打印变量的值或特定条件的判断结果。

通过输出调试信息,可以更清楚地了解程序运行时的状态,有助于发现问题并对程序进行调试。

3. 利用调试工具:C语言常用的调试工具有gdb、valgrind等,这些工具提供了丰富的调试功能,如查看变量的值、跟踪函数调用栈、检测内存泄漏等。

熟练掌握调试工具的使用方法,可以让程序员更高效地进行调试工作。

4. 分块调试:将复杂的程序分成小块进行调试,先验证每个小模块的正确性,再逐步将小模块组合在一起,最终验证整个程序的正确性。

通过分块调试,可以降低调试的难度和复杂度,更快地找到bug并进行修复。

5. 修改逻辑错误:在调试过程中,可能遇到的问题不仅仅是语法错误或者内存泄漏,还包括逻辑错误。

逻辑错误往往更难察觉和定位,需要程序员仔细思考和调试。

当遇到逻辑错误时,可以通过添加输出语句、重新审视代码逻辑,甚至请同事进行代码审查等方式来解决问题。

6. 清晰注释代码:在调试过程中,清晰且详细的注释是非常重要的。

通过注释,可以帮助程序员更快地理解代码的逻辑和实现,有助于发现潜在的问题。

在调试完成后,及时更新和完善注释,方便后续维护和调试工作。

以上是几种实用的C语言程序调试技巧,希望可以帮助程序员提高调试效率,更快地定位和解决问题,提升程序的质量和稳定性。

在日常工作中,不断积累调试经验和技巧,不断提升自己的调试能力是程序员必备的素质之一。

VS的10个调试技巧

VS的10个调试技巧

Visual Studio原生开发的10个调试技巧最近碰巧读了Ivan Shcherbakov写的一篇文章,《11个强大的Visual Studio调试小技巧》。

这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧。

我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧。

(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧:1. 异常中断| Break on Exception2. Watch窗口中的伪变量| Pseudo-variables in Watch Windows3. 符号越界后查看堆对象|4. 查看数组的值5. 避免进入不必要的函数6. 从代码启动调试器| Launch the debugger from code7. 在Output窗口打印8. 隔离内存泄漏9. 调试发行版| Debug the Release Build10. 远程调试技巧1:异常中断在处理被调用之前,异常发生时可以启动调试器进行中断,可以让你在异常发生后立即调试程序。

操作调用栈便于你去查找异常发生的根本原因。

Vistual Studio允许你去指定想要中断的异常类型或者特殊异常。

选择菜单Debug>Exceptions弹出对话框,你可以指定原生的(或者托管的)异常,除了调试器自带的一些默认异常,你还可以添加自己的自定义异常。

下面是一个std::exception 异常抛出时调试器中断的例子。

∙1.异常抛出时如何中断∙2.如何添加新的异常技巧2:Watch窗口中的伪变量Watch窗口或QuickWatch对话框提供一些特定的(调试器可识别的)变量,被称为伪变量。

文档包含以下:∙$tid—–当前线程的线程ID∙$pid——进程ID∙$cmdline———-启动程序的命令行字符串∙$user———-正在运行程序的账户信息∙$registername—–显示寄存器registername 的内容不管怎么样,关于最后一个错误的伪变量是非常有用的:∙$err——–显示最后一个错误的错误码∙$err,hr—显示最后一个错误的错误信息技巧3:符合越界后查看堆对象有时候,在调试符号越界后,你还想查看对象的值,这个时候,watch窗口中的变量是被禁用的,不能再查看(也不能更新),尽管对象仍然存在。

c程序调试方法以及常见错误

c程序调试方法以及常见错误

目录使用VC6.0对C语言程序进行调试的基本手段 (2)(1)设置固定断点或临时断点 (2)(2)单步执行程序 (2)(3)使用断言 (3)(4)与调试相关的操作菜单:Build菜单 (4)(5)与调试相关的操作菜单:Debug菜单 (4)VC6.0常见编译错误提示 (6)(1)error C2001: newline in constant (6)(2)error C2015: too many characters in constant (6)(3)error C2137: empty character constant (6)(4)error C2018: unknown character '0x##' (6)(5)error C2041: illegal digit '#' for base '8' (6)(6)error C2065: 'xxxx' : undeclared identifier (7)(7)error C2086: 'xxxx' : redefinition (7)(8)error C2374: 'xxxx' : redefinition; multiple initialization (7)(9)C2143: syntax error : missing ';' before (identifier) 'xxxx' (8)(10)error C4716: 'xxx' : must return a value (8)(11) warning C4508: 'main' : function should return a value; 'void' return typeassumed (8)(12)warning C4700: local variable 'xxx' used without having been initialized (8)VC60.0常见链接错误 (10)(1)error LNK2001: unresolved external symbol _main (10)(2)error LNK2005: _main already defined in xxxx.obj (10)使用VC6.0对C语言程序进行调试的基本手段(1)设置固定断点或临时断点所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况。

第4章 Visual C++调试技术

第4章  Visual C++调试技术

4.3.6 寄存器窗口
在调试过程中,有时需要查看或修改寄存器中的值。 在调试过程中,有时需要查看或修改寄存器中的值。Visual C++提供了寄存器窗口来完成这项工作。 提供了寄存器窗口来完成这项工作。 提供了寄存器窗口来完成这项工作
4.3.7 调用堆栈窗口
首先读者应该了解什么是调用堆栈。假设有这样几个函数, 首先读者应该了解什么是调用堆栈。假设有这样几个函数, 分别是function1()、function2()、function3(),且 分别是 、 、 , function1()调用 调用function2(),function2()调用 调用function3()。 调用 , 调用 。 运行过程中, 在function3()运行过程中,可以从当前堆栈中了解到调用 运行过程中 它的那几个函数分别是谁。 它的那几个函数分别是谁。把函数的顺序关系看做为 function3()、function2()、function1(),这样呈现出一种 、 、 , 堆栈”的特性,最后被调用的函数位于最上方, “堆栈”的特性,最后被调用的函数位于最上方,因此 称这种关系为调用堆栈。 称这种关系为调用堆栈。
ASSERT宏 4.4.2 ASSERT宏
ASSERT宏在调试程序过程中也经常用到,使用它可以对某 宏在调试程序过程中也经常用到, 宏在调试程序过程中也经常用到 一条件进行判定,如果条件为真,程序将继续执行, 一条件进行判定,如果条件为真,程序将继续执行,如 果条件为假,系统将弹出一个警告对话框, 果条件为假,系统将弹出一个警告对话框,并终止运行 。ASSERT宏主要用来判断程序中是否出现了明显的非法 宏主要用来判断程序中是否出现了明显的非法 数据,如果出现了, 数据,如果出现了,将会终止程序运行以免导致严重后 同时也便于查找错误。 果,同时也便于查找错误。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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窗口),而右面的我们称之为“手动监视区”。

(即watch窗口)自动监视区是系统自动跟踪的变量名。

系统默认显示auto标签,那是显示在上一步执行过程中,程序中发生改变的变量。

locals标签跟踪的是某一个函数中的所有变量。

上面的find sourse组合框中指示的是当前在locals标签下在跟踪的变量是属于哪一个函数的。

说明:当find sourse组合框中的内容变成灰色时,说明系统正在运行程序,或者等待输入端的数据(通常会是这个情况),此时应当注意程序执行窗口中的内容。

然而通常仅仅只有自动监视区所监视的变量是不够的,有时我们需要自己定义一些需要跟踪的变量——这个时候我们就要在手动监视区中输入变量名(也可以是系统认为合法的表达式)来跟踪我们需要的值。

注意:当用户定义了一个指向数组的watch之后,在变量的左边会出现一个小的'+'号,表示这个数组可以“展开”——显示其中每一个下标所指示的内容,这与其他高级语言的IDE有些不同。

值得一提的是VC++的一个人性化设置:在用户定义的变量很多时,往往需要通过滚屏才能看到所有的变量——VC++在手动监视区中设定了4个标签以方便用户的使用,在这四个标签的功能是一样的!断点的设置与一些基本的调试技巧。

断点(breakpoint)是指在调试过程中,只要运行到断点处,系统就会自动停下(除非是使用bulidexcute命令,但那是在执行编译好的代码,在严格意义上说,这不能算是一个调试命令),通常和go命令和step over命令配合在一起使用。

设置断点的方法:在程序代码中,移动到需要设置断点的那一行上,按F9键,你可以看到代码行的左端出现了一个红色的圆点——那是VC++中断点的标志,以后程序在调试过程中,每次执行到这里,都会停下,方便用户观察watch中的内容。

去除断点的命令与设置断点的命令相同:在已设置断点的地方,再按一次F9键,左端的红色圆点就消失,断点被去除了。

有的时候,我们并不是不需要断点,而是“暂时”不需要它,这时可以在已设置断点的地方,按Ctrl+F9键,你可以看到原本实心的圆点变成了一个空心的圆圈——断点暂时失效了。

恢复断点功能也是按Ctrl+F9。

这个功能在程序很长,需要很多断点的时候尤其有用。

条件断点技术——其实就是在一些分支语句内部设置断点,这个技术很实用,尤其在程序的某个分支部分发生问题的时候。

关于断点设置在哪里。

这可以说是因人而异,而且是一个相当有艺术性的内容,我不想多说什么,但是有一个基本的原则就是,不要连续设置断点,所谓断点,也可以说是“段”点,在需要连续观察的地方,应当使用step over或者step into命令。

好了,调试命令基本上就是这些,下面我想谈谈我个人在调试过程中的一些心得和体会:1.动态调试不是万能的。

虽然动态调试能解决几乎所有的非算法性的问题,但是动态调试要消耗大量的时间这点也是无庸质疑的——而且会扰乱编程者的思路。

其实相当多的错误往往只是因为键盘按错(“手误”)导致的。

这种错误在动态调试中很难发现,所以对于每一个程序,在要开始进行调试前,都应当再整理一遍思路,仔细地通读一遍程序,用所谓的“静态查错”的方法先将一些显而易见的低级错误先解决掉,同时也可以确定调试的重点。

这样做可以大大缩短调试时间,同时能使自己更容易发现一些思路方面的错误。

2.调试时思路要跟着程序转。

说白了就是要集中精力于正在调试的语句段和正在变化的变量上。

3.模块化能有效缩短调试时间。

其实模块化不仅仅能有效的缩短开发时间,更能有效的缩短调试时间。

首先,模块化使得我们够方便的使用step over命令,而减少断点的设置。

其次,程序出错的地方往往就是在几个关键点上,使用了模块化设计思路以后,我们就可以集中精力在那些关键点上,省去了不必要的单步调试。

当然,能面向对象就更好了。

4.多用断点和run to cursor命令,减少单步调试的使用——那样太费时间了。

5.调试不要破坏程序的原本结构。

许多人喜欢在调试过程中输出一些中间变量的值,认为这样做比较直观——当然,这也是一个很重要的手段,尤其在反复递归和循环嵌套的时候。

不过我不推荐在非递归的程序中使用这种方法。

这种方法最大的问题就是破坏了程序原本的结构和逻辑,除非你在原本程序设计时就想到这一点。

这点在程序很长或者思路很复杂时尤为明显。

否则为什么所有的编译模式的程序语言都不约而同的提供了watch这一手段?解释模式的程序语言?那是没有办法……6.遇到bug时不要急于修改程序。

也就是不要乱打补丁。

道理和第5条一样,要先仔细分析,然后在决定是否要修改——总之,要冷静。

尤其是删除程序段的时候,我建议先把认为不需要的程序段先注释掉。

等到调试成功后再删不迟。

VC++6.0调试工具简介一、启动Debug工具在主菜单Build中,有一个Start Debug子菜单,包含了以下4个菜单:●Go:从当前语句开始执行程序直到遇到断点或遇到程序结束。

●Step Into:单步执行程序;在遇到函数调用时,进入函数内部并从子函数头开始单步执行。

●Run to Cursor:调试运行程序时,使程序运行到光标所在的行时停止,事实上,这相当于设置一个临时断点。

●Attach to Process:调试过程中直接进入到正在运行的进程中。

二、Debug菜单启动调试器后,Debug菜单将取代Build菜单出现在菜单栏中,Debug菜单中含有调试过程经常要用到的命令菜单项。

●Go:用于在调试过程中,从当前语句启动或继续运行程序。

执行时,程序会一直正常运行,直到到达断点处停止。

这样,在调试过程中,就可以越过某些已知正确或不感兴趣的程序段,从而提高调试速度。

●Restart:调试过程中,我们经常会进行一种循环操作,首先找到一条错误的语句,接着对其做某些修改,然后再从头开始对程序进行调试执行,从而确定刚刚修改的语句是否按预期的结果执行。

此时,就可以使用Restart菜单项。

选择该菜单项,系统重新编译程序并放弃当前的所有值。

●Stop Debugging:中断调试过程,返回正常的编辑状态。

●Breaks:在当前位置暂停程序运行。

●Apply Code Change:调试过程中,将所修改的代码加入到源文件中。

●Step Into:调试过程中单步执行程序,而且当程序执行到某一函数调用时,进入函数内部,从头开始单步执行。

●Step Over:调试过程中单步执行程序,但当程序执行到某一函数调用时,不进入函数内部,直接执行完该函数,接着再执行调用函数语句后的语句。

●Step Out:该菜单项和Step Info配合使用,当执行Step Into语句进入函数内部时,若发现并不需要对该函数的内部进行单步执行,就可以使用Step Out菜单项,使程序直接向下执行,直到从该函数内部返回,在该函数调用语句后面的语句处停止。

●Run to Cursor:调试运行程序时,使程序运行到光标所在的行时停止,事实上,这相当于设置一个临时断点。

●Step Info Specific Function:单步执行选定的函数。

●Exceptions:显示与当前程序有关的所有异常,可以控制调试器如何处理系统异常和用户自定义异常。

●Threads:显示调试过程中的所有线程,可以挂起或恢复线程并设置焦点。

●Modules:显示当前装入的所有模块。

●Show Next Statement:显示即将执行的代码行。

●Quick Watch:查看及修改变量和表达式或将变量和表达式添加到观察窗口。

三、如何利用断点如果只对程序中的某一段代码进行调试,而对于在它之前的那些程序段并不感兴趣,此时就可以设置断点了。

设置断点有三种方法:●将光标移动到需要调试的程序代码行,单击鼠标右键选择Insert/RemoveBreakpoints菜单项。

●将光标移动到需要调试的程序代码行,单击键盘上的F9键。

●将光标移动到需要调试的程序代码行,单击主菜单中的Edit菜单,选择Breakpoints菜单项,在弹出的对话框中即可设置断点的位置和一些其他的属性。

设定断点后在代码行的前面出现了一个棕色的圆,表明此代码行处有一个断点。

如果调试程序时,有一个断点暂时不需要了,可在此断点处单击鼠标右键,在弹出的快捷菜单中选择Disable Breakpoint项,使得断点无效。

此时断点变成了一个空心的圆,但并未删除此断点。

当需要时在断点处单击鼠标右键,选择Enable Breakpoint菜单项,可恢复断点。

设置完断点后,若调试器尚未启动,单击Debug菜单中Start Debug子菜单中的Go 菜单项,或单击Build Mini Bar工具栏中的Go按钮,或直接按F5键,即可运行程序到所遇到的第一个断点处。

若调试器已经启动,单击Debug菜单中的Go菜单项,或单击Build Mini Bar工具栏中的Go按钮,或直接按F5键,即可运行程序到所遇到的第一个断点处。

相关文档
最新文档