程序员成长之旅——实用之调试

bug是什么

bug是一个英文单词,本意是指昆虫、小虫、损坏、犯贫、缺陷、窃听器等意思。现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。

https://baike.baidu.com/item/bug/32708?fr=kg_qa

调试是什么

程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。根据测试时所发现的错误,进一步诊断,找出原因和具体的位置进行修正。简而言之调试就是在运行之前排查,逐一排错的过程,争取运行之后不会报错。

调试的基本步骤

  • 发现程序错误的存在
  • 以隔离、消除等方式对错误进行定位
  • 确认错误产生的原因
  • 提出纠正错误解决的方法
  • 对程序错误予以改正,重新测试

debug和release的介绍

debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。release称为发布版本,它往往是进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。

debug和release环境的结果

在这里插入图片描述
在这里插入图片描述
debug和release的反汇编结果
在这里插入图片描述

在这里插入图片描述
所以我们说调试是在debug版本下进行的
那么编译器进行了那些优化呢?

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

我们运行一下不难发现debug版本下是死循环,release版本下不是死循环,那么它们之间有啥区别呢?
在这里插入图片描述

死循环的原因就是主函数是在栈中开辟了空间,而栈是先使用高地址,在使用低地址,也就是说先给i开辟的空间放在高于下面开辟数组地址的地址中,而数组的元素地址是从低到高的,所以,数组越界就有可能和i的地址相同,从而导致死循环。

在这里插入图片描述

在这里插入图片描述

虽然越界访问了,但是并没有死循环,这就是release版本下的优化,它将i的地址存在了小于数组首元素地址中的地址上了。

变量在内存中开辟的顺序发生了改变,影响到了程序执行的结果。

windows环境的调试

这里我说的都是vs编译器

调试环境的准备

debug版本下才可以调试。

调试的快捷键

F5

启动调试,经常用来直接调到下一个断点处

F9

创建断点和取消断点

F10

逐过程

F11

逐语句

Ctrl + F5

开始执行不调试

更多快捷键

https://blog.csdn.net/mrlisky/article/details/72622009

调试的时候查看程序当前信息

只需要点击调试->窗口就可以看到你想看到的东西,再点击进去就行了

如何写易于调试的代码

优秀的代码

  • 代码运行正常
  • bug很少
  • 效率高
  • 可读性高
  • 可维护性高
  • 注释清晰
  • 文档齐全

常见的coding技巧

  • 使用assert
  • 尽量使用const
  • 养成良好的编码风格
  • 添加必要的注释
  • 避免编码的陷阱

编程常见的错误分类

编译型错误

直接看错误信息,双击,找到错误出处,改正即可,相对简单

链接型错误

看错误信息,主要在代码中找到错误信息的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

运行时错误

借助调试,逐步找错误,最难搞

发布了76 篇原创文章 · 获赞 16 · 访问量 4449

猜你喜欢

转载自blog.csdn.net/wuweiwuju___/article/details/98731584
今日推荐