零基础入门C语言第八课:实用代码调试技巧

零基础入门C语言第八课:实用代码调试技巧,第1张

零基础入门C语言第八课:实用代码调试技巧 第八课:实用代码调试技巧

目录

第八课:实用代码调试技巧

1.1·什么是BUG?

1.2·什么是调试?

1.3·VS stuido调试环境及技巧

1.4·调试实例


一图搞定全部内容:


1.1·什么是BUG?

 

 
葛丽丝·穆雷·霍普(英语:Grace Murray
Hopper,1906年12月9日-1992年1月1日),女,本姓穆雷(Murray),霍普(Hopper)为夫姓。

美国海军准将及计算机科学家,世界最早一批的程式设计师之一。她创造了现代第一个编译器A-0系统,以及商用电脑编程语言"COBOL",被誉为COBOL之母。

她是国外非常有名的女性工程师,拿到了耶鲁大学的硕士学位,在国外的瓦萨学院担任副教授。在担任副教授期间,提出了离职。去美国海军接手了马克一号计算机,上图左上角。马克一号计算机是一个非常庞大、最早的计算机。

它是被放在一个仓库里面的,由很多的继电器等电气设备组成。在有一天,计算机突然就停止工作了,于是在一个一个继电器里面去找问题,然后终于在某一个继电器里面找到了一个被电死的虫子,上图的右下角用胶带封住的虫子。原来是因为这个继电器里面飞入了这个虫子,导致计算机停止了工作。把这个虫子拿出来之后,计算机恢复了正常工作,因此葛丽丝·穆雷·霍普就把这个虫子粘在了自己的笔记本上面,并且在下面做了一个注释。说这是历史上第一个被发现的计算机Bug。

其实Bug的源意就是虫子的意思,在这之后,在我们软件行业就一直流传着一句话,找bug。

那么Bug就是指影响软件不能正常运行的问题,我们都把它统称为Bug,或者叫做缺陷。

葛丽丝·穆雷·霍普 英语:Grace Murray Hopper 记录的这一个虫子,以及写上的注释,就标志着咱们Bug的诞生。也就是为什么咱们现在都把缺陷叫做Bug,就是源于这里。
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。
 


1.2·什么是调试?

我们平时是怎么写代码的呢?

哈哈,可能很真实,确实大部分程序员都这样的,即便在企业干的程序员也是这样出现BUG然后才知道去找问题所在,并没有一开始就思考代码结构逻辑等问题。

这副图就更加生动形象了!我们一定要杜绝这种瞎搞式改BUG方法。

调试是什么?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的基本步骤:
①发现程序错误的存在
②以隔离、消除等方式对错误进行定位
③确定错误产生的原因
④提出纠正错误的解决办法
⑤对程序错误予以改正,重新测试

编译器的调试版本:Debug和Release

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。


Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
 

举例:

#include int main(){char *p = "hello bit.";printf("%s
", p);return 0;}

在Debug上调试:两者可执行程序大小有较大差距

在Release上调试:

Debug和Release的反汇编 :

 

 

又比如:

#include int main(){int i = 0;int arr[10] = {0};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe
");}return 0;}//在Debug模式去编译,程序结果是死循环//在Release模式去编译,程序没有死循环//原因是因为优化导致的

 

1.3·VS stuido调试环境及技巧

VS-studio快捷键:

F5:启动调试(经常用来直接跳到下一个断点处)

F9:创建断点、取消断点(断点的使用:可以在任意位置设置断点,这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去)

F10:逐过程(通常用来处理一个过程,一个过程可以是一次函数调用,或者一条语句)

F11:逐语句(就是每次执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部)

ctrl+F5:开始执行不调试(如果你想让程序直接运行起来而不调试就可以直接使用)

 

查看临时变量的值:调试开始之后,用于观察变量值(调试->窗口->监视)

①查看内存的信息:调试->窗口->内存

②查看调用堆伐:调试->窗口->调用堆伐

③查看汇编信息:方法1:右键->转到反汇编   方法2:调试->窗口->反汇编

④查看寄存器信息:调试->窗口->寄存器(可查看当前运行环境的寄存器信息)

 

编程常见的错误:

①编译型错误:直接查看提示信息(双击或触碰红色波浪显示)、解决问题或凭借报错经验搞定。

②链接型错误:看错误提示信息,主要在错误代码中找标识符。一般都是标识符不存在或者拼写错误。

③运行时错误:这个最难搞,要借助调试逐步定位问题所在。这种还是跟程序员设计代码逻辑以及框架有关,说白了写代码质量问题(建议看《高质量的C/C++编程》和深入学习下数据结构)。

 

 

寄语:多多动手,尝试调试,才能有进步

一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写
程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率。


1.4·调试实例

实例1:实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。

问题所在:这时候我们如果输入3,期待输出9,但实际输出的是15

请问为什么?

#includeint 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;        for(j=1; j<=i; j++)        {            ret *= j;        }            sum += ret;   }  printf("%d
", sum);  return 0;}

实例2:请通过调试研究程序死循环的原因

#include int main(){    int i = 0;    int arr[10] = {0};    for(i=0; i<=12; i++)    {        arr[i] = 0;    printf("hehe
");    }return 0;}

注:这里两个实例都不给出答案了,直接说了就没意思了,请大家自行调试得出结论,欢迎留在评论区里。
 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5713566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存