VC6.0 调试指南
/*****************************************
一:深入了解 Compile、Linking、Build
(1) Compile
(2) Linking
(3) Build
二:断点
(1) 普通断点
(2) 条件断点
(3) 数据断点
三:断点之后能做些什么?
(1)watch
(2)stack
(3)memory
四:断言
五:printf()
六:Log
七:Trace
八:常见的 段错误
结束语:怎样尽可能的避免错误
**********************************************************/
一:深入了解 Compile、Linking、Build
(1)Compile - 编译
当您点击 编译按钮时,编译器将会把你的源代码文件 (.c 文件)转换为目标
文件(.obj 文件) ,目标文件包含的是源代码文件翻译后的机器语言。这些
是不能被直接运行的,还需要 链接器将此中间代码与其他代码相结合来生
成可执行文件。请转看 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 一个值, 反
之亦然。
例如,
int main(void)
{
}
或者
void main()
{
return 0;
}
......等等,等等,等等。/
errors
出现 errors 时,相对来说比较好解决一些, 通常编译器会给你明确的提示。
像,"syntax errors", "unexpected parenthesis ", "unexpected end of file"之
类的,常见的 errors 有以下几种类型
(1)语句缺少 ";"号
例如,
for(;)
struct bluguy
{
int x;
}
(2)括号不匹配
例如,
int main(void)
{
if (!blueguy
Compile 就这样结束了,下面接着看 Linking
(2)Linking - 链接
vc6.0 上是没有 Linking 按钮的,或许是 我菜了,/ 没注意到。vc6.0 的 Build
把 Compile 与 Linking 合在一起了 ,/链接的作用是将目标代码、系统的
标准启动代码和库代码结合在一起,生成可执行程序。在你 Compile 的时
候,编译器假定所有的结构体、函数、全局变量都已经在别的文件里声明
了,但这个假设并不总是成立的,链接器就是在文件中查看这些结构体、
函数以及全局变量是不是已经声明了,/
常见的 Linker Errors 有以下几种,
1, "undefined function" - 不明确的函数 (这可能是函数参数不匹配 或者未
包含相应的库 或者函数没有函数原型造成的,/)
2,"could not find definition for X" - 使用的变量未定义,
3,"multiple definitions" - 多重定义(多个文件定义了相同的函数或全局变
量)
(3)Build - 创建
Build 没什么好讲的,就是集成了 Compile 与 Linking 的功能。将 Compile
与 Linking 分隔开来 ,可以让你能够单独编译文件,总之是为了方便管理
的,/顺便说一下,当您的程序出现了,warning 或者 Errors 的时候,双击
一下提示信息就可以定位到那一行,/
二:断点
(1) 普通断点,图 1
nomal.jpg (60.42 KB)
普通断点是最简单, 也是最常用的,只要在能够下断点的位置下上断点(按
下 F9,有的行是不能下断点的),上图中,断点下在 blueguy = 0;这条语句
上,也就是第 9 行,以下简称"第 9 行",好,按下 F5, 程序立马就断在 blueguy