VC60调试指南HappyDebuggingWord文件下载.docx
- 文档编号:17234650
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:16
- 大小:266.70KB
VC60调试指南HappyDebuggingWord文件下载.docx
《VC60调试指南HappyDebuggingWord文件下载.docx》由会员分享,可在线阅读,更多相关《VC60调试指南HappyDebuggingWord文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
这些是不能被直接运行的,还需要链接器将此中间代码与其他代码相结合来生成可执行文件。
请转看Linking,
Compile时,编译器通常会给你2种类型的提示:
warnings和errors
warnings
别小看warnings,它有可能会导致相当严重且极其隐蔽的bug,尤其是在指针管理内存这一块,/
常见的warning有以下几种类型
1,使用了未经初始化的变量,或者定义变量了却没有使用。
解析:
未经初始化的变量会存一个随机值,绝大多数的时候这个值都不是你想要的,你用它,编译器能不给你warning吗,?
2,使用了一些看上去非常愚蠢的语句,编译器都看不下去了
例如,if(blueguy=0)
printf("
blueguy=0!
!
"
);
if(blueguy&
&
greengirl||hemy)
;
3,使用了未定义的语句(注意,vc6.0是不会给这样的语句一个warning的)
例如,j=i+++i++;
//我自己都不知道自己想表达什么意思,呵呵
x=x>
0?
x++:
x--;
4,类型不匹配
例如,char*blueguy=(int*)greengirl;
本意是按单字节仿问内存的,结果却按四字节仿问内存,你感到崩溃,我感到崩溃,编译器也感到崩溃,估计编译器会真的崩溃了,/
5,函数原型明明写着有返回值的,结果函数体内却没有return一个值,反之亦然。
例如,
intmain(void)
{
}
或者
voidmain()
return0;
......等等,等等,等等。
/
好了,warnings就简单介绍到这里了,希望您写的程序里一个warning也没有
errors
出现errors时,相对来说比较好解决一些,通常编译器会给你明确的提示
像,"
syntaxerrors"
"
unexpectedparenthesis"
unexpectedendoffile"
之类的,
常见的errors有以下几种类型
(1)语句缺少"
;
号
for(;
)
structbluguy
intx;
(2)括号不匹配
if(!
blueguy
Compile就这样结束了,下面接着看Linking
(2)Linking-链接
vc6.0上是没有Linking按钮的,或许是我菜了,/没注意到
vc6.0的Build把Compile与Linking合在一起了,/
链接的作用是将目标代码、系统的标准启动代码和库代码结合在一起,生成可执行程序。
在你Compile的时候,编译器假定所有的结构体、函数、全局变量都已经在别的文件里声明了,但这个假设并不总是成立的,
链接器就是在文件中查看这些结构体、函数以及全局变量是不是已经声明了,/
常见的LinkerErrors有以下几种,
1,"
undefinedfunction"
-不明确的函数(这可能是函数参数不匹配或者未包含相应的库或者函数没有函数原型造成的,/)
2,"
couldnotfinddefinitionforX"
-
使用的变量未定义,
3,"
multipledefinitions"
-多重定义(多个文件定义了相同的函数或全局变量)
(3)Build-创建
Build没什么好讲的,就是集成了Compile与Linking的功能。
将Compile与Linking分隔开来,可以让你能够单独编译文件,总之是为了方便管理的,/
顺便说一下,当您的程序出现了,warning或者Errors的时候,双击一下提示信息就可以定位到那一行,/
(1)普通断点,
普通断点是最简单,也是最常用的,只要在能够下断点的位置下上断点(按下F9,有的行是不能下断点的),上图中,断点下在blueguy=0;
这条语句上,也就是第9行,以下简称"
第9行"
,好,按下F5,程序立马就断在blueguy=0;
这条语句上。
断下来有什么用?
请跳转本文列表三:
(2)条件断点1-遇到断点一定次数后断下来
还是在图1的第9行下个断点,然后,按下Ctrl+b,弹出如下对话框
图2
condition1.jpg(32.56KB)
单击,at{"
blueguy.c"
}.9这一行后,弹出如下对话框
图3
condition2.jpg(39.05KB)
好,现在单击Condition按钮,弹出如下对话框
图4
condition3.jpg(50.53KB)
接下来,在stopping标识的文本框内填上一个你想要填上的数字,这里填的是6。
好,
单击OK按钮,再次按下F5,程序断在了第9行。
此时按下Ctrl+b可以看到
图5
condition4.jpg(34.93KB)
(2)条件断点2-某个变量(普通变量或指针变量)的值发生变化时断下来
还是在第9行下上断点,先按下F5,程序断在了第9行,按下Ctrl+b
弹出如下对话框
再按下Condition按钮,弹出如下对话框
condition3.jpg(36.24KB)
在Entertheexpressiontobeevaluated标识的文本框下
写上你想写入的变量,这里写的是blueguy,再按下F5,好,程序断在了第9行,并伴有下图提示
condition5.jpg(24.97KB)
(3)数据断点-某个表达式的值为真时断下来
单击下Date按钮,弹出如下对话框,
data1.jpg(41.11KB)
写上你想写的表达式,这里写的是greengirl==6
好,再次按下F5,程序断在了第9行,伴有下图提示:
见下楼,
data2.jpg(33.24KB)
如果你嫌麻烦的话,你也可以这样下断点
if(greengirl==6)
blueguy=0;
不过这样做,调试过后你得记得删除它,否则会给阅读代码选成视觉障碍,
好了,怎样下断点就讲到这里,如果你细心的话,会发现还有个Message按钮,那是消息断点,不怎么常用,
不在我的讲解之列,/
先上张大图
debug.jpg(146.13KB)
假设程序断在了第9行
点击调试工具条上的watch按钮
1,现在想查看下greengirl的值,只需把光标放在greengirl上选中,拖到watch窗口里就行了
2,watch窗口中,在整形变量后面加上"
c"
可以显示该变量对应的ASCII字符,也可以直接敲数字这么显示,比如118,c的对应值是'
v'
'
d就是显示字符'
对应的十进制ASCII码值是118,'
x显示的是对应的十六进制的ASCII码值
3,watch可以计算简单算式的值,例如:
blueguy-greengirl
点击调试工具条上的stack按钮
假设现在内存崩了,且崩在了第9行,stack显示了函数的调用关系,可以逐级向上检查错误
点击调试工具条上的memory按钮
memory窗口可以查看指针所指的内存区域里的值,使用时,把指针的值放在Address里就可以了,这在查看声音、图片、文件等大型数组的值时相当方便
(4)disassembly
有时内存崩了,弹出这个反汇编窗口,在这个窗口里可以看到相应的函数,不过用途不大。
还有两个不常用的窗口,不在我的讲解之列
就简单的介绍到这里了,反正这些都是很常用的,具体怎么用不在我的讲解之列
使用断言时,先加上头文件,"
assert.h"
断言是在条件表达式不成立的情况下,终止程序。
断言是用来调错的,不要用来作为异常处理语句
假设现在内存崩了,并且程序中有如下代码
char*blueguy=malloc(10000);
我现在想看看是不是blueguy分配失败了,
可以这样写个断言
char*blueguy=malloc(blueguy);
assert(blueguy);
现在假设blueguy分配失败,为空,那么编译器就会弹出类似下图的提示框
assert.jpg(32.26KB)
这个窗口上面写着错误在哪一个文件,哪一行
,此时找到那个文件,按下ctrl+g,在框内填上行数就可以定位到那一行。
五:
printf()
现在讲解下深受控制台下编程的朋友钟爱的printf()函数;
但请注意,不要迷恋printf();
因为他的功能并不是那么强大,想查看某个值的时候,断个点就可以,不用花力气去书写printf()输出语句。
不过printf()也有它的优点,想查看变量之外的信息的时候,还是很有用的
比如说,我想看下汉诺塔递归程序的函数调用路径
可以定义一个监视变量表示递归深度,/
Example:
//声明:
本人不保证程序能够正确运行,
#include<
stdio.h>
voidHanoi(intn,chara,charb,charc)
if(n==1)
{
while(n--)
"
Hanoi(%d,%c,%c,%c)\n"
n,a,b,c);
//cout<
<
a<
->
<
b<
endl;
//printf("
%c->
%c\n"
a,b);
return;
printf("
//先将n-1个盘子,以b为中转,从a柱移动到c
Hanoi(n-1,a,c,b);
//将一个盘子从a移动到b
//cout<
//printf("
//将c柱上的n-1个盘子,以a为中转,移动到b柱
Hanoi(n-1,c,b,a);
intN;
scanf("
%d"
&
N);
Hanoi(N,'
A'
'
B'
C'
当然,printf()还有其他的用途,关键看你怎么用了,不在我的讲解之列
有时候,前面介绍的调试技术(本文已经通过编程中国ISO9001认证)并不能直观的看到数据的变化,比如watch窗口太小了,放不下那么多的值...
Log是java/c#中的名词,c语言是没有提供这个调试功能的,实际上所谓的Log也没什么东西,无非是打开文件,写入数据罢了。
我们可以用c语言的fopen()、fwrite()等文件操作函数来仿写Log
这里要介绍两个用于调试的重要的宏
__FILE__
表示文件名
__LINE__
表示调用语句所在的行数
voidLog(void)
charbugInfo[200];
pFile=fopen("
E:
\\blueguyDebug.log"
a+"
);
sprintf(bugInfo,"
File:
%s
Line:
%d:
Hereisabug"
__FILE__,__LINE__);
fwrite(bugInfo,sizeof(bugInfo[0]),sizeof(bugInfo),pFile);
fclose(pFile);
不再多说了,继续看下一个调试技术
假设你现在在写windows应用程序,
程序出错了,你想用printf()函数来输出信息,很遗憾的告诉你,可能没有,
这个时候,您可以使用可变参数来仿写printf()函数
Trace(constchar*fmt,...)
chartext[256];
va_list
ap;
if(fmt==NULL)
return;
va_start(ap,fmt);
vsprintf(text,fmt,ap);
va_end(ap);
//在屏幕上画出这个字符串
至此,我所知道的调试技术已经介绍完了,这里列举的都是常见的,也是常用的,怎样去灵活运用这些调试技能,还是得靠自己多实践,记得某位哲人说过:
实践是检验真理的唯一标准
又记得某位哲人说过:
没有调查就没有发言权
常见的段错误
引用已被释放过的内存
int*blueguy(void);
int*greengirl=NULL;
greengirl
=blueguy();
greengirl[0]);
int*blueguy(void)
inta[10]={1,2,3,4,5,6,7,8,9,10};
returna;
引用未经初始化的指针
char*blueguy;
%s"
blueguy);
puts(blueguy);
栈溢出
//输入了小于0的值
intfactorial(intn);
intblueugy,greengirl;
blueguy);
greengirl=factorial(blueguy);
greengirl);
intfactorial(intn)
if(n==0)
return1;
}
returnfactorial(n-1)*n;
引用了错误的指针
//假设内存分配失配x==NULL
stdlib.h>
char*blueguy(void);
char*greengirl=blueguy();
greengirl[0]='
b'
puts(greengirl);
char*blueguy(void)
char*x=malloc(10);
strcpy(x,"
alueguy"
returnx;
数组越界
string.h>
char*a="
blueguy"
char*b=malloc(strlen(a));
strcpy(b,a);
puts(b);
小帖士:
(1)定义指针变量时就将其赋值为NULL
(2)malloc/free,fopen/fclose使用时一定要配对,
(3)free后,记得将指针置为NULL
调试的最高境界就是不去调试,怎样才能不去调试或者只需少量调试就能使程序正常跑起来呢?
答案是,深入学习c语言,培养c语言的审美感。
怎么说c语言也是一门语言,话都说不周整的人,
编程能力肯定不怎么样,/君不见,那些大牛们写起帖子来就像是写论文,像RockCarry、Knocker、forever74、jig、rootkit、rtgirl、starwing83、广陵绝唱..../(不再一一列举了)他们写的帖子,读起来就是不一样,像是读散文,/
哥最看不上的就是那些只会写两个字还让别人回去琢磨的"
高手"
...
最后,我引用一下<
cprimerplus>
的作者StephenPrata的一句话:
如果您想找一份编写软件的工作,则首先您应该能够回答"
是"
的一个问题就是:
请问,您会使用c吗?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC60 调试 指南 HappyDebugging