什么是调试?怎么调试? |
您所在的位置:网站首页 › 昆曲是什么调式 › 什么是调试?怎么调试? |
文章目录
调试一、什么是BUG?二、调试什么是调试?调试的基本步骤如何发现bug的存在?
Debug和Release优化
三、常见错误编译型错误链接型错误运行时错误
四、Visual Studio 2019 调试环境介绍调试环境常用快捷键开始调试与断点逐过程与逐语句开始执行-不调试
调试时查看程序当前信息监视自动窗口和局部变量监视
内存调用堆栈查看汇编信息查看寄存器什么是寄存器
四、调试实例
本文中所有调试技巧,都是基于Visual Studio 2019 版本。 本文所使用IDE为Visual Studio 2019 版本,程序所展现的情况仅为此IDE环境导致,不引伸其它IDE或者编译器。 调试所有发生过的事情都一定有迹可循,如果问心无愧,就不需要就掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越同意顺藤而上,这就是推理的途径。一名优秀的程序员,同时也是一名优秀的侦探 一、什么是BUG?我想许多人都听过bug这个词,不管是否是软件相关专业的,但是不甚了解这个词究竟是什么含义。 软件的bug,狭义概念是指软件程序的漏洞或者缺陷,广义概念除此之外还包括测试工程师或者用户发现和提出的软件可以改进的细节,或与需求文档存在差异的功能实现等。 BUG 百度翻译为: (机器,尤指计算机的)故障,程序错误,缺陷 ;虫子;小昆虫;轻微的传染病;小病;热衷;着迷;窃听器 第一个BUG BUG,一词的原意是“臭虫”或者“虫子”。 1945年,计算机还是由机械师继电器和真空管驱动的,机器有房间那么大。提现当时技术水平的MarkII,是由哈佛大学制造的一个庞然大物。当技术人员正在进行不整机运行时,它突然停止工作。技术人员爬上去找原因,发现这台巨大的计算机内部的一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受到光和热的吸引,飞到了触点上,然后被高电压击打而死。 所以后来Bug这个名词就被沿用下来,用来表示电脑系统或者程序中隐藏的错误、缺陷、漏洞等问题。 二、调试 什么是调试?所谓调试(Debug),就是跟踪程序的运行过程,从而发现程序的逻辑错误(思路错误),或者隐藏的缺陷(Bug)。简单来说,就是找到程序错误,并且改正错误。 在调试的过程中,我们可以监控程序的每一个细节,包括变量的值、函数的调用过程、内存中数据、县城的调度等,从而发现隐藏的错误,或者低效的代码。 每个人都会遇到逻辑错误,而且会经常遇到,初学者更是会,额~,例如我这种,经常会错的离谱,所以,必须要掌握调试技能,没有选择的余地,没有学会调试就是没有学会编程。 放两个搞笑的图,供大家娱乐: 这就是我!!! 能够发现bug的存在,有三方人,第一是研发人员,第二是测试人员,第三是用户。而越往后发现bug产生的后果相对越严重。 开发人员 开发人员研发出产品的同时,也是制造BUG的过程,在开发过程中不可避免的会出现这样或者那样的bug。如果在开发过程中就发现bug的存在,这个怎么说呢?发现就发现呗,悄咪咪的改掉就好了啦。 测试人员 开发人员不可避免的生产出bug,而开发人员又不可能找出全部的bug,毕竟这就是开发自己写的嘛(我写的代码怎么会有bug),所以测试人员的存在是必须的,以便在产品交付之前尽可能多的找出bug,保证交给客户的软件质量要更好一些。 而开发和测试,一个是造bug的一个是找bug的,这个看起来就不怎么和谐。我们可以看一个段子,仅仅只是调侃: 绝对不可能…… 测试MM对阿猿说发现了一个Bug。 阿猿矢口否认:不可能,绝对不可能! MM:真的有Bug,你过来看一下! 阿猿:我都不用看,在我这儿好好儿的。 MM:你来看一下嘛…… 阿猿:看什么看,我都测过的,绝对没问题。 伴随着凳子响,阿猿不情愿的起身,脸上不耐烦的表情,心理却嘀咕着怎么回事儿呢这是…… 过了一阵儿,阿猿不好意思的声音响起:真没想到是这儿的问题……你怎么测的……一般用户都不会这么用的…… 用户 产品研发出来,就是为了给用户使用,如果是免费开源的产品,用户使用的时候发现bug,那么用户报给开发人员,进行修复就好了。但是有些软件的之所以存在,就是因为客户出钱,让开发人员进行研发,这种如果用户在使用期间出现了bug,在没有对客户造成损失的情况下,和气生财;如果让客户产生了损失,那就是“对簿公堂”喽~。(夸张了夸张了) Debug和Release
上述两图中,箭头所指的地方,我想对于使用VS这款IDE的初学者而言,是很陌生的,并且疑惑,这个是什么?有什么用? 通常我们在使用VS这款IDE时,箭头所指向的位置为Debug,而点一下方框内的小三角就可以改为Release。 Debug称为调试版本,它包含了调试信息,并且不做任何的优化,便于开发人员调试程序。 Release称为发布版本,它往往进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。测试人员所拿到的版本也是此版本。 我们可以通过查看同一个程序分别使用Debug和Release所生成的可执行文件来观看其差别: Debug版本: Release 通过上述两个图片,我们可以直观的看出,两个不同版本的可执行文件的大小差异很大,这正是因为Debug版本的文件里面包含了各种调试信息,并且编译器没有对程序进行优化。 所以我们说调试就是在Debug版本的环境当中,寻找代码中潜伏的问题的一个过程。 优化在介绍Debug和Release时,我们提到了编译器在Release版本的环境中在编译时会对程序进行优化,那么这个优化是怎么回事呢? 我们看到下面一段代码: 再次声明:本文所使用IDE为Visual Studio 2019 版本,程序所展现的情况仅为此IDE环境导致,不引伸其它IDE或者编译器。 #include int main() { int i = 0; int arr[10] = { 0 }; for (i = 0; i 窗口->反汇编![]() ![]() ![]() ![]() 寄存器是一块速度非常快的计算机内存,相比于其余存储设备,计算机的速度是最快的,同时也是造价最昂贵的。 通用寄存器主要有四种,这四个寄存器一般用来存放数组,也被称为数据寄存器。 AX:累加寄存器,它主要用于输入/输出和大规模的指令运算。 BX:基址寄存器,用来存储基础访问地址 CX:计数寄存器,CX 寄存器在迭代的操作中会循环计数 DX:数据寄存器,它也用于输入/输出操作。它还与 AX 寄存器以及 DX 一起使用,用于涉及大数值的乘法和除法运算。 段寄存器CPU中包含四个段寄存器,用作程序指令,数据或栈的基础位置。 CS:代码寄存器,程序代码的基础位置 DS:数据寄存器,变量的基本位置 SS:栈寄存器,栈的基础位置 ES:其他寄存器,内存中变量的其他基本位置。 牵引寄存器牵引寄存器主要包含段地址的偏移量。 BP:基础指针,它是栈寄存器上的偏移量,用来定位栈上变量 SP: 栈指针,它是栈寄存器上的偏移量,用来定位栈顶 SI : 变址寄存器,用来拷贝源字符串 DI : 目标变址寄存器,用来复制到目标字符串 借鉴于:https://www.cnblogs.com/mq0036/p/15667691.html 四、调试实例下面这段程序,在debug环境中,会死循环打印“hehe”,而在Release环境中只会打印12次“hehe”。 #include int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |