优秀程序猿调试技巧Debug与Release

目录
  • Bug
  • 调试的重要性
  • 调试基本步骤
  • Debug与Release
  • 快捷键
  • 如何写出易于调试(优秀)的代码
  • 常见的coding技巧

Bug

bug意为臭虫,计算机术语里就是幺蛾子,对,你的程序又出幺蛾子了。为什么要叫bug?关于这个还有段有趣的历史

有一天赫柏正愉快地敲着Mark Ⅱ的代码时,计算机突然就停止运作了,那时的计算机远不如现在小巧,赫柏他们只能一个个排查计算机庞大的处理器群,经过一段时间的排查后停机原因终于被找到了。原来是一只飞蛾被计算机的光和热吸引,触发了电脑的短路,当然这只可怜的飞蛾也一命呜呼了按理说一般人也就是把飞蛾拿走,然后重启下电脑也就完事了,但赫柏显然不是一般人她小心翼翼地把这只飞蛾拿了下来,然后把它工工整整地粘在了记事本上… …

这就是历史上第一个 bug 的诞生。

调试的重要性

我估计前期我们找 bug 都是用眼睛瞅,特别是我们这种大一的刚接触的,现在还好,到了以后需要写大工程的时候,眼瞅不头疼的才是大哥,对于一个成熟程序员20%时间写代码而80%时间在调试代码。
我们写代码就是一个推理的过程,整个流程的正确与错误都是有迹可循的,推理的途径就是这些迹象。
一名优秀的程序员就是一个优秀的侦探,找到迹象,顺流而下是错误,顺流而上是真相,调试就是我们破案的过程。

调试基本步骤

1.找错(进行隔离,消除来定位错误)

2.知道错因

3.寻找解决办法

4.纠正,重测

Debug与Release

Debug(Debugging),即排错,称为调试版本,不作任何优化,包含调试信息,便于我们调试程序。

Release ,即释放,成为测试版本,往往进行各种优化,让代码在大小和运行速度上都是最优的,面向用户,可以很好的使用。但是!注意Release版本是没法进行调试的,这种观点仅限于我当前知识面的限制,实际上Release也是可以的,下面是大佬对我的指正意见:

快捷键

在调试过程中,掌握一些快捷键会大大增加我们的效率。以vs2019为例,我们先会设置断点如图(行标左侧设置)

断点设置在需检查代码的任意位置,运行到这一步就会停下给我们报告。断点完F5调试,执行窗口弹出后就会发现调试就会出现更多内容,我框出来的在之前记录C语言学习时都有用到。

注意F5是调试,Ctrl+F5是运行,通常会使用会F5跳到想要的断点处,有些电脑上比较装怪,快捷键没反应的,建议多按一个Fn键试试,Fn是功能辅助键,相当于一个开关,本质上 F5+Fn = F5。需要强调的是逐语句和逐过程,如果你想看每个细节,不放过每一个角落就用逐语句,两者的力度是不一样的,逐过程会跳过代码里的函数部分。
vs玩家重点推荐 Ctrl+k+c,注释选中行;Ctrl+k+u,取消注释,熟练运用会很方便。

其余还有很多不赘述,下面准备了超全的实用快捷键用法:

超全整理visual studio快捷键使用技巧

除了用调试验证代码的正确性,还可以用于研究具体的问题,举个栗子:
这道题是Nice的面试真题

请说明下面代码是否能正常运?运行结果是什么?为什么会出现这个结果?

int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf(“hehe\n”);
}
return 0;
}

这里当我们打开调试窗口直接开调:

很直观的可以发现,哦,原来是i与arr[12]相同,我们发现在arr[12]改变时i第的值也会随之改变,那我就直接取出他们都地址看一看是不是一样的。

OMG,是一样的。但我们这里的调试只能看到现象,他底层的原理我们要自己思考。

其死循环的逻辑大致是这样的,我们创建了一个变量i,arr,他们都是局部变量,而局部变量时放在栈上的,栈区上内存使用习惯是先使用高地址存储空间,再使用低地址。这里注意,我们开始给的十个大小的空间,i的变量是到12,这里明显是越界访问,但为什么没有报错停下来?结合我们刚刚监视的结果,我们再把格局打开:

