VC调试技巧
vc6调试技巧
vc6调试技巧难怪很多前辈说调试是⼀个程序员最基本的技能,其重要性甚⾄超过学习⼀门语⾔。
不会调试的程序员就意味着他即使会⼀门语⾔,却不能编制出任何好的软件。
我以前接触的程序⼤多是有⽐较成形的思路和⽅法,调试起来出的问题都⽐较⼩,最近这个是我⾃⼰慢慢摸索调试,接触了很多新的调试⽅法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下:VC调试篇设置为了调试⼀个程序,⾸先必须使程序中包含调试信息。
⼀般情况下,⼀个从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可以选择。
选中这个选项,将使程序可以在上⼀次编译的基础上被编译(即增量编译),⽽不必每次都从头开始编译。
调试⽅法:1、使⽤ Assert(原则:尽量简单)assert只在debug下⽣效,release下不会被编译。
2、防御性的编程3、使⽤Trace4、⽤GetLastError来检测返回值,通过得到错误代码来分析错误原因5、把错误信息记录到⽂件中位置断点(Location Breakpoint)⼤家最常⽤的断点是普通的位置断点,在源程序的某⼀⾏按F9就设置了⼀个位置断点。
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语句,其作用就是使程序具有"维护"性。
VSCode调试C程序教程
VSCode调试C程序教程在编写和调试C程序时,一个好的集成开发环境(IDE)可以大大提高效率和准确性。
Visual Studio Code(简称VSCode)是一个流行的跨平台IDE,其强大的调试功能使得调试C程序变得更加简单和高效。
本教程将指导您如何使用VSCode调试C程序。
1. 安装VSCode及必要的插件首先,您需要从VSCode官方网站(https:///)下载并安装VSCode。
安装完成后,打开VSCode并转到扩展市场。
在搜索框中输入"C/C++",然后选择Microsoft提供的"C/C++"插件并安装。
该插件将为您提供调试C程序所需的基本功能。
2. 创建C项目在VSCode中创建一个新的C项目非常简单。
打开命令面板(Ctrl+Shift+P),输入"shell",选择"Shell: Greate new shell with current file"。
输入项目名称,并选择文件夹保存该项目。
VSCode将自动为您创建一个新的C项目。
3. 配置调试环境在VSCode的侧边栏中,找到并打开刚创建的C项目文件夹。
在文件夹中创建一个名为".vscode"的新文件夹,并在其中创建一个名为"launch.json"的文件。
打开"launch.json"文件,并添加以下配置:```json{"version": "0.2.0","configurations": [{"name": "C Debug","type": "cppdbg","request": "launch","program": "${workspaceFolder}/a.out","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true}]}```此配置将告诉VSCode以C++调试器的方式来调试C程序,并设置程序的入口为编译后的可执行文件"a.out"。
VC6.0调试方法
VC6.0调试⽅法
1.打开你要调试代码的⼯作空间。
2.按快捷键F5或点击以下图⽚上标记的图标进⼊调试模式。
3.打开调试⼯具条,⼀般情况下当你按F5键后会⾃动弹出,如果没有弹出的话,右击⼯具栏空⽩处,会弹出下图,选中调试,就会出现调试⼯具条。
4.接下来,在监视窗⼝中添加你要监视数据变化的变量。
5.按F11逐语句的调试代码,如果某⼀语句是⼀函数,你不希望进⼊该函数时,F10逐过程来查看,在代码的调试过程中,通过监视窗⼝查看变量值的变化,从⽽确定代码是否有问题。
6.如果希望跳出某⼀函数时,按快捷键Shift+F11,或者直接点击调试⼯具条上的按钮就可以跳出该函数了。
7.如果只是希望调试某⼀部分代码的话,可以设置断点来调试,调试⽅法如上,只是在要调试的代码之间⽤断点来分开。
设置断点时,光标放在你要设置断点的那⾏,按F9或点击编译微型条上⾯的类似⼿状的按钮即可。
简述调试c程序的基本步骤
简述调试c程序的基本步骤调试C程序的基本步骤调试是软件开发过程中非常重要的一环,它有助于发现和解决程序中的错误,确保程序的正确性和稳定性。
本文将简要介绍调试C程序的基本步骤。
1. 理解程序的逻辑在开始调试之前,首先要对程序的逻辑进行充分理解。
了解程序的预期功能、输入输出以及各个模块之间的关系,有助于更好地定位问题。
2. 编译程序时开启调试模式在编译C程序时,可以通过添加调试选项来开启调试模式,以便在运行时能够获取更多的调试信息。
一般可以使用-G选项来开启调试模式,例如:```gcc -g main.c -o program```3. 使用调试工具调试工具是调试C程序的重要辅助手段。
常见的调试工具包括GDB (GNU调试器)和LLDB(LLVM调试器)。
这些工具提供了一系列命令和功能,可以帮助我们跟踪程序的执行过程、查看变量的值、设置断点等。
4. 设置断点断点是调试程序时经常使用的功能,它能够在程序执行到指定位置时暂停程序的执行。
通过设置断点,我们可以逐步调试程序,查看每一步的执行情况。
在GDB中,可以使用break命令来设置断点,例如:```break main.c:10```这样就在main.c文件的第10行设置了一个断点。
5. 执行程序在设置好断点后,可以执行程序并观察程序的执行情况。
当程序执行到断点处时,会暂停执行并进入调试模式,此时可以使用调试工具提供的命令来查看程序的状态。
6. 查看变量的值在调试过程中,经常需要查看变量的值来判断程序的执行情况。
调试工具可以提供命令来查看变量的值,例如在GDB中,可以使用print命令来查看变量的值,例如:```print x```这样就可以查看变量x的值。
7. 单步执行程序单步执行是调试程序时常用的功能之一,它可以逐行地执行程序,并观察每一行的执行情况。
在GDB中,可以使用next命令来进行单步执行,例如:```next```这样就会执行下一行的代码。
vc++6.0_调试详细教程(17种方法)
vc++6.0 调试详细教程Step intoStep overStep outRun to cursorWatchVariablesRegistersMemoryStop DebugCall stackDisassemblyRestart Debugger2、调试的一般过程调试,就是在程序的运行过程的某一阶段观测程序的状态。
在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。
我们所做的第一项工作就是设立断点;其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。
程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向。
下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。
3、设置断点在VC中,可以设置多种类型的断点,根据断点起作用的方式把这些断点分为三类:1、与位置有关的断点;2、与逻辑条件有关的断点3、与WINDOWS消息有关的断点。
主要介绍前面两种断点。
4、设置位置断点最简单的是设置一般位置断点:¡ 把光标移到你要设断点的位置,当然这一行必须包含一条有效语句的;¡ 然后按工具条上的add/remove breakpoint 按钮或按快捷键F9。
将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这里设立了一个断点5、设置位置断点-图示6、设置逻辑断点有的时候可能不需要程序每次运行到这儿都停下来,而是在满足一定条件的情况下才停下来,这时就需要设置一种与位置有关的逻辑断点。
从EDIT 菜单中选中Breakpoints命令,这时Breakpoints对话框将会出现在屏幕上。
选中Breakpoint对话框中的Location标签,使Location页面弹出。
如下页图所示。
7、8、设置逻辑断点单击上页Condition按钮,弹出Breakpoint Condition对话框,在expression_r编辑框中写出你的逻辑表达式,最后按OK返回。
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和CDB调试研究(OPNET和VC联调)
VC调试环境变量配置完全以后。
在ODB中联调vc的做法如下:1.打开ODB.2.将vc调试器附着到op_runsim_dev进程3.在vc中打开进程模型代码,或者管道代码,设置断点。
4.在ODB中通过ODB断点控制,将仿真推进到触发代码断点的事件。
5.切换到VC调试器,在断点之后继续跟踪调试说明:1.1和4步骤是在ODB中进行完成的;2.2步骤可以通过两种方法完成:在vc中附着op_runsim_dev;或者在资源管理器中右键调试都行。
3.3和5步骤按照如下介绍:在vc中设置断点可以同F9或者工具栏的手型设置,或用crtl+b进行条件断点设置。
查看状态变量的方法:打开locals,展开“op_sv_prt”,再找状态变量。
或者在watch窗口输入(*(op_sv_prt)).状态变量进行查询。
CDB调试1.首先安装microsoft官网的debugging tools。
再设置偏好show console window为ture(需要重启计算机才能生效)和偏好path to 32-bit windows conmand-line debugger的路径为刚才安装的调试工具的cdb.exe全路径。
(我的机器为:C:\Program Files\Debugging Tools for Windows\cdb.exe)2.CDB是承载在ODB的基础上面的,先进入ODB调试界面,在选择simulation中的CDB即可打开CDB附着界面。
3.断点设置:(1)代码断点:调用格式“bp 函数名第几次经过断点的时候暂停”如下面想在函数ip_dispatch_do_init地址加偏移量0x108位置加入断点。
并且停在第三次经过断点时候。
bp ip_dispatch_do_init+ 0x108 3(2)内存访问断点:格式为ba Access Size [Address[Passes]]其中access为访问类型,通常的读和写分别用r和w表示;size表示监视的存取尺寸;address可以是变量名或者任何合法地址;passes指中断发生于第几次改内存访问时。
vc6.0安装教程与调试技巧
vc6.0的安装过程1.首先解压安装文件的压缩包2.然后再选择安装的版本,VC6CN 表示的是中文版,VC6EN表示英文版。
3.打开VC6CN文件夹,其中有如下图标,鼠标双击。
4.如下图所示就是我们安装的第一步,单击下一步。
5.选择“接受协议”后单击下一步。
6.本软件属于破解版,故无需输入产品ID号码,直接单击下一步。
7.选择“安装visual c++6.0中文企业版(I)”,这就是我们要安装的程序,单击下一步。
8.单击下一步。
9.如下界面,单击“继续”,开始安装软件。
10.点击“确定”。
11.选择“是”,继续安装。
12.选择“typical”继续安装13.选择“ok”。
14.选择“确定”15.选择“确定”16.取消“安装MSDN”前面的勾号,选择“退出”。
17.选择“是”,取消MSDN的安装。
18.程序安装完毕,再电脑的“开始菜单”中,选择“所有程序”,在“Microsoft Visual C++ 6.0”目录中选择“Microsoft Visual C++ 6.0”就可以运行程序了。
也可以将这个图标发送到桌面快捷方式,这样就可以直接在桌面上运行程序。
调试技巧调试程序可以帮助的了解程序是怎样运行的。
1、如何快速地规范代码缩进格式选中所需要规范的代码,按shift+F82、如何在Release状态下进行调试Project->Setting…->Project Settings对话框,选择Release状态。
“C/C++”标签页中的Category选General,Optimizations选Disable(Debug),Debug info选Program Database。
在“Link”标签页中选中Generate debug info复选框。
注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。
C语言技术中的调试工具推荐与使用技巧
C语言技术中的调试工具推荐与使用技巧在C语言的开发过程中,调试是一个非常重要的环节。
通过调试,我们可以发现代码中的错误并进行修复,提高程序的稳定性和性能。
而为了更高效地进行调试工作,我们需要使用一些专门的调试工具。
本文将推荐几款常用的C语言调试工具,并分享一些使用技巧。
一、GDB调试工具GDB是GNU开源项目中的调试工具,被广泛应用于C语言的调试中。
它提供了一系列强大的功能,如断点设置、变量查看、堆栈追踪等。
使用GDB进行调试时,我们可以通过命令行界面与其进行交互,也可以使用GUI界面进行操作。
以下是几个常用的GDB命令:1. 设置断点:可以使用“break”命令在代码的某一行设置断点,当程序执行到该断点时会暂停。
例如,“break main”可以在main函数的入口处设置断点。
2. 查看变量:使用“print”命令可以查看变量的值。
例如,“print x”可以查看变量x的值。
3. 单步执行:使用“step”命令可以逐行执行代码,并进入函数内部。
例如,“step”可以进入函数的第一行。
除了这些基本命令外,GDB还提供了许多其他功能,如条件断点、内存查看等。
通过熟练掌握GDB的使用技巧,我们可以更快速地定位和解决问题。
二、Valgrind内存调试工具在C语言开发中,内存泄漏是一个常见的问题。
为了解决这个问题,我们可以使用Valgrind这个强大的内存调试工具。
Valgrind可以检测程序中的内存错误、访问越界、使用未初始化的变量等问题,并给出相应的报告。
使用Valgrind进行内存调试时,我们可以使用以下命令:1. 检测内存错误:使用“valgrind --leak-check=full ./program”命令可以检测程序中的内存错误,并给出详细的报告。
2. 检测访问越界:使用“valgrind --tool=memcheck --track-origins=yes ./program”命令可以检测程序中的访问越界问题,并追踪到具体的源头。
VisualStudio断点调试与内存分析教程
VisualStudio断点调试与内存分析教程第一节:Visual Studio断点调试介绍Visual Studio作为一款流行的集成开发环境(IDE),提供了丰富的调试功能,其中断点调试是开发人员经常使用的功能之一。
断点调试可以让开发人员在程序运行过程中暂停程序的执行,以便观察变量的值、检查代码的执行流程和调试程序的错误。
第二节:使用断点设置1. 单击源代码行的行号或按F9键,可以在该行设置一个断点。
断点会在程序执行到该行时暂停程序的执行。
2. 设置条件断点:在断点属性中可以设置条件,只有满足条件的情况下,程序才会暂停执行。
3. 设置条件断点和数据断点:条件断点可以在特定条件下暂停程序的执行;数据断点可以在特定变量的值发生改变时暂停程序的执行。
第三节:断点调试的常用功能1. 单步执行:在程序暂停时,可以逐行执行代码。
单击工具栏上的“单步执行”按钮或按F10键可以逐行执行代码。
2. 监视窗口:监视窗口可以用来观察变量的值。
在程序暂停时,可以将变量添加到监视窗口中,随时查看其值的变化。
3. 自动变量窗口:自动变量窗口会显示当前作用域内的所有变量及其值。
在程序暂停时,可以使用自动变量窗口来检查变量的值。
4. 调用堆栈窗口:调用堆栈窗口会显示函数的调用顺序。
在程序暂停时,可以查看当前函数的调用堆栈,方便程序调试。
第四节:内存分析工具介绍Visual Studio还提供了一些内存分析工具,用于帮助开发人员识别和修复内存相关的问题,例如内存泄漏和访问冲突。
以下是一些常用的内存分析工具:1. 内存窗口:内存窗口可以显示程序的内存使用情况,包括分配的内存块和它们的地址。
2. 实时内存分配跟踪:实时内存分配跟踪可以记录程序运行时分配的内存块的详细信息,包括分配的位置和释放的位置。
3. 静态分析工具:静态分析工具可以在编译时检查代码中的潜在内存问题,例如使用未初始化的变量或释放已经释放的内存。
第五节:内存分析的基本步骤1. 在程序中插入内存相关的代码:为了分析内存问题,需要在程序中插入代码来记录内存分配和释放的位置,以及其他关键信息。
vc++6.0 调试
图4设置断点及相关工具
设置了断点的程序行前会出现一个黑色的实心圆圈。
取消断点用同样的按钮和菜单。
Go(F5)命令从程序中的当前语句开始执行,直到遇到断点(后面讲)或遇到程序结束。
【练习4】在程序中随意设置和取消断点(一个程序中可以根据需要设置多个断点),然后用Go命令(F5)执行,观察变量及程序流程的变化。
提示:Step Over(F10)和Step Into(F11)的区别将在学习函数后更加明确,需要跟踪自定义函数内部代码时,用Step Into(F11),不需要跟踪时,就Over过去了。
【练习3】将光标置于程序中某一语句上,用Run to Cursor(快捷键CTRL-F10),看看发生什么现象——直接执行到了光标处!这是一种快速观察的方法。(PS:本练习受1楼博友留言启发加上,表示感谢。)
如何找出这些错误?在冗长的代码中,找出这些错误来并不总是一件容易的事。排错(debug)是一件程序员不得不面对的麻烦事,但真正的程序员会把与bug战斗当成自己的神圣使命。
调试程序是程序员应该具备的基本能力。在学习编写程序过程中,学会调试程序是最实用的技能之一。可以纯粹依靠人工,一行一行,或一块一块地检查,思考,很累人。也可以像现有的各种教材及课堂教学中介绍的,输出变量及中间变量(用输出语句cout<<...;),以观察运行结果及运行的中间结果。这种方法简洁方便,但增加了写代码的维护量,同时,有时并不能方便地找到问题所在。
case 3: a++; b++;
}
cout<<"a="<<a<<",b="<<b<<endl;
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(Visual Studio)是一款被广泛使用的集成开发环境(IDE),用于开发各种类型的应用程序。
在使用VC进行开发时,掌握一些常用的快捷键和调试方法可以提高开发效率和问题排查能力。
下面是一些常用的VC快捷键:1. Ctrl+C:复制选定内容2. Ctrl+X:剪切选定内容3. Ctrl+V:粘贴剪切/复制的内容4. Ctrl+Z:撤销上一步操作5. Ctrl+Y:恢复上一步被撤销的操作6. Ctrl+A:选择全部内容调试快捷键:1.F5:启动调试,开始运行程序2.F10:逐过程调试,逐行执行代码3.F11:逐语句调试,进入函数/方法内部执行4. Shift+F11:跳出当前函数/方法,返回调用处5. Ctrl+F5:在无调试的情况下运行程序文件/项目管理快捷键:1. Ctrl+N:新建文件2. Ctrl+O:打开文件3. Ctrl+S:保存文件4. Ctrl+Shift+N:新建项目5. Ctrl+Shift+O:打开项目6. Ctrl+Shift+S:全部保存/查找快捷键:1. Ctrl+F:查找2. Ctrl+H:替换3.F3:查找下一个4. Shift+F3:查找上一个5. Ctrl+Shift+F:全局调试方法:1. 直接运行:对于简单的程序,可以直接运行并观察输出结果,使用Ctrl+F5快捷键启动程序。
2.设置断点:在代码行左侧单击,会在该行设置一个红色圆点,表示断点。
启动调试后,程序会在断点处暂停执行,可以逐行调试。
3.条件断点:右击断点所在行,选择“条件断点”,可以设置断点被激活的条件,以便更加精确地检查程序运行状态。
4.单步调试:使用F10和F11快捷键,在程序执行过程中逐行跟踪和检查变量值。
F10逐过程调试,F11逐语句调试。
5.异常处理:当程序发生异常时,调试器会捕获并显示异常信息。
可以通过设置异常断点来捕获特定类型的异常。
6. 调试输出:使用OutputDebugString函数在代码中插入调试信息,并在输出窗口中查看。
VC6.0 IDE的使用和程序调试技巧
项目工作区窗口
ClassView页
FileView页 ResourceView页
FileView页
ClassView页
File->New->Proj32 Application
基于WINDOWS平台的32位开发环境开发应用程序,SDK程序。 入口函数为WinMain
文件类型 Active Server Page Bitmap File C/C++ Header File HTML Page Resource Script Resource Template
Visual C++6.0 可以创建的文件类型 说明 文件类型 网页制作 Binary File 创建位图文件 C++ Source File 创建 C/C++头文件 Cursor File 创建 HTML 文件 Icon File 创建资源脚本文件 Text File 创建资源模板文件 SQL Script File
6:使用单步执行到程序结束
设置断点以后,调试运行程序时,程序 开始执行,并且运行到断点处暂停下来, 此时我们有机会观察程序的运行情况, 并且诊断程序目前的状态是否如我们所 预期的那样。 不过我们先不着急观察程序的状态,而 是来看看如何控制程序的运行,以便在 我们需要的时候让程序暂停下来,并且 以我们需要的方式走走停停!
方法是使用单步执行手段stepover让程序向前走一步停止调试停止调试并重新启动调试单步执行当前位置对比调试运行时出现的调试菜单debug和调试工具栏根据图标查找对应项设置断点调试运行程序此时程序暂停在断点处等待选择debug菜单找到最后一项quickwatch并点击输入想要观察的变量变量名变量的值点击addwatch点击addwatch看到如下画点击单步执行按钮或者菜单程序则向前单独运行一个步骤每向前执行一步就会暂停下来这样我们就有充足的时间观察所关心的变量名称按下f5键可以让程序从当前位置向前执行直到遇见下一个断点或者程序结束下面是赠送的ppt模板不需要朋友可以下载后编辑删除
C语言中的调试技巧
C语言中的调试技巧在C语言开发过程中,调试是一个非常重要的环节。
因为C语言是一种较为底层的语言,程序员需要更加细致地检查代码,找到并解决潜在的bug。
下面将介绍一些在C语言中常用的调试技巧,帮助程序员更高效地调试自己的程序。
1. 使用printf语句输出调试信息在C语言中,最简单的调试技巧就是使用printf语句来输出变量的值或者关键信息。
通过在代码中插入printf语句,可以帮助程序员跟踪代码执行过程,查看各个变量的取值情况。
在遇到bug时,可以输出关键信息,帮助程序员定位问题所在。
2. 使用断点调试通过调试器,在关键的代码行设置断点,可以让程序在执行到该行时暂停,以便程序员检查此时各个变量的取值情况。
在调试器中,可以单步调试代码,逐行执行,查看代码执行过程,帮助找出问题所在。
3. 编译时增加调试信息在编译C语言程序时,可以通过加入调试信息的编译选项,如 -g,来生成可调试的可执行文件。
在调试阶段运行程序时,可以更好地跟踪代码执行过程,帮助程序员找到问题点。
4. 使用assert宏assert宏是C语言中的一个调试工具,用来在程序中插入断言,即条件判断,如果条件不满足,则程序会终止执行并输出错误信息。
通过使用assert宏,可以帮助程序员在程序中加入自动化的检查点,当条件不满足时,停止程序执行,帮助定位问题。
5. 静态代码分析工具除了以上基本的调试技巧外,还可以借助一些静态代码分析工具来帮助检测代码中的潜在问题。
这些工具可以帮助发现一些常见的bug,如内存泄露、空指针引用等,帮助程序员在早期发现并解决问题。
总的来说,在C语言中进行调试是一项重要而繁琐的工作,但却是必不可少的。
通过合理的调试技巧,程序员可以更加高效地发现并解决问题,提高代码的质量和稳定性。
希望以上介绍的调试技巧能够对C语言开发者有所帮助,使其在调试过程中更加得心应手。
VC 6.0_Debug调试方法
编译0 error(s), 0 warning(s)链接0 error(s), 0 warning(s)当你按捺不住激动滴心情点击运行后,发现结果并不是你想要的结果……郁闷了。
然后你在代码中加了n条printf来查看变量的结果……n多循环……运行,再加printf,again and again……终于,要抓狂了……好吧,同学,如果你会用Debug,也许你不用这么纠结。
下面通过一简单例子说明如何使用Debug的一些“基本”(我也只是刚入门的小菜鸟,高级的修行要靠自己的了)功能:写了如图中的一个简单程序,编译链接都没有错误,运行结果却不理想(不正确)需要指出的是,主函数不要再用void main()了,这种只有在你学的环境才不会出错,到别的(linux编译器)地方编译是通过不了的。
main函数必须要有返回值,如写成int main()在函数结尾时加一个return 0;,这样,所有编译器都不会报错了。
最终结果确定是逻辑错误,如果不用单步调试,很难找出这种错误的。
这里先提到一个断点的概念,顾名思义,既是在你需要的地方让它断开,如果你在某一行代码处添加了断点,那么程序运行到断点处即会暂停,不再继续往下运行,直到接到你继续运行的命令。
对上边示例的程序,在你感觉可能有问题的地方添加断点(按快捷键F9或者点击图中小手按钮),以便运行到断点处好查看运行状态。
2012-07-21更新:上边划掉的部分以前就发现有点没解释清楚,一直没来得及更正。
现更正下:之前只知道一个F10,所以解释成了遇到函数会认为是一步直接过去{ } ,得到返回结果。
其实可以从调试的菜单中看到,F10是step over ,意思就是跳过{ } 图标上也有形象的表示,仔细看还有一个F11 是 step into,即进入{ } 内的意思,这下就可以解释清楚了为什么会跳过去,还有其它的更多的快捷键,需要大家自己研究了,常用的也就这几个吧。
在需要的地方添加完断点后(其实,在每个函数第一个需要停下来的地方添加断点就可以了,剩下的地方都可以用F10单步执行,某些已经验证过正确的函数,就不需要每次进行单步查看了验证过的函数等可以按F10 跳过,想要进入其内部可按F11……)添加完断点,按F5或者下图中的调试按钮,即可出现调试界面。
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程序调试方法以及常见错误
目录使用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)设置固定断点或临时断点所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC调试篇难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。
不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。
我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下:VC调试篇设置为了调试一个程序,首先必须使程序中包含调试信息。
一般情况下,一个从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可以选择。
选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。
调试方法:1、使用 Assert(原则:尽量简单)assert只在debug下生效,release下不会被编译。
2、防御性的编程3、使用Trace4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因5、把错误信息记录到文件中位置断点(Location Breakpoint)大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。
但对于很多问题,这种朴素的断点作用有限。
譬如下面这段代码:void CForDebugDlg::OnOK(){for (int i = 0; i < 1000; i++) //A{int k = i * 10 - 2; //BSendTo(k); //Cint tmp = DoSome(i); //Dint j = i / tmp; //E}}执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。
这样手要不停的按,很痛苦。
使用VC6断点修饰条件就可以轻易解决此问题。
步骤如下。
1 Ctrl+B打开断点设置框,如下图:Figure 1设置高级位置断点2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。
3 按F5重新运行程序,程序中断。
Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。
意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。
因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513。
4 再次重新运行程序,程序执行了513次循环,然后自动停在断点处。
这时,我们就可以仔细查看DoSome是如何返回0的。
这样,你就避免了手指的痛苦,节省了时间。
再看位置断点其他修饰条件。
如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。
譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入“i==100”。
另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。
这对检测一个变量何时被修改很方便,特别对一些大程序。
用好位置断点的修饰条件,可以大大方便解决某些问题。
数据断点(Data Breakpoint)软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的事情(如果没有调试器的帮助)。
恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。
譬如下面一段程序:#include "stdafx.h"#includeint main(int argc, char* argv[]){char szName1[10];char szName2[4];strcpy(szName1,"shenzhen");printf("%s\n", szName1); //Astrcpy(szName2, "vckbase"); //Bprintf("%s\n", szName1);printf("%s\n", szName2);return 0;}这段程序的输出是szName1: shenzhenszName1: aseszName2: vckbaseszName1何时被修改呢?因为没有明显的修改szName1代码。
我们可以首先在A行设置普通断点,F5运行程序,程序停在A行。
然后我们再设置一个数据断点。
如下图:Figure 2数据断点F5继续运行,程序停在B行,说明B处代码修改了szName1。
B处明明没有修改szName1呀?但调试器指明是这一行,一般不会错,所以还是静下心来看看程序,哦,你发现了:szName2只有4个字节,而strcpy了7个字节,所以覆写了szName1。
数据断点不只是对变量改变有效,还可以设置变量是否等于某个值。
譬如,你可以将Figure 2中红圈处改为条件”szName2[0]==''''y''''“,那么当szName2第一个字符为y时断点就会启动。
可以看出,数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。
其他调试手段:系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:值WatchVC支持查看变量、表达式和内存的值。
所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被成为Watch的机制来观看变量和表达式的值。
在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。
单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。
注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。
Memory由于指针指向的数组,Watch只能显示第一个元素的值。
为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。
在 Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
VariblesDebug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。
特别是当前指令涉及的变量,以红色显示。
寄存器Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。
调试技巧:1、VC++中F5进行调试运行a)、在output Debug窗口中可以看到用TRACE打印的信息b)、 Call Stack窗口中能看到程序的调用堆栈2、当Debug版本运行时发生崩溃,选择retry进行调试,通过看Call Stack分析出错的位置及原因3、使用映射文件调试a)、创建映射文件:Project settings中link项,选中Generate mapfile,输出程序代码地址:/MAPINFO: LINES,得到引出序号:/MAPINFO: EXPORTS。
b)、程序发布时,应该把所有模块的映射文件都存档。
c)、查看映射文件:见” 通过崩溃地址找出源代码的出错行”文件。
4、可以调试的Release版本Project settings中C++项的Debug Info选择为Program Database,Link 项的Debug中选择Debug Info和Microsoft format。
5、查看API的错误码,在watch窗口输入@err可以查看或者@err,hr,其中”,hr”表示错误码的说明。
6、Set Next Statement:该功能可以直接跳转到指定的代码行执行,一般用来测试异常处理的代码。
7、调试内存变量的变化:当内存发生变化时停下来。
???进程控制VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。
各个快捷键功能如下:Call Stack调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。
单击Debug 工具条上的Call stack就显示Call Stack对话框。
在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。
单击这些函数名可以跳到对应的函数中去。
关注一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。
∙一些函数返回错误,需要用其他函数获得错误的具体信息。
例如accept 返回INVALID_SOCKET表示accept失败,为了查明具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。
∙有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误∙程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。
如果程序出了异常,却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。
另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。
因为只有这样,VC才能选择合适的编译、连接选项。
对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译速度而设置的预编译头文件。