实用调试技巧(1)

这篇具有很好参考价值的文章主要介绍了实用调试技巧(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实用调试技巧(1),c语言,开发语言,c++

  • 什么是bug?
  • 调试是什么?有多重要?
  • debug和release的介绍。
  • windows环境调试介绍。
  • 一些调试的实例。
  • 如何写出好(易于调试)的代码。
  • 编程常见的错误。

什么是Bug
我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bug,世界上的第一个Bug是一支飞蛾,这就是Bug的由来,在早期的时候,机器突然坏了,工作人员进行检查,最后发现是一只飞蛾导致机器故障,所以也有了现在的Bug之称。
实用调试技巧(1),c语言,开发语言,c++

当天的工作人员将他贴在了笔记本上,这就是时间上的第一个Bug。
调试是什么
我们在初学的时候会遇到各种各样的问题,这个时候我们就需要进行调试,这样才能解决Bug,所以调试非常重要,一个出色的程序员必须会调试

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。
顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。

但是我们在初学的时候总是盲目的调试,可能只是简单摁下键盘上的F10,调试一直到我们代码结束的时候,只是走了一遍流程,却不知道问题在哪里,这就是我们初学者经常出现的问题。
所以我们要拒绝迷信调试,要真正的找到问题所在,解决这个臭虫

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

2.2 调试的基本步骤

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

而我们写程序的时候出现Bug生活中一般有三种人,一是程序员自己,二是测试员,三是用户。
测试员就是相当于你写的代码经过relase之后到测试员那里,它进行测试。

3 Debug和Release的介绍

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

就是相当于我们平常在编译器上写的代码

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

这个就是我们的代码经过优化后呈现给用户的

那我们用代码给大家演示一下他们有什么不一样的地方

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		arr[i] = -1;
	}
	for (i = 0; i < 10; i++)
	{

		printf("%d ", arr[i]);
	}
	return 0;
}

实用调试技巧(1),c语言,开发语言,c++
上面就是我们在Debug和release下生成的可执行文件

实用调试技巧(1),c语言,开发语言,c++
实用调试技巧(1),c语言,开发语言,c++
很明显Release下的内存明显小了很多,说名它进行过优化,我们这是在X86平台下,就是32位机器下,当然我们改成X64也是一样的道理

实用调试技巧(1),c语言,开发语言,c++

实用调试技巧(1),c语言,开发语言,c++
3. Windows环境调试介绍
那我们在了解环境之前先要来了解一些东西,比如就是快捷键,何为快捷键,就是让你变得快捷起来。

实用调试技巧(1),c语言,开发语言,c++
在我们的调试里头就有这些快捷键,来介绍几个常用的
CTRL + F5

这个键就是我们每次运行要得到我们的结果的时候用的,它的意思就是开始执行不调试,直接运行程序。

F11

这个就是一条一条语句往下执行,我们在调试过程中这是必然不可缺少的,它也可以进到我们的函数当中去。

F10

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

F10和F11其实差不多,就是后者更细致一点,作用都是差不多的。

F9

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

F5

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

下面举例子给大家看看断点有多方便。

实用调试技巧(1),c语言,开发语言,c++

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		arr[i] = -1;
	}
	for (i = 0; i < 10; i++)
	{

		printf("%d ", arr[i]);
	}
	printf("\n");
	for (i = 0; i < 10; i++)
	{
		printf("hehe\n");
	}
	return 0;
}

我们在上面设置了一个断点,并且条件是i==6,那让我们按下F5看看吧。
实用调试技巧(1),c语言,开发语言,c++
上面我只按了一个F5就到了,可是如果我按F10,要经过一个半的for循环,有时候按的快的时候,一下子按过头了又要重新按(小编一开始就是这么蠢,大家学聪明点),可见断点和F5连用是这么方便。
实用调试技巧(1),c语言,开发语言,c++
同时屏幕上也打印了6个-1
还有其他相当多的快捷键大家也可以去网上找找,增加对VS的理解

会快捷键之后我们还需要学习一些其他的,往下看
3.3 调试的时候查看程序当前信息
实用调试技巧(1),c语言,开发语言,c++

