vc6调试入门
VC6程序的基本调试方法
Visual C++ 6.0编程环境的使用目录3 严谨思维,调试程序 (1)3.1什么时候需要对程序进行调试 (1)3.2对程序进行调试的基本手段和方法 (1)(1)观察了解程序的“病症”表现 (1)(2)弄清程序的主要工作流程 (1)(3)进行大致的检查,确定问题存在的模块 (3)(4)检查故障模块,确定问题并解决 (3)3.3对程序进行调试的基本手段 (4)(1)设置固定断点或临时断点 (4)(2)单步执行程序 (4)(3)使用断言 (5)(4)与调试相关的操作菜单:Build菜单 (6)(5)与调试相关的操作菜单:Debug菜单 (6)3.4对一个简单程序的调试过程 (7)3.5设计合适的程序调试方案 (8)3.6优秀程序员的基本素质——丰富的想象、严谨的思维 (10)(1)程序运行结果看起来对了,但并不意味着程序没有隐藏的问题 (10)(2)严谨思维的典范——程序员学习的榜样 (11)3 严谨思维,调试程序所谓程序调试,是指当程序的工作情况(运行结果)与设计的要求不一致——通常是程序的运行结果不对时,科学地(而不是凭偶然的运气)通过一定的方法、使用一定的手段来检查程序中存在的设计问题(某种逻辑错误而不是语法、链接错误,修正语法、链接错误不是调试程序要做的事)。
3.1 什么时候需要对程序进行调试当程序编译出错或者链接出错时,系统都将在Output输出窗口中随时显示出有关的提示信息或出错警告信息等(如果是编译出错,只要双击Output窗口中的出错信息就可以自动跳到出错的程序行,以便仔细查找)。
但若编译和链接都正确,而执行结果又总是不正确时,这时就需要使用调试工具来帮着“侦察”出程序中隐藏着的出错位置(某种逻辑错误)。
强调:初学者常犯的错误是认为“编译和链接”都正确,程序就应该没有问题,怎么会结果不对呢?“编译和链接”都正确,只能说明程序没有语法和拼写上的错误,但在算法(逻辑)上有没有错,还得看结果对不对。
vc++6.0环境下程序调试教程
更多共享就在:/avbbtv/home,个人整理,没有版权,欢迎共享---avbbtv如何在Visual C++ 6.0 环境下进行简单的C语言程序调试桂林电子科技大学波仔*****************文章简介本文主要介绍如何在VC6.0 环境下进行简单的C 语言程序调试。
作为阅读本文的基础,读者应该熟悉如何在VC6.0 环境下建立Win32 Console Application(Win32控制台程序) 类型的工程。
请结合文章给出的案例,按照文档中的描述一步一步做。
如果只是阅读,则收效甚微。
在做完文章给出的案例后,你应该尝试着将文章中介绍的知识和技巧应用到你实际开发的程序中。
如果阅读完一遍后,对调试基本概念还是不了解,建议你再多看几遍。
在介绍如何进行C 语言程序调试( debugging)前,首先介绍程序调试的概念。
调试(debug)一词在计算机领域最早被提及,源于美国人Admiral Grace Hopper(葛丽丝·霍普、COBOL 语言发明者、电脑科学家) 。
二十世纪四十年代(1940s) Grace Hopper在哈佛大学为名为马克2 号(Mark II) 的计算机( 由IBM 公司制造) 编写程序时,有一次在排除计算机故障时,发现一只飞蛾被夹在触点原件之间,导致计算机无法运行。
于是她诙谐的把计算机故障称之为“臭虫(bug)”,把排除程序故障称之为debug 。
从此之后,在计算机领域,程序调试或查找程序故障称为debug 。
进行程序开发时,很多情况是程序通过编译、链接( 亦即不存在语法错误) ,但是在运行时往往得不到正确的结果( 需要多组输出数据进行测试)。
这时往往意味着程序存在逻辑错误( 与语法错误对应,通常是指程序所体现出的逻辑不符合开发者要求,或者是开发者本身对程序所要解决的某一问题的理解存在逻辑偏差) ,而查找逻辑错误的过程可称之为程序调试。
程序案例下面以一个程序案例为例,介绍如何在VC6.0 下进行程序调试。
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就设置了⼀个位置断点。
使用VC6.0调试程序
结构体类型的定义
struct 结构体类型名 { 类型标识符 成员名1;
类型标识符 成员名2; ……
类型标识符 成员名n; };
如: struct student { char name[10];
long id; char gender; int age; }
注意: struct student 应作为一个类型整体, name[10]、id、gender、age都是其成员。 struct及花括号后的“;”不能省。
a
因此,在C语言中,将地 址形象化地称为指针
2012 35
b
….
2010 p
2012 q
定义一个指针变量
指针变量的定义一般形式为:
基类型 *指针变量名;
例如: int i, j, *pi, *pj; float x, y, *p1, *p2;
指针变量的赋值:使得指针变量指向变量 指针变量名=&变量名;
设有一个函数process,在调用它时,每次实现不同的功 能。输入a和b两个数,第一次调用时找出a与b中的大者,第
二次找出小者,第三次求和。
#include<stdio.h> void main() {int max(int,int); int min(int,int); int add(int,int); int process(int, int, int (*fun)()); int a,b; printf("enter a and b:"); scanf("%d%d",&a,&b); printf("\nmax="); process(a,b,max); printf("\nmin="); process(a,b,min); printf("\nsum="); process(a,b,add); }
Visual C++6.0 中的调试工具使用入门
Visual C++6.0 中的调试工具使用入门一、程序开发过程中出现的错误类型我们在进行程序设计时,不可避免地会犯错误。
程序中的错误可以分为三类:编译错误、运行时错误和逻辑错误。
编译错误(Compile errors)又称为编译时错误(Compiling-time errors): 是由于错误的编码产生的。
例如关键字拼写错误、将中文标点符号当成英文符号使用、遗漏了某些必要的标点符号或者使用了一个没有定义的标识符。
编译错误一般都是语法错误,当编译器对程序进行语法检查时,都能发现这些错误,并能够指出产生错误的位置(标出行号)。
我们可以根据编译出错信息指出的行号找到对应的源代码行改正错误,重新编译源程序。
只有当所有的编译错误被改正后,才能通过编译检查,产生目标代码文件。
改正编译错误的关键是要能正确理解编译器给出的编译错误信息。
VC++环境中的编译、链接错误信息是用英文表示的。
对于英文基础薄弱的读者,可以参考本实验指导书后面的“VC++编译、链接常见错误和警告信息中英文对照”。
通常情况下,一个语法错误可能产生多条编译错误信息,这是由于株连错误造成的,建议读者在处理编译错误时,找到第一个出现错误的位置改正后重新编译。
这样能够避免被株连错误迷惑。
值得指出的是,现在大部分编译器对错误的定位不精确,如果在编译器指出的行没有发现错误,应该向前查找错误。
例如,当提示第10行发生错误时,如果在第10行没有发现错误,请从第10行开始往前查找错误并修改之。
运行时错误(Run-time errors)是在程序的运行阶段出现的,当运行环境检测到程序的某些操作无法执行,例如除数为零时,就会出现运行时错误。
当运行环境检测到程序的某些操作是被禁止的,也会产生运行时错误。
例如,访问数组时超越数组的边界,空指针引用(NULL pointer assignment,空指针赋值,即有指针未赋具体地址就使用了)等等。
逻辑错误(Logic errors):当程序没有按照程序员的意图执行时,就表明程序中存在逻辑错误。
Visual C++ 6.0程序调试
Visual C++ 6.0程序调试在编写较长的程序时,能够一次成功而不含有任何错误决非易事,对于程序中的错误,系统提供了易用且有效的调试手段。
调试是一个程序员最基本的技能,不会调试的程序员就意味着即使学会了一门语言,却不能编制出任何好的软件。
1、调试程序环境介绍①进入调试程序环境选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令,选择下一级提供的调试命令,或者在菜单区空白处单击鼠标右键,在弹出的菜单中选中“调试(Debug)”项。
激活调试工具条,选择需要的调试命令,系统将会进入调试程序界面。
同时提供多种窗口监视程序运行,通过单击“调试(Debug)”工具条上的按钮,可以打开/关闭这些窗口,参考图8。
②Watch(观察)窗口单击调试(Debug)工具条上的Watch按钮,就出现一个Watch窗口,系统支持查看程序运行到当前指令语句时变量、表达式和内存的值。
所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
还可以采用系统提供一种被称为Watch的机制来观看变量和表达式的值。
在断点中断状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。
在该窗口中输入变量或者表达式,就可以观察变量或者表达式的值。
注意:这个表达式不能有副作用,例如“++”和“- -”运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致程序的逻辑被破坏。
③Variables(变量)窗口单击调试(Debug)工具条上的“Variables“按钮弹出Variables窗口,显示所有当前执行上下文中可见的变量的值。
特别是当前指令语句涉及的变量,以红色显示。
④Memory(内存)由于指针指向的数组,Watch窗口只能显示第一个元素的值。
为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。
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窗口,在该窗口可以计算表达 式的值
vc6调试入门教程
VC6调试入门教程虞铭财本文以OJ上957题简单计算为例介绍VC6的基本调试功能。
题目在《程序设计基础2010》实验三分支结构中。
希望大家把这个代码输入到vc中,跟着本教程多调试几遍,肯定可以掌握调试的基本技巧。
文中如有错误,请指出,不胜感激!!已有代码如下提交到OJ上,判题结果为WA。
虽然用题目的样例输入R1也能得到正确结果19。
但题目中还存在逻辑错误。
对于判题结果为WA的题目,首先大家需要去设计一些测试数据去测试你的程序,看看程序的输出结果是否正确(比对程序输出与自己手工计算结果是否一致),本题还可以设计测试数据,如a1,正确结果应该为f(a)+1=0,但运行程序后结果如下说明对测试数据a1来说,程序给出了错误的结果。
需要找出程序到底哪一行出现了问题。
这个时候需要调试程序。
调试程序的目的就是找出程序中的逻辑错误(希望大家都能明白语法错误和逻辑错误的区别)。
调试的最基本方法主要如下:设置断点、单步执行程序、查看程序中的变量。
1、设置断点从代码上看,显然1-6行是没有问题的。
所以我们在第7行设置断点,如果大家不确定前面的代码是否有问题,可以在main函数的开始处设置断点。
把光标移到第7行的行首,如图所示,光标会在第7行闪烁(图上I字形所在位置)。
然后在工具栏上点击调试按钮,或者按快捷键F9。
这样就在第7行设置好了断点,如图第7行前面有一个红色的圆点。
如果再次把光标移到第7行,然后点击调试按钮或者按F9,则取消断点。
所以按钮或者F9的功能是插入或者删除断点。
备注:断点的作用是使程序在调试的时候,运行到断点所在的行(但是尚未执行该行)的时候暂时把程序停下来,这样就可以程序运行到断点的时候查看变量的值。
2、开始调试设置好断点后,点击工具栏上的开始调试按钮或者按快捷键F5就可以开始调试。
开始调试后如图:大家可以发现在第7行有一个黄色的箭头,表示程序执行到该行了(再次强调一下,该行的代码尚未执行)。
备注:在开始调试后,需要注意如果断点行前有scanf()语句,需要先在程序运行窗口先按题目要求给定程序的输入。
VC6常用调试方法
(试试看Shift+F10什么效果)
F11跟踪时进入函数内部
Shift+F11跳到上一层调用栈
F12跳到函数定义初(需要带Browse Info选项编译,建议不选,生成文件很大)
编辑常用
Ctrl+W 显示ClassWizard,边界面程序用的比较多
Ctrl+Z/Ctrl+Y Undo/Redo
Shift+F5 --F5运行后,直接从VC中停止程序(可以模拟当机情况)
Ctrl+Shift+F5 --重新开始运行
F6切换窗口 SplitWindow后,可以转换光标所在的窗口
F7编译 F7 编译工程
Ctrl+F7 编译当前文件
Alt+F7 工程设置对话框
Alt+8 显示汇编码
还有一些常用的
Ctrl+TAB 切换打开的文件视图,(如果按住Ctrl,顺序向后切换)
Ctrl+Shift+TAB切换打开的文件视图,(如果按住Ctrl,顺序向前切换)
TAB 选中后,整体后移一个制表符,
Shift+TAB 选中后,整体前移一个制表符,
7. 按Ctrl + C 可COPY光标所在的这一行。
8. 按住shift+[End] 可选择本行。
//////////////////////////////////////
F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容
F2 书签功能: Ctrl+F2 --在某行设置一个书签(再按一次次是取消)
1.检测程序中的括号是否匹配
vc6.0安装教程与调试技巧
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版一样。
VC++6.0调试方法大全
一、调试基础调试快捷键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宏也就随之被激活了。
VC6.0调试技巧
• ④ 运行到当前光标处 当按下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源程序进行编 辑和修改。如图所示。
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状态。
VC6编译与调试.
CCell * pCell = new CCell(); //创建 CCell 类的一个对象 pCell->SetValue( 'A' ); //调用 SetValue 方法设置单元格的值 char c = pCell->GetValue(); //调用 GetValue 方法获取单元格的值 return 0; } 为了编译通过,还需在 main 函数所在 CPP 文件的前面加上以下一行#include 语句。 #include "Cell.h" //因为使用了 CCell 类,因此需包含 CCell 类的头文件 Cell.h。
1.1.1.2.5. 添加和使用类
一个相对独立的功能,可使用一个类来封装和实现,这使项目代码结构清晰的同时,也使相 关功能代码重用更加方便。
1.1.1.2.5.1. 添加一个类
使用 VC++向项目中添加一个类,可按如下步骤进行。以下假定添加一个单元格类 CCell, 一个 char 类型的成员变量 m_cValue 表示单元格的值;有一个 GetValue 函数用于获取单元格 的值;一个 SetValue 函数用于设置单元格的值。 依次单击菜单项<Insert>=><New Class >,打开添加类窗口。
Win32 Static Library
开发基于 Windows API 的静态链接库(LIB)
小提示 1、Console(控制台)和 Win32 是 Windows 操作系统中的两个子系统。Console 子系统用于兼 容执行早期 DOS 程序;Win32 子系统用于可移植的可执行文件格式(PE)的执行 32 位程序。 Windows 操作系统中的绝大多数窗口程序包括 MFC 窗口程序都是在 Win32 子系统下执行。 2、项目类型表中的 Win32 Application 和 MFC AppWizard 区分开来,是强调各自基于的图形 界面开发框架不同。Win32 Application 强调可直接使用 Windows API 开发,避免引入复杂庞 大的 MFC 框架,而 MFC AppWizard 强调可使用 MFC 框架开发,快速构建稳固的窗口程序。
关于Visual C++ 6.0的调试技巧和经验总结
创建c语言源代码的步骤:1、新建一个文件2、输入文件名称,设置工程文件夹(所以可以先建一个文件夹):3、书写并编辑源代码:4、编译:5、连接:6、运行看看工程文件夹结构:7、用键盘敲入程序输入:一个小技巧:可以直接点击“运行”工具按钮,如果有错,也会有出错提示。
这样可以省略编译和连接操作。
当编译时有问题怎么办? vc会给你出错地点和原因的提示,注意,首先应该修改第一条错误记录,修改后就重新编译连接,改对后再改剩下的。
即从前到后一个错误一个错误的改。
(可能后面的所有错误都是第一个错误导致的,改正第一个错误后,其他错误就消失了,或大大减少了)调试(发现错误位置,在编译、连接成功,而运行时出错时使用):调试时的快捷键以及用法见下面的内容:○常用功能:Restart(Ctrl+shift+F5):此debugger功能将从程序的开始(第一有效行)处全速执行,而不是从当前所跟踪的位置开始调试,这时所有变量的当前值都将被丢弃,debugger会自动停在程序的main()开始处。
这时如果选择Step Over(F10)就可以逐步执行main()函数了。
Stop Debugging(Shift+F5):此debugger功能将终止(所有)调试,并返回到常规编辑状态。
Break(此功能常常在遇到调用函数的语句时可见。
):此功能将在调试过程中的debugger当前位置挂起程序的执行,然后就可以在调试状态下修改程序的代码,接着可以用Apply Code Changes(Alt+F10)来应用修改的代码到正在调试的程序当中。
如果,当前(需要,待)可以(从DOS等窗口)输入值,挂起后将不能再输入。
Apply Code Changes(Alt+F10):此功能可以在程序正在调试程序过程中应用(挂起)修改后的源代码。
如,选择Break功能并修改代码后,只要选择Apply Code Changes(Alt+F10)就能将修改后的代码应用到正在调试的程序当中。
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模板不需要朋友可以下载后编辑删除
使用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。
VC++6.0 Debug单步调试简单入门
本篇文章为大家简单介绍如何使用VC++6.0的Debug来设置断点,进行单步调试。
熟练使用Debug单步调试后,你找出并改正bug的速度和效率将大大提高,所谓磨刀不误砍柴工呀!相信大家对谭浩强童鞋都不陌生,想当年,是他引领我们步入了C的殿堂,我们从他那里学会了如何写代码,他却没有教我们如何Debug,而我们伟大的老师,也对此只字不提。
相信很少有人可以一次性写出完全正确的代码。
对于我们这些个菜鸟来说,写出不带bug的代码倒是一件很不正常的事情。
也许你知道有 Debug这么个东西,但却不知道该怎样用;也许你还停留在在代码中添加N个printf来输出查看到底是哪里出了问题;也许……总之,经验表明,你花费时间看完这篇文章并学会简单的使用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;,这样,所有编译器都不会报错了。
最终结果确定是逻辑错误,如果不用单步调试,很难找出这种错误的。
这里先提到一个断点的概念,顾名思义,既是在你需要的地方让它断开,如果你在某一行代码处添加了断点,那么程序运行到断点处即会暂停,不再继续往下运行,直到接到你继续运行的命令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Q:在设置断点调试时,按F10或F11键有时会进入机器码,请问这时除了停止调试外,还有没有其他方法返回到调试状态?还有,就是在单步执行时,能不能返回到程序的上一行或上几行?如果你认识还有哪些有用的调试技巧,A:1.没有返回调试状态的说法2.不能返回程序的上一行(你指的应该是程序的运行返回)3.如下:推荐不错的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页,就可以设置消息断点。
如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。
如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。
Watch VC支持查看变量、表达式和内存的值。
所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被成为Watch的机制来观看变量和表达式的值。
在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。
单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。
注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。
Memory 由于指针指向的数组,Watch只能显示第一个元素的值。
为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。
在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
Varibles Debug工具条上的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返回INV ALID_SOCKET表示accept失败,为了查明具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。
• 有些函数通过异常机制抛出错误,应该用TRY-CA TCH语句来检查错误• 程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。
如果程序出了异常,却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。
另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。
因为只有这样,VC才能选择合适的编译、连接选项。
对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译速度而设置的预编译头文件。
在这个#include "stdafx.h"行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。
对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是:• 弹出Project settings对话框• 选择C/C++• Category选择Precompilation Header• 选择不使用预编译头。
ps:DLL的调试假设:要调试hook.dll hook.h hook.lib1。
建立一个新工程Test,将hook整个工程目录拷贝到Test目录下2。
在Test工程中需要用到hook.dll的源文件中(或stdafx.h中)加入#include "./hook/hook.h" 这样在该源文件中使用"::"就可以索引到hook.h中所有的导出函数、变量以及类3。
在Test的工程设置->Link->Object/library modules中加入 ./hook/debug/hook.lib4。
编译连接好Test之后,发现未找到hook.dll. 这需要设置path. 可以在工程设置->Debug->Working directory中加入e:/Test/hook/debug/ 也可以在autoexe.bat中设置路径5。
通过工程->Insert Project into Workspace将hook.dsp工程加入Test项目中。
6。
设置hook工程为活动工程,在工程>Debug>Executable for Debug session中加入: e:/test/debug/test.exe7。