数组随着下标的增长,地址是由低到高的变化,在我数组适当越界时,如果i和arr之间的空间适当的话,就有可能使arr向后越界时就访问到了i,造成了循环变量的i改变,最终会死循环。

这种错误其实存在偶然性,首先i和arr[12]相同,只是恰巧,但如果我把i换成11,结果就大相径庭了,我只形成了越界但没有改变循环变量i的值。其次,这个代码是严重依赖环境的,比如在VC 6.0里面i和arr就是连续的,gcc里面i和arr之间有一个空间。

打趣的是,我们在Release版本里面是不会报错并且会停下来,其实在刚刚的截图里面也是会报错的,但是!死循环停不下来,他根本没时间来报错。Rlease的优化并不是万能的,不要期待利用Release版本来掩盖代码的bug,最好的做法就是不要越界。

如何写出易于调试(优秀)的代码

1.硬性要求运行正常

2.bug少(估计没人敢保证零bug吧)

3.效率高

4.可读性高

5.可维护性(容易修改与二创)

6.注释(方便阅读)

7.文档齐全

常见的coding技巧

1.使用assert

意为断言,在代码执行前设的前哨,比如我们函数传参时,当我传的内容变成空指针,后面如果函数进行解引用操作,对于空指针解引用是会造成程序崩溃的,是很危险的,所以我们用assert当监护人能快一步该诉我们问题在这里;设置assert也是一个好习惯,面试官见了直呼老司机!

# include<assert.h>
void my_str(char* a, char* b)
{
	assert(a != NULL && b != NULL);//断言
	while (*b != '\0')
	{
		*a = *b;
		b++;
		a++;
	}
	*a = *b;
}
int main()
{
	char arr[10] = {0};
	char arr2[] = "bit";
	my_str(NULL, arr2); // 故意设成NULL程序会崩溃
	printf("%s\n", arr);

	return 0;
}

效果如上图就会显示断言失败。

2.尽量使用const

const常变量修饰符。

就上面模拟strcpy函数,如果有天有个内鬼改了你的代码,写成 *b = *a,就拷反了,编译器也会傻不拉叽的输出,尽管结果什么都没有。那怎么办呢?我在开头就定义好

char* my_str(const char *a,const char* b)

这样不管你咋改,我 *a,*b都是无法改变的。

注意const int *p=&a , const 在 * 左边时,修饰的是指针指向的内容,指针变量不影响 ;在 * 右边是,修饰指针本身,指针变量不能修改,其内容可以通过指针来改变。

3,形成良好的编码风格

4.注释!注释!注释!(好习惯讲三次)

5.避免编码陷阱

今天就到这里了,摸了家人们,更多关于Debug与Release调试技巧的资料请关注我们其它相关文章!

(0)

