您的位置: 首页 - 站长

asp网站建设技术方案服务器网站模板

当前位置: 首页 > news >正文

asp网站建设技术方案,服务器网站模板,安卓市场app下载,加载wordpress外部文件路径一.什么是BUG#x1f41b;Bug一词的原意是虫子#xff0c;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题#xff0c;人们也叫它bug。这是为什么呢#xff1f;这就要追溯到一个程序员与飞蛾的故事了。Bug的创始人格蕾丝赫柏#xff08;Grace Murray H…一.什么是BUGBug一词的原意是虫子而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题人们也叫它bug。这是为什么呢这就要追溯到一个程序员与飞蛾的故事了。 Bug的创始人格蕾丝·赫柏Grace Murray Hopper是一位为美国海军工作的电脑专家也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字正是由赫柏所取的。1947年9月9日赫柏对Harvard Mark II设置好17000个继电器进行编程后技术人员正在进行整机运行时它突然停止了工作。于是他们爬上去找原因发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾这显然是由于飞蛾受光和热的吸引飞到了触点上然后被高电压击死。所以在报告中赫柏用胶条贴上飞蛾并把“bug”来表示“一个在电脑程序里的错误”“Bug”这个说法一直沿用到今天。格蕾丝·赫柏的报告二.调试及其重要性2.1 什么是调试所有发生的事情都一定有迹可循如果问心无愧就不需要掩盖也就没有迹象了如果问心有愧就必然需要掩盖那就一定会有迹象迹象越多就越容易顺藤而上这就是推理的途径。顺着这条途径顺流而下就是犯罪逆流而上就是真相。而我们程序员就好比一个侦探一个用来寻找bug修改bug的侦探。人们将这个过程叫做Debug(中文称作调试)意即捉虫子或杀虫子。每一次调试都是尝试破案的过程。调试英语Debugging / Debug又称除错是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。2.2 调试的基本步骤发现程序错误的存在以隔离、消除等方式对错误进行定位确定错误产生的原因提出纠正错误的解决办法对程序错误予以改正重新测试本文将详细介绍在windows系统的VS环境下的调试过程。2.3 Debug与Release的介绍在VS中我们会发现我们的程序可以在两个环境下运行这两个环境就是Debug版本和Release版本它们二者有何区别呢VS中的Debug与ReleaseDebug 通常称为调试版本它包含调试信息并且不作任何优化便于程序员调试程序。Release 称为发布版本它往往是进行了各种优化使得程序在代码大小和运行速度上都是最优的以便用户很好地使用。 我们可以分别在两种环境下编译代码生成对应的可执行程序如下显然Release版本的可执行文件比Debug版本的小很多说明编译器对其作了优化。因此我们日常所说的调试是在Debug版本的环境下进行的这是因为Release版本无法进行调试其调试信息被编译器优化了。而对于测试人员来说由于要站在用户的角度上来测试程序是否能正常使用因此测试是在Release版本的环境下进行的。那么Release版本下编译器可能会做什么优化呢请看如下代码#include stdio.hint main() {int i 0;int arr[10] {0};for(i0; i12; i){arr[i] 0;printf(hehe\n);}return 0; }我们很容易就发现对数组进行了越界访问当程序运行起来时应该会崩溃。但是在Debug环境下我们发现程序并没有崩溃而是陷入了死循环我们运行调试代码转到反汇编如下我们知道数据在栈上的开辟是从高地址向低地址处开辟的因此在Debug环境下变量i的地址比数组arr的地址高。而在数组内部数据的存储是从低地址向高地址的因此首元素地址arr是在数组所在空间的低位如下我们很惊讶的发现arr12就是变量i的地址。当循环过程中i等于12时此时将arr[i]改为0就等价于将i的值修改为0然后i后i等于1小于12继续进行循环依次反复形成了死循环。如下整个过程简化图如下而在Release版本的环境下程序并不会出现死循环的问题我们可以打印出此时变量i和数组在栈上的地址如下我们发现此时变量i被编译器优化到低地址处arr[12]存储的值就不是i了便不会出现死循环的情况。综上以上代码在Release版本下编译器使变量在内存中开辟的顺序发生了变化影响到了程序执行的结果这便是优化带来的好处。三.windows环境下调试介绍✨首先第一步我们需要将环境切换为Debug版本才能进行调试3.1 常用快捷键介绍以下是在调试过程中最为常用的几个快捷键快捷键功能CtrlF5开始执行而不进行调试。用于想让程序直接运行起来而不调试时。F9作用创建断点和取消断点断点可以使程序在任何你想停下的地方停止执行继而一步步执行下去。我们可以在任何地方设置断点一个程序也可以有多个断点。F10逐过程通常用来处理一个过程一个过程可以是一次函数调用或者是一条语句。F11逐语句每次只执行一条语句我们可以通过这个快捷键使我们的执行逻辑进入函数内部这是F10所不具备的F11是我们在调试过程中最常用的F5启动调试到下一断点处需要配合F9进行使用如果程序没有断点则无异于CtrlF5快捷键用法我们还可以对某一断点设置停止条件方法是右键断点-单击条件-输入断点条件-关闭例如我们需要让程序停止在第4次循环处我们可以输入i4此时单击F5运行到断点我们查看自动窗口发现程序在停止时i的值为43.2 在调试过程中查看程序当前信息开启调试后我们可以在VS上方的调试-窗口看到许多用来查看数据信息的窗口3.3.1 监视窗口通过监视窗口我们可以查看我们想要查看的变量甚至是表达式的值在程序运行过程中的变化十分灵活这是我们调试中用得最多的窗口之一。如下3.3.2 自动窗口打开自动窗口后编译器会将一些可能需要观察的变量显示在窗口中较为方便。其缺陷是可能无法显示我们真正需要观察的变量并且无法灵活显示表达式等的值。如下3.3.3 监视窗口打开局部变量变量窗口会将程序中的所有局部变量全部显示出来。如下3.3.4 调用堆栈窗口通过调用堆栈可以清晰的反应函数的调用关系以及当前调用所处的位置。如下通过调用堆栈窗口我们可以发现show函数栈帧在main函数栈帧之上即show函数是由main函数调用的。并且可以看出此时show函数运行到第20行。3.3.5 内存窗口通过内存窗口我们可以看到内存中的信息可以观察变量在内存中的存储情况。如下3.3.6 反汇编我们可以查看当前程序转化后的汇编代码进而从更底层的角度观察程序的执行过程。如下3.3.7 寄存器通过寄存器窗口我们可以观察在当前环境下CPU内的寄存器的使用信息如ebp栈底寄存器、esp栈顶寄存器等等。3.3 调试实例我们上面通过调试分析了数组越界陷入死循环的问题。下面我们再通过一道实例来掌握调试的技巧实现代码求 123 … n! 不考虑溢出。我们可能会写出以下代码#includestdio.h 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; }当你输入3时理论上应该输出9但实际上程序却输出了15是什么问题导致出错了呢这就需要我们动手进行调试。在调试之前我们可以先预测问题的所在比如算阶乘时出错、求和时出错等等。做到心里有数而不是盲目的进行调试。我们可以在ret*j处设置一个断点打开监视窗口监视ret和sum观察每个数阶乘的值和累加后的值如下我们单击F10逐过程执行当外层循环i的值为3时即计算3的阶乘时我们发现ret的初始值并非为1而是2的阶乘。此时再计算3的阶乘就是2*1*2*312 ! 6结果出错最后sumret的值就为15与我们的输出相符可见每次在求阶乘时我们都应该把ret重置为1正确的代码如下int 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; //将ret置1for (j 1; j i; j){ret * j;}sum ret;}printf(%d\n, sum);return 0; }3.4 实践出真知任何事情都不可能一蹴而就一定要多加练习才能熟练掌握调试技巧。一个初学者可能80%的时间在写代码20%的时间在进行调试而一个程序员可能80%的时间在进行调试剩余20%的时间才是在写代码。随之学习的深入后续可能会出现很多更加复杂的调试场景如多线程等。只有打好基础在未来才能融会贯通利于不败之地。多多使用快捷键可以很大程度上提高效率。四.如何写出便于调试的优秀代码4.1 什么是优秀的代码1. 代码运行正常2. bug很少3. 效率高4. 可读性高5. 可维护性高6. 注释清晰7. 文档齐全4.2 常用coding(编码)技巧1.多使用assert断言可以告知你出错的位置2.尽量使用const避免意外修改3.养成良好的编码风格4.添加必要的注释5.避免编码的陷阱4.3 实例试模拟实现一个strcpy函数尽量用到上述的编码技巧。如下char* strcpy(char* dst, const char* src) //const修饰防止对源字符串进行修改 {assert(dst src); //避免传入空指针char cur dst; //保存起始位置//将src的字符一个个拷贝到det中包括\0while ((*dst *src)!\0){;}return cur; //返回目标字符串以便链式访问 }五.编程中常见的错误5.1 编译型错误在编译期间出现的错误。直接看错误提示信息双击鼠标解决问题。或者凭借经验就可以搞定。相对来说简单。5.2 链接型错误在链接期间出现的错误。看错误提示信息主要在代码中找到错误信息中的标识符然后定位问题所在。一般是标识符名不存在或者拼写错误。5.3 运行时出错在运行期间出现的错误。借助调试逐步定位问题。最难搞的一种错误不要害怕遇到错误每出现一次的错误就是一次突破自我的机会。学会积累排错经验勇于尝试。不经风雨怎能见彩虹 以上就是本期的全部内容啦制作不易能否点个赞再走呢