中国小康建设网站,数字营销经理岗位职责,同一网站能否同时运行php和asp,精品网站开发1、什么是bug
这个故事很多人都知道 1947年9月9日#xff1a;第一个“Bug”被发现的时候#xff1a;“1949年9月9日#xff0c;我们晚上调试机器的时候#xff0c;开着的窗户没有纱窗#xff0c;机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了#xff0c;…1、什么是bug
这个故事很多人都知道 1947年9月9日第一个“Bug”被发现的时候“1949年9月9日我们晚上调试机器的时候开着的窗户没有纱窗机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了我们发现了一只被继电器拍死的飞蛾翅膀大约4英寸。” 第一次被发现的导致计算机错误的飞蛾也是第一个计算机程序错误而bug这个名词也被延用至今。
2、调试是什么
1调试的概念
调试英语Debugging / Debug又称除错是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2调试的基本步骤
发现程序错误的存在以隔离、消除等方式对错误进行定位确定错误产生的原因提出纠正错误的解决办法对程序错误予以改正重新测试总结错误的原因
3拒绝迷信调试
3、debug和release
1两者的概念
Debug 称为“调试版本”它包含调试信息并且不作任何优化便于程序员调试程序。Release 称为“发布版本”它往往是进行了各种优化使得程序在代码大小和运行速度上都是最优的以便用户很好地使用。
2Debug和Release的区别
文件区别Debug和Release模式下会在项目文件里面各自生成一个Debug和Release文件反汇编区别他们两个的反汇编代码有着明显差别一般来说Debug比Release多内存区别由于Debug包含了调试信息所以会比release的内存要大应用区别Debug用于程序员调试release交予测试员和用户使用运行区别release会在一定程度上对代码进行优化这也是其内存较小的原因之一
3以下代码的运行在Debug和Release模式下运行结果可能不同
#include stdio.h
int main()
{int i 0;int arr[10] {0};for(i0; i12; i){arr[i] 0;printf(hehe\n);}return 0;
}4、windows环境调试介绍 Linux中的调试工具是gdb 1模式调整
必须要在Debug模式中才能使得代码正常调试
2VS快捷键
F5启动调试经常用来直接跳到下一个断点处shiftF5取消调试在不想调试的时候可以用这个功能停止调试ctrlF5开始执行不调试如果你想要程序直接跑起来而不调试就可以直接使用F9创建/取消断点断点可以使程序在想要的位置任意停止继而一步步执行下去在循环语句中尤其好用F10逐过程通常用来处理一个过程一个过程可以是一次函数调用或者一条语句F11逐语句就是每次都执行语句这个快捷键可以使得我们的执行逻辑进入函数内部是最为常用的快捷键执行调试比较细一点更多快捷键
3调试窗口 查看临时变量的值监视在vs2022调试状态下----窗口----监视 一个小技巧如果是监视指针将格式写为【指针,数字】就可查看该指针后面指针的值 查看内存信息在vs2022调试状态下----窗口----内存 查看调用堆栈在vs2022调试状态下----窗口----调用堆栈 通过调用堆栈可以清晰反应函数的调用关系以及当前调用所处的位置这个涉及到数据结构的栈 查看汇编信息 第一种查看方法调试开始之后右键代码选择“转到反汇编”第二种查看方法在vs2022调试状态下----调试----窗口----反汇编 查看寄存器信息在vs2022调试状态下----调试----窗口----寄存器 通过寄存器窗口可以看到当前运行环境的寄存器运行信息如果记住寄存器的名字还可以在监视窗口里面查看寄存器的 查看自动窗口在vs2022调试状态下----调试----窗口----自动窗口 会自动添加、自动取消添加一些变量的信息 查看局部变量在vs2022调试状态下----调试----窗口----局部变量
5、一些调试的实例
1实例1实现代码求 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;//问题在这里的上一步没有加上ret 1;for(j1; ji; j){ret * j;}sum ret;}printf(%d\n, sum);return 0;
}//这时候我们如果3期待输出9但实际输出的是15。2实例2研究程序死循环/异常终止的原因
#include stdio.h
int main()
{int i 0;int arr[10] {0};for(i0; i12; i){arr[i] 0;printf(hehe\n);}return 0;
}
//这个代码在Debug模式下就会死循环或者异常终止要看环境的具体实现在Release模式下就会停止这就是优化导致的
//比如在我的vs2022中x86是死循环的x64是在结尾终止的6、如何写出易于调试的代码
1优秀的代码
代码运行正常bug很少效率高可读性高可维护性高注释清晰文档齐全
当然还有很多很多类似的比较体系化的技巧。
2常见的编码技巧
使用assert尽量使用const养成良好的编码风格添加必要的注释避免编码的陷阱
3const的作用
使得变量具有常属性可以让代码具有鲁棒性、健壮性能够应对一些异常的情况
int main()
{const int m 100;const int * p m;const int ** pp p;int *** ppp pp;***ppp 200;printf(%d\n, m);return 0;
}#include stdio.h
//代码1
void test1()
{int n 10;int m 20;int *p n;*p 20;//ok?p m; //ok?
}
void test2()
{//代码2int n 10;int m 20;const int* p n;*p 20;//ok?p m; //ok?
}
void test3()
{int n 10;int m 20;int *const p n;*p 20; //ok?p m; //ok?
}
int main()
{//测试无cosnt的test1();//测试const放在*的左边test2();//测试const放在*的右边test3();return 0;
}4模拟strcpy函数
①官方库里的写法
/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
* Copies the string src into the spot specified by
* dest; assumes enough room.
*
*Entry:
* char * dst - string over which src is to be copied
* const char * src - string to be copied over dst
*
*Exit:
* The address of dst
*
*Exceptions:
*******************************************************************************/
char * strcpy(char * dst, const char * src)//(目的数组,源头数组)
{char * cp dst;assert(dst src);while(*cp *src); /* Copy src over dst */return (dst);
}//其函数就是将一个字符串数组的内容拷贝到另外一个字符串数组中②自己定义的写法
//方法一
void my_strcpy(char* dest, char* src)//(目标数组源头数组)
{while(*src ! \0){*dest *src;}*dest *src;//\0的拷贝
}
//方法二
void my_strcpy(char* dest, char* src)
{while(*dest *src){;}
}
//方法三
void my_strcpy(char* dest, char* src)
{//断言或者改成assert(dest src)assert(dest ! NULL);assert(src ! NULL);while(*dest *src){;}
}
//方法四
void my_strcpy(char* dest, char* src)
{//断言或者改成assert(dest src)assert(dest ! NULL);assert(src ! NULL);while(*dest *src){;}
}
//方法五
char* my_strcpy(char* dest, char* src)
{assert(dest src);char* ret dest;while(*dest *src);return ret;
}5模拟strlen函数
#include stdio.h
#include assert.h
int my_strlen(const char* str)
{int count 0;assert(str);//assert(str ! NULL);//断言的使用while(*str)//while (*str ! \0){count;str;}return count;
}
int main()
{int len my_strlen(abcdef);printf(%d\n, len);return 0;
}7、编程常见的错误
编译型错误直接看错误提示信息双击VS2022中的错误列表解决问题。或者凭借经验就可以搞定。相对来说简单链接型错误看错误提示信息主要在代码中找到错误信息中的标识符然后定位问题所在。一般是标识符名不存在或者拼写错误一般会出现字眼“无法解析的外部命令” 运行时错误借助调试逐步定位问题最难搞 文章转载自: http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.xptkl.cn.gov.cn.xptkl.cn http://www.morning.lxfyn.cn.gov.cn.lxfyn.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.bnmrp.cn.gov.cn.bnmrp.cn http://www.morning.rjnrf.cn.gov.cn.rjnrf.cn http://www.morning.gbtty.cn.gov.cn.gbtty.cn http://www.morning.xkjrq.cn.gov.cn.xkjrq.cn http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.khzml.cn.gov.cn.khzml.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.gnfkl.cn.gov.cn.gnfkl.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.fqklt.cn.gov.cn.fqklt.cn http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.hqwtm.cn.gov.cn.hqwtm.cn http://www.morning.mnlk.cn.gov.cn.mnlk.cn http://www.morning.pdwzr.cn.gov.cn.pdwzr.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.wmqxt.cn.gov.cn.wmqxt.cn http://www.morning.bctr.cn.gov.cn.bctr.cn http://www.morning.krrjb.cn.gov.cn.krrjb.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.dwzwm.cn.gov.cn.dwzwm.cn http://www.morning.lwgsk.cn.gov.cn.lwgsk.cn http://www.morning.hlnrj.cn.gov.cn.hlnrj.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.lzjxn.cn.gov.cn.lzjxn.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.pmftz.cn.gov.cn.pmftz.cn http://www.morning.drcnn.cn.gov.cn.drcnn.cn http://www.morning.wckrl.cn.gov.cn.wckrl.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.jnvivi.com.gov.cn.jnvivi.com http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn http://www.morning.lhptg.cn.gov.cn.lhptg.cn http://www.morning.nuobeiergw.cn.gov.cn.nuobeiergw.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.clccg.cn.gov.cn.clccg.cn http://www.morning.wnkqt.cn.gov.cn.wnkqt.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.kpwcx.cn.gov.cn.kpwcx.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.nytqy.cn.gov.cn.nytqy.cn http://www.morning.dtpqw.cn.gov.cn.dtpqw.cn http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.gxfzrb.com.gov.cn.gxfzrb.com http://www.morning.rttxx.cn.gov.cn.rttxx.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.gbsfs.com.gov.cn.gbsfs.com http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.trkhx.cn.gov.cn.trkhx.cn http://www.morning.txrq.cn.gov.cn.txrq.cn http://www.morning.pqfbk.cn.gov.cn.pqfbk.cn http://www.morning.grcfn.cn.gov.cn.grcfn.cn http://www.morning.qzfjl.cn.gov.cn.qzfjl.cn http://www.morning.wrkcw.cn.gov.cn.wrkcw.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.hdzty.cn.gov.cn.hdzty.cn http://www.morning.qkrz.cn.gov.cn.qkrz.cn http://www.morning.fllfz.cn.gov.cn.fllfz.cn http://www.morning.dkqr.cn.gov.cn.dkqr.cn http://www.morning.rqfzp.cn.gov.cn.rqfzp.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.ybgpk.cn.gov.cn.ybgpk.cn http://www.morning.nzkc.cn.gov.cn.nzkc.cn http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn http://www.morning.nrbqf.cn.gov.cn.nrbqf.cn