相关推荐

  • JS调试必备的5个debug技巧

    1. debugger; 我以前也说过,你可以在JavaScript代码中加入一句debugger;来手工造成一个断点效果.需要带有条件的断点吗?你只需要用if语句包围它: 复制代码 代码如下: if (somethingHappens) { debugger; } 但要记住在程序发布前删掉它们. 2. 设置在DOM node发生变化时触发断点 有时候你会发现DOM不受你的控制,自己会发生一些奇怪的变化,让你很难找出问题的根源. 谷歌浏览器的开发工具里有一个超级好用的功能,专门可以对付这种情况,

  • 使用Chrome调试JavaScript的断点设置和调试技巧

    你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用这两种土办法确实解决了很多小型 JavaScript 脚本的调试问题.不过放着 Chrome 中功能越发强大的开发者工具不用实在太可惜了.本文主要介绍其中的 JavaScript断点设置和调试功能,也就是其中的 Sources Panel(以前叫 Scripts).如果你精通 Eclipse 中的各

  • Intellij IDEA Debug调试技巧(小结)

    1.这里以一个web工程为例,点击图中按钮开始运行web工程. 2.设置断点 3.使用postman发送http请求 4.请求发送之后会自动跳到断点处,并且在断点之前会有数据结果显示 5.按F8 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内,跳到下一条执行语句. 6.按F7在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则会进入该内嵌的方法中 . 7.继续按F7,则跳到StopWatch() 构造方法中

  • 你不知道的 IDEA Debug调试小技巧(小结)

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个线程断下来,但其他线程却已经执行过了:而将其改为 Thread 后,就可以多个线程都断下来,并且可以很方便的切换线程的执行流程,这就是多线程调试. 在debug控制台能够很方便的查看线程的执行状态,也可以很方便的选择某个线程去执行: 二.回退断点 不知道大伙有没有遇到这样一个问题,当我们进行debu

  • Eclipse的Debug调试技巧大全(总结)

    作为开发人员,掌握开发环境下的调试技巧十分有必要.我们在编写java程序的过程中,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,经常需要增加日志,看变量的值,这样调试很麻烦.假设我每天花费1小时在调试我的应用程序上的话,那累积起来的话也是很大量的时间.由于这个原因,用这些时间来重视并了解所有使我们调试更方便的功能.那能为你省下一些时间,也将会使你的生活更安逸.轻松. 一.Debug视图 调试中最常用的窗口是: 窗口 说明 Debug窗口 主要显示当前线程方法调用栈, 以及代码行数(有

  • 优秀程序猿调试技巧Debug与Release

    目录 Bug 调试的重要性 调试基本步骤 Debug与Release 快捷键 如何写出易于调试(优秀)的代码 常见的coding技巧 Bug bug意为臭虫,计算机术语里就是幺蛾子,对,你的程序又出幺蛾子了.为什么要叫bug?关于这个还有段有趣的历史 有一天赫柏正愉快地敲着Mark Ⅱ的代码时,计算机突然就停止运作了,那时的计算机远不如现在小巧,赫柏他们只能一个个排查计算机庞大的处理器群,经过一段时间的排查后停机原因终于被找到了.原来是一只飞蛾被计算机的光和热吸引,触发了电脑的短路,当然这只可怜

  • 项目发布Debug和Release版的区别详解

    本文为大家讲解了项目发布Debug和Release版的区别,供大家参考,具体内容如下 一.Debug和Release的区别 Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试.Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息 Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小

  • PyCharm 2021.2 (Professional)调试远程服务器程序的操作技巧

    目录 一.PyCharm 2021.2 (Professional) 的安装与激活 二.PyCharm 2021.2 (Professional) 调试远程服务器程序 1.在 PyCharm 中导入项目或者选择新建项目 2.在服务器端与该项目对应的目录下面创建同名文件夹 LSTMTrain 3.与服务器建立连接 4.在本地连上服务器端的Python运行环境 5.测试 目前在网上搜到的利用 PyCharm 调试远程服务器程序的教程大多都是针对 PyCharm 2020.2019,甚至更早版本,Py

  • 分享Java程序员应该知道的10个调试技巧

    可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序.但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运行时上面. 在开始之前,推荐大家去看看Eclipse shortcuts这篇文章,它将会给你带来很多方便.在本文中使用的是Eclipse Juno版(Eclipse 4.2),在开始前给大家提3点建议! 不要使用System.out.println作为调试工具 把所有涉及到的组件日志级别激活并使用 使

  • 分享Visual Studio原生开发的10个调试技巧

    最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧: 异常中断 | Break on Exception Watch窗口中的伪变量 |

  • Python 代码调试技巧示例代码

    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 python debug 相关工具进行 debug. 使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,详情见表

  • 分享Visual Studio原生开发的10个调试技巧(2)

    之前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS2005或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 技巧11:数据断点 当数据所在内存位置变化时,调试器将会中断.然而,这是唯一可能在一个时间创建4这样的硬件的数据断点.数据断点只能在编译的过程中添加,可以通过菜单(编译>新断点>新数据断点)或者通过断点窗口来

  • Visual Studio调试技巧汇总

    调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 1 悬停鼠标查看表达式值 调试是很有挑战性的.比如在函数内逐步运行可以看出哪里出错,查看堆栈信息可以知道函数被谁调用等等. 但是无论哪种情况下,查看表达式和局部变量的值都是很麻烦的(把表达式和局部变量放到watch窗口里). 一种更简单的方法,把鼠标停在所需查看的数据上.如果是类或结构,那么点击展开可以很方便快速地

  • Yii2框架配置文件(Application属性)与调试技巧实例分析

    本文实例讲述了Yii2框架配置文件(Application属性)与调试技巧.分享给大家供大家参考,具体如下: 配置文件 Yii2的主要配置文件config\web.php: <?php $params = require(__DIR__ . '/params.php'); $config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [

随机推荐