在窗口里有各式各样的好东西,让我们来看看吧
当然我们这些窗口必须是要开始调试起来的时候才能看到,我一开始学的时候,不知道这个,废了好大劲才找到我原来都没有开始调试。
监视窗口
实用调试技巧(1),c语言,开发语言,c++
任意选一个都可以,在这里我们就可以输入我们想要监视的,比如数组名,还有数组的元素,一些变量,我们都可以看到它时刻的值,当然大家也可以看到自动窗口和局部变量,这些也都是监视的,只不过它是自己生成的,虽然很方便但是它有时候会自己变值,总的来说还是不便于观察,我们在学得时候,小编建议大家还是自己尝试,这样才能提升自己的调试技巧。
内存窗口
这个也很重要,我们在栈上创建变量的时候,都是占用空间的,而我们会用相应的编号找到他们的位置,这也是让我们更好的观察他们,让我们更容易调试,找到Bug。

3.3 查看调用堆栈

调用堆栈主要是反映逻辑关系,比如我们过多的调用函数的时候不明白它的逻辑的时候可以使用

举个例子

#include<stdio.h>
void test1()
{
	printf("hehe\n");
}
void test()
{
	test1();
}
int main()
{
	test();
	return 0;
}

实用调试技巧(1),c语言,开发语言,c++
我们返回的时候是下面这样
实用调试技巧(1),c语言,开发语言,c++
啥意思呢,就是我们之前讲过函数栈帧一样,栈是一步一步在顶上开辟,然后一步一步返回的。

3.4 查看汇编信息

实用调试技巧(1),c语言,开发语言,c++
在函数栈帧讲过,建议大家去看一下
3.5 查看寄存器信息
实用调试技巧(1),c语言,开发语言,c++
之前讲过esp和ebp还有edi这些,他们的作用都是一样,存储数据,其中ebp和esp有维护函数栈帧的作用。

接下来给两个例子给大家调试一下看,不过都是最基础的调试.

实例

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

int 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\n", sum);
 return 0;
}

我们的代码主要是为了计算阶乘的大小,前几个阶乘相加计算出结果,但是我们上面的代码其实是有问题的,我们一步一步调试来看看,首先我们要写出我们每次心里想的结果去对比编译器中监视进行对比,找出问题。
实用调试技巧(1),c语言,开发语言,c++
实用调试技巧(1),c语言,开发语言,c++

调试之前可以像我一样把要观察的写出来

实用调试技巧(1),c语言,开发语言,c++
j循环的for语句执行一次,因为i=1,算出1的阶乘,答案是对的。
我们看2的阶乘
实用调试技巧(1),c语言,开发语言,c++

实用调试技巧(1),c语言,开发语言,c++
其实我们在这里就能看出结果,原因是我们是在原来的基础性上阶乘,但是运气好,答案是对的,当我们继续往下走,就会看出端倪

实用调试技巧(1),c语言,开发语言,c++
一看和我们预想的有问题,这时候就要警惕,如果我们第一次没看出来,但是结果不一样,这时候就要小心了,不过很显然,为什么造成这个原因,我们在调试过程一看就才可以看出来了,ret一直是在原来基础上改变,所以我们给他进入循环的时候变成1就可以了。

改正

#include<stdio.h>

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

实例two

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

想要解释这道题必须调试才能知道
给个前提,必须在VS这个编译器下,而且是X86,Debug下,别的一些编译器也行,但还是有点初入,这里我们不进行调试是做不出来,下面调试。

实用调试技巧(1),c语言,开发语言,c++

当我们的i变成9的时候,刚刚把原始数组都赋值为0

实用调试技巧(1),c语言,开发语言,c++
很神奇,我们数组下标到9就应该结束,但是现在竟然把arr[10]的内容赋值为0,我们语句越界访问了

实用调试技巧(1),c语言,开发语言,c++
11也是,i还在变大
实用调试技巧(1),c语言,开发语言,c++
arr[12]怎么放的是i的值,好奇怪,我们继续往下。
实用调试技巧(1),c语言,开发语言,c++

i突然变成0了,arr[12]的内容也是0,说明赋值成功,但是i又变了。我们就要去怀疑他们是不是公用一个空间

实用调试技巧(1),c语言,开发语言,c++
结果一看还真是,那就说明arr[12]和i用的是一个地址,后来i又变成0了,所以才会死循环,讲到这里大家肯定明白了把


实用调试技巧(1),c语言,开发语言,c++
说面我们arr数组开辟的时候和i中间差两个整型,我们数组的下标是由低地址到高地址的

