了解bug以及如何解决bug------调试(使用技巧)(上)

简介: 了解bug以及如何解决bug------调试(使用技巧)

前言

人非圣贤孰能无过,我们在编写程序代码的时候,或多或少都会有一些计算机程序错误(bug)出现。

可能是编译型错误:一般是语法错误,看错误提示信息就能解决;

也可能是链接型错误:一般是标识符名不存在(未声明)或者标识名符名的拼写错误

但最让人头疼的还是运行时的错误:看不懂的英文版错误提示,甚至有时候都没有错误提示,这时候要找到出现问题的位置就很困难了,为了解决这类bug,我们本次文章将引入一个新的名词------调试。

如果你也和我一样,常常因为找不到程序中的bug而苦恼,每天迷信式修改bug,修改成功了不知道为什么成功,修改失败了,也不知道为什么失败,那么请仔细阅读这篇文章,相信你会收获颇多。

一、bug

1.谁会发现bug?

  1. 程序员自己
  2. 测试人员
  3. 用户

2.如何发现并解决bug?(步骤)

  1. 通过隔离、删除等方式对bug进行定位
  2. 确定bug产生的原因
  3. 提出纠正bug的办法
  4. 对程序错误予以改正,并且重新测试

二、调试

1.调试是什么?为什么要进行调试?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中

程序 错误的一个过程。

我们为什么要进行调试呢?

每次程序运行,我们只能看到程序运行的最终结果,而不知道程序运行的过程中到底发生了什么。举个例子:当实际输出值和预期输出值不同,我们不能只通过表面上的几行代码来确定到底是哪一步运行错误了。而调试可以带我们走进程序运行的过程,帮我们确定到底是运行的哪一步出现错误,所以可以通过调试找出错误。

2.调试的环境

(作者本人在学习C语言的过程中使用的是Windows环境下的VS2013,所以本次讲解的调试技巧以及范例测试都是在VS2013上进行的,其他环境下的调试方法也都相类似,本文仅供参考)

要设置调试的环境,我们首先要了解和调试有关的概念------版本:

  • Debug:调试版本,包含调试信息(我们进行调试时就要将程序调整到这个版本下)
  • release:发布版本,相较于调试版本,他进行了更多的优化,使程序在内存大小和运行速度上优于调试版本,以便用户得到更好的对用体验。(release版本不能进行调试)

具体位置如图所示:

我创建的项目名叫Debugging,首先分别在程序中运行debug版本和release版本,再打开程序所在的文件夹,里面会产生debug和release两个文件夹。由下面两张图片可以对比看出release版本在内存上比debug版本小了很多。

①debug文件打开后的内容:

②release文件打开后的内容:

3.调试的快捷键

(只列举了几个常用的,如果有需要之后会专门整理一次)

  • //启动调试,运行到下一个断点处;
  •  //(一般和搭配使用)创建断点和取消断点;

断点:

①可以在程序的任意位置设置断点,从而使程序在想要的地方停止再一步一步运行下去;

②可以通过设置断点,跳过之前的正常代码直接运行到断点处;

③可以通过设置断点范围,将程序停止在某一次的循环或者递归。

  • //逐语句运行代码;
  • //逐句运行代码,与的区别:使用可以使执行逻辑进入所调用的函数内部(常用)
  • Ctrl+  //直接运行程序,不进行调试

如果直接使用等快捷键不起作用,可以尝试用+(指代)

三、调试时所查看的内容

1.临时变量的值

调试开始后可以直观看到变量中的值

(如果要删除所观察的某个变量,可以用鼠标选中这个变量然后用Delete键,即可删除)

2.内存信息

3.调用堆栈

4.汇编信息

这个在之前的函数栈帧的创建与销毁的文章中有提到,可以通过汇编信息查看程序运行的底层逻辑(有两种方法:①右击鼠标②调试项)

5.寄存器信息

寄存器的相关概念也在函数栈帧的创建与销毁中提到,想了解的伙伴可以去看看。

相关文章
VSCode 如何设置背景图片
VSCode 如何设置背景图片
1720 1
|
网络协议
深入理解HTTP的基础知识:请求-响应过程解析
在当今数字化的世界中,理解HTTP协议的基础知识变得至关重要。本文将带您深入探索HTTP的核心概念和请求-响应的过程。HTTP是一种用于在计算机之间传输超文本数据的协议,它不仅定义了数据交换的规则和格式,还为不同的应用程序提供了通信和交换信息的能力。通过深入了解HTTP的请求-响应过程,我们将更好地理解网络通信的基本原理,为构建和优化网络应用打下坚实的基础。
1187 2
|
8月前
|
监控 文件存储 异构计算
国产NAS也支持本地部署DeepSeek了:极空间Z423上手
极空间Z423 NAS新增本地部署DeepSeek大模型功能,支持7B和14B两种参数量级模型。本文通过实际测试展示了其性能表现:14B模型运行缓慢,Token输出速度低于每秒10个,而7B模型速度稍快但仍不理想。硬件资源占用高,温度显著上升,风扇噪音增大。作者建议优化交互逻辑、提供局域网接口及更好GPU支持,并预测未来NAS可能加入GPU或NPU以提升推理能力。此功能目前更像战略布局,为后续硬件升级铺垫。
556 0
|
安全 前端开发 JavaScript
如何检查和验证 HTML 中的 CSP 策略是否有效
本文介绍如何检查和验证 HTML 中的 Content Security Policy (CSP) 策略是否有效,包括使用浏览器开发者工具、在线验证工具和常见问题排查方法。
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
344 2
|
存储 Java 关系型数据库
银行储蓄管理系统【控制台+MySQL】(Java课设)
银行储蓄管理系统【控制台+MySQL】(Java课设)
297 1
|
存储 编译器 程序员
【C/C++】动态内存管理(C:malloc,realloc,calloc,free)
探索C++与C语言的动态内存管理:从malloc到new/delete,了解内存分布及栈、堆的区别。文章涵盖malloc、realloc、calloc与free在C中的使用,强调内存泄漏的风险。C++引入new和delete,支持对象构造与析构,还包括operator new和placement-new。深入分析内存管理机制,揭示C与C++在内存处理上的异同。别忘了,正确释放内存至关重要!
|
监控 NoSQL Redis
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
719 3
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)
336 0
|
安全 编译器 C++
【C/C++ 基础知识 】 C++ 初始化大全:选择最适合您需求的方式
【C/C++ 基础知识 】 C++ 初始化大全:选择最适合您需求的方式
350 2