荥阳高端网站建设,一个空间如何做多个网站,网站开发项目报价单,网站免费空间什么是bug#xff1f;调试是什么#xff1f;有多重要#xff1f;debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好#xff08;易于调试#xff09;的代码。编程常见的错误。
什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bu…
什么是bug调试是什么有多重要debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好易于调试的代码。编程常见的错误。
什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bug世界上的第一个Bug是一支飞蛾这就是Bug的由来在早期的时候机器突然坏了工作人员进行检查最后发现是一只飞蛾导致机器故障所以也有了现在的Bug之称。
当天的工作人员将他贴在了笔记本上这就是时间上的第一个Bug。 调试是什么 我们在初学的时候会遇到各种各样的问题这个时候我们就需要进行调试这样才能解决Bug所以调试非常重要一个出色的程序员必须会调试 所有发生的事情都一定有迹可循如果问心无愧就不需要掩盖也就没有迹象了如果问心有愧就必然需要掩盖那就一定会有迹象迹象越多就越容易顺藤而上这就是推理的途径。 顺着这条途径顺流而下就是犯罪逆流而上就是真相。 但是我们在初学的时候总是盲目的调试可能只是简单摁下键盘上的F10调试一直到我们代码结束的时候只是走了一遍流程却不知道问题在哪里这就是我们初学者经常出现的问题。 所以我们要拒绝迷信调试要真正的找到问题所在解决这个臭虫
2.1 调试是什么 调试英语Debugging / Debug又称除错是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.2 调试的基本步骤
发现程序错误的存在以隔离、消除等方式对错误进行定位确定错误产生的原因提出纠正错误的解决办法对程序错误予以改正重新测试 而我们写程序的时候出现Bug生活中一般有三种人一是程序员自己二是测试员三是用户。 测试员就是相当于你写的代码经过relase之后到测试员那里它进行测试。 3 Debug和Release的介绍 Debug 通常称为调试版本它包含调试信息并且不作任何优化便于程序员调试程序。 就是相当于我们平常在编译器上写的代码 Release 称为发布版本它往往是进行了各种优化使得程序在代码大小和运行速度上都是最优的以便用户很好地使用。 这个就是我们的代码经过优化后呈现给用户的 那我们用代码给大家演示一下他们有什么不一样的地方 #includestdio.h
int main()
{int arr[10] { 1,2,3,4,5,6 };int i 0;for (i 0; i 10; i){arr[i] -1;}for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}上面就是我们在Debug和release下生成的可执行文件 很明显Release下的内存明显小了很多说名它进行过优化我们这是在X86平台下就是32位机器下当然我们改成X64也是一样的道理 3. Windows环境调试介绍 那我们在了解环境之前先要来了解一些东西比如就是快捷键何为快捷键就是让你变得快捷起来。 在我们的调试里头就有这些快捷键来介绍几个常用的 CTRL F5 这个键就是我们每次运行要得到我们的结果的时候用的它的意思就是开始执行不调试直接运行程序。 F11 这个就是一条一条语句往下执行我们在调试过程中这是必然不可缺少的它也可以进到我们的函数当中去。 F10 逐过程通常用来处理一个过程一个过程可以是一次函数调用或者是一条语句 F10和F11其实差不多就是后者更细致一点作用都是差不多的。
F9 创建断点和取消断点断点的重要作用可以在程序的任意位置设置断点。 这样就可以使得程序在想要的位置随意停止执行继而一步步执行下去。 F5 启动调试经常用来直接跳到下一个断点处. 下面举例子给大家看看断点有多方便。 #includestdio.h
int main()
{int arr[10] { 1,2,3,4,5,6 };int i 0;for (i 0; i 10; i){arr[i] -1;}for (i 0; i 10; i){printf(%d , arr[i]);}printf(\n);for (i 0; i 10; i){printf(hehe\n);}return 0;
}我们在上面设置了一个断点并且条件是i6那让我们按下F5看看吧。 上面我只按了一个F5就到了可是如果我按F10要经过一个半的for循环有时候按的快的时候一下子按过头了又要重新按小编一开始就是这么蠢大家学聪明点可见断点和F5连用是这么方便。 同时屏幕上也打印了6个-1 还有其他相当多的快捷键大家也可以去网上找找增加对VS的理解
会快捷键之后我们还需要学习一些其他的往下看 3.3 调试的时候查看程序当前信息
在窗口里有各式各样的好东西让我们来看看吧 当然我们这些窗口必须是要开始调试起来的时候才能看到我一开始学的时候不知道这个废了好大劲才找到我原来都没有开始调试。 监视窗口 任意选一个都可以在这里我们就可以输入我们想要监视的比如数组名还有数组的元素一些变量我们都可以看到它时刻的值当然大家也可以看到自动窗口和局部变量这些也都是监视的只不过它是自己生成的虽然很方便但是它有时候会自己变值总的来说还是不便于观察我们在学得时候小编建议大家还是自己尝试这样才能提升自己的调试技巧。 内存窗口 这个也很重要我们在栈上创建变量的时候都是占用空间的而我们会用相应的编号找到他们的位置这也是让我们更好的观察他们让我们更容易调试找到Bug。
3.3 查看调用堆栈 调用堆栈主要是反映逻辑关系比如我们过多的调用函数的时候不明白它的逻辑的时候可以使用 举个例子
#includestdio.h
void test1()
{printf(hehe\n);
}
void test()
{test1();
}
int main()
{test();return 0;
}我们返回的时候是下面这样 啥意思呢就是我们之前讲过函数栈帧一样栈是一步一步在顶上开辟然后一步一步返回的。
3.4 查看汇编信息 在函数栈帧讲过建议大家去看一下 3.5 查看寄存器信息 之前讲过esp和ebp还有edi这些他们的作用都是一样存储数据其中ebp和esp有维护函数栈帧的作用。
接下来给两个例子给大家调试一下看不过都是最基础的调试.
实例 实现代码求 123 … n! 不考虑溢出。 int main()
{int i 0;int sum 0;//保存最终结果int n 0;int ret 1;//保存n的阶乘scanf(%d, n);for(i1; in; i){int j 0;for(j1; ji; j){ret * j;}sum ret;}printf(%d\n, sum);return 0;
}我们的代码主要是为了计算阶乘的大小前几个阶乘相加计算出结果但是我们上面的代码其实是有问题的我们一步一步调试来看看首先我们要写出我们每次心里想的结果去对比编译器中监视进行对比找出问题。 调试之前可以像我一样把要观察的写出来 j循环的for语句执行一次,因为i1算出1的阶乘答案是对的。 我们看2的阶乘 其实我们在这里就能看出结果原因是我们是在原来的基础性上阶乘但是运气好答案是对的当我们继续往下走就会看出端倪 一看和我们预想的有问题这时候就要警惕如果我们第一次没看出来但是结果不一样这时候就要小心了不过很显然为什么造成这个原因我们在调试过程一看就才可以看出来了ret一直是在原来基础上改变所以我们给他进入循环的时候变成1就可以了。
改正
#includestdio.hint main()
{int i 0;int sum 0;//保存最终结果int n 0;int ret 1;//保存n的阶乘scanf(%d, n);for (i 1; i n; i){int j 0;ret 1;for (j 1; j i; j){ret * j;}sum ret;}printf(%d\n, sum);return 0;
}实例two
#include stdio.h
int main()
{int i 0;int arr[10] {1,2,3,4,5,6,7,8,9,10};for (i 0; i 12; i){arr[i] 0;printf(hehe\n);}return 0;
}想要解释这道题必须调试才能知道 给个前提必须在VS这个编译器下而且是X86Debug下别的一些编译器也行但还是有点初入这里我们不进行调试是做不出来下面调试。 当我们的i变成9的时候刚刚把原始数组都赋值为0 很神奇我们数组下标到9就应该结束但是现在竟然把arr[10]的内容赋值为0我们语句越界访问了 11也是i还在变大 arr[12]怎么放的是i的值好奇怪我们继续往下。 i突然变成0了arr[12]的内容也是0说明赋值成功但是i又变了。我们就要去怀疑他们是不是公用一个空间 结果一看还真是那就说明arr[12]和i用的是一个地址后来i又变成0了所以才会死循环讲到这里大家肯定明白了把 图 说面我们arr数组开辟的时候和i中间差两个整型我们数组的下标是由低地址到高地址的 今天我们先讲一部分调试技巧内容太多了小编写不动了谢谢大家