一、什么是bug?
第一次被发现的导致计算机错误的是飞蛾,也是第一个计算机程序错误。
bug的由来:
bug(原意是臭虫或者虫子),第一代计算机是由许多庞大的真空管组成,并利用大量的电力来使真空管发光。引得一只小虫子Bug钻进了一支真空管内,导致整个计算机无法工作。研究人员费了半天时间,总算发现原因所在,把这只小虫子从真空管中取出后,计算机又恢复正常。后来,Bug这个名词就沿用下来。
二、调试是什么?有多重要?
所以发生的事都是有迹可循,如果问心无愧,也就无需掩盖也就是没有迹象。如果问心有愧,那一定有迹象,迹象越多越容易顺通摸瓜,这就是推理的过程。
排查问题的时候,我们要做到:我们做什么?我们想做什么?我是怎么做的?做的过程中写了什么代码?
2.1 调试是什么?
调试(英语:Debugging/Debug):又称除错,发现一个程序错误的过程。
2.2 调试的基本步骤
发现程序错误的存在
定位排查错误
确定错误产生的原因
提出纠正错误的解决方法
对程序错误进行改正,重新测试
2.3 Debug和Release的介绍
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release称为发布版本(没法调试),它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,方便用户很好地使用。
软件上线的过程:
代码在Debug环境下代码展示:
代码在Release环境下代码展示:
代码在Release环境下代码展示:
Debug和Release比较,可以看出Release比Debug的程序代码小,代码也得到了优化, 但是我们不知道是怎么优化的。
下面我们继续看一个例子,探究一下:
#include <stdio.h> int main() { int arr[10] = { 0 },i; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
在Debug版本下执行程序,直接崩溃
在Release版本下执行程序,执行成功
变量在内存中开辟的顺序发生了改变,影响到了程序执行的结果。
结论:这就是优化导致的,
三、windows环境调试介绍
3.1 调试环境准备
在环境中选择debug选项,才能使代码正常调试:
3.2 快捷键
最常用的几个快捷键:
F5:
启动调试,经常用来直接跳到下一个断点处。
F9:
创建断点和取消断点。
断点的作用:可以在程序的任意位置设置断点,这样就可以使程序在想要的位置上任意停止执行,继而一步步执行下去。
F10:
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11:
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部;更加细致,可以进入函数观察函数执行的过程。(这是最常用的)
CTRL+F5:
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
注意:
如果说在你的电脑上f9、f10、f11不起作用,那是fn这个键的问题,关掉fn就可以了。(或者fn+f5;fn+f9;fn+f10;fn+f11)
展示:
扩展:
Ctrl+Tab 切换页面
Ctrl+D 粘贴光标所在行代码
Ctrl+/ 行注释掉/取消行注释
Ctrl+Shift+/ 块注释/取消块注释
Tab 向右缩进(两格)
Shift+Tab 回退一个制表符
Ctrl+Enter 当前行之前开辟一行
Ctrl+Z 撤销
Ctrl+Y 反撤销
Ctrl+A 全选
Ctrl+C 复制
Ctrl+V 粘帖
Ctrl+S 保存
Ctrl+F 快速查找
Ctrl+Shift+F 在文件中查找
Ctrl+H 快速替换
Home 回到行首
End 跳到行尾
Shift+Left/Right 向左/向右选中字符
Ctrl+Left/Right 以一个单词为粒度向左/向右移动光标
F4 显示属性窗口
F12 转到定义
Shift+Tab 取消制表符
F5 运行调试
Ctrl +F5 运行不调试
Shift+F5 结束调试
Ctrl+K+C 注释选中内容
Ctrl+K+U 取消注释内容
Ctrl+W+X 打开工具箱
Ctrl+E+W 自动换行
Ctrl+M+M 隐藏或展开当前嵌套的折叠状态
Ctrl+L 删除一行内容
Ctrl+E+D 排版整个文档格式
F11 逐语句调试
F10 逐过程调试
F9 启用/停止断点
Ctrl+Shift+F9 删除全部断点
Ctrl+E+S 查看空白
Ctrl+Alt+L 打开解决方案资源管理器。
F1 显示MSDN帮助。
Shift+Alt+F10 导入命名空间
Ctrl+F4 关闭当前标签窗口
Ctrl+Shift+空格键 查看参数信息
Shift+Alt+C 添加类
光标快速切换到下一行:Ctrl + Shift + Enter
光标快速切换到上一行:Ctrl + Enter
3.3 调试的时候查看程序当前的信息
3.3.1 查看临时变量的值
在调试开始之后,用于观察变量的值也可以观察地址。
3.3.2查看内存信息
在调试开始之后,用于观察内存信息
3.3.3 查看调用堆栈
在调试开始之后
通过调用堆栈,可以清晰的反映函数的调用关系以及当前调用所处的位置。
3.3.4查看汇编信息(反汇编)
在调试开始之后
方法一:右击鼠标,选择转到反汇编
方法二:
然后就可以切换到汇编代码
3.3.5 查看寄存器信息
可以查看当前运行环境的寄存器的使用信息
四、结论
在我们编写程序的过程中,会遇到很多bug,我们要去总结,迎难而上。
一定要熟练掌握调试技巧;平常写代码,多去调试,敢于调试,去定位问题,才能有进步。这里我写的都是一些简单的调试方法,务必要掌握。