今天我们先讲一部分调试技巧,内容太多了,小编写不动了,谢谢大家!!!文章来源地址https://www.toymoban.com/news/detail-620615.html

到了这里,关于实用调试技巧(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS实用调试技巧

    Bug一词的原意是虫子,而在电脑系统或程序中隐藏着的一些未被发现的 缺陷或问题 ,人们也叫它\\\"bug\\\"。这是为什么呢?这就要追溯到一个程序员与飞蛾的故事了。 Bug的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电

    2024年02月01日
    浏览(40)
  • 实用调试技巧(1)

    什么是bug? 调试是什么?有多重要? debug和release的介绍。 windows环境调试介绍。 一些调试的实例。 如何写出好(易于调试)的代码。 编程常见的错误。 什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bug,世界上的第一个Bug是一支飞蛾,这就是Bug的由

    2024年02月14日
    浏览(39)
  • STM32“死机“(实用调试技巧)

    2、硬件环境导致\\\"死机\\\" 1)供电电源电压不在合适范围      单片机都需要有一个能够稳定运行的电压工作范围,如果低于或者高于正常工作电压范围其单片机并不一定会立马无法工作(也有可能会立马死机),而是工作一段时间在某种环境条件满足的时候造成死机。     处理

    2024年02月01日
    浏览(42)
  • C生万物 | 程序员必备实用调试技巧分享

    本文,我们就来讲讲如何去进行调试, 对于一名优秀的程序员来说,除了要熟练写业务逻辑外,还要学会如何去调试代码,这是至关重要的! 🔰 那我们该如何去调试哪些东西呢?使用什么去调试呢?如何调试呢? —— 让我们带着上面这些问题一起进入调试的学习📖 首先

    2024年02月17日
    浏览(44)
  • Visual Studio 2022 你必须知道的实用调试技巧

    目录 1、什么是bug?  2.调试是什么?有多重要? 2.1我们是如何写代码的? 2.2又是如何排查出现的问题的呢? ​编辑 2.3 调试是什么? 2.4调试的基本步骤 2.5Debug和Release的介绍 3.Windows环境调试介绍 3.1 调试环境的准备  3.2学会快捷键 3.3 调试的时候查看程序当前信息 3.3.1 查看

    2024年02月12日
    浏览(75)
  • 【C++航海王:追寻罗杰的编程之路】探寻实用的调试技巧

    目录 1 - 什么是bug? 2 - 调试是什么?有多重要? 2.1 - 调试是什么? 2.2 - 调试的基本步骤 2.3 - Debug和Release的介绍 3 - Windows环境调试介绍 3.1 - 调试环境的准备 3.2 - 学会快捷键 3.3 - 调试的时候查看程序当前信息 3.3.1 - 查看临时变量的值 3.3.2 - 查看内存信息 3.3.3 - 查看调用堆栈

    2024年04月12日
    浏览(31)
  • Visual Studio实用调试技巧---让你成为高端的程序员

    ​ 💓博客主页:江池俊的博客 👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞 在计

    2024年02月14日
    浏览(46)
  • 你真的知道怎么使用vs吗?把把手教你实用调试小技巧

    谈到bug,我们知道bug的中文意思是虫子,飞蛾的意思。至于为什么bug一词会用到计算机领域的话得追溯到第一台计算机的诞生。 上面个你看到的就是世界上第一个bug的诞生。它的来源也是非常的有意思,当时世界上的第一台计算机出了故障不能正常的工作,于是工作人员就进

    2024年02月05日
    浏览(33)
  • 【C语言】——调试技巧

    目录 ​编辑 ①前言  1.什么是Bug? 2.什么是调试?  2.1调试的基本步骤  2.2Release与Debug 3.常用快捷键  4.如何写出好的代码 4.1常见的coding技巧   👉assert()   👉const()  const修饰指针:     调试是每个程序员都必备的技能之一,调试能在程序逐步运行过程中锁定目标变量, 找

    2024年02月10日
    浏览(30)
  • 掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)

    Go语言中的结构体(Struct)除了基本的定义和使用外,还有一些高级用法,可以让我们更灵活地使用结构体。下面详细解释一些高级用法: 结构体嵌套 结构体可以嵌套在其他结构体中,形成更复杂的数据结构。这种嵌套可以使代码更清晰,更符合逻辑。同时,可以通过嵌套来

    2024年03月27日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包