C语言【调试】(个人笔记版)

调试

  • 前言
  • 一、Bug
  • 二、调试工具
    • 1.DeBug
    • 2.Release
  • 三、调试快捷键
    • 1、断点
  • 四、调试时查看程序的当前信息
    • 1、查看临时变量
    • 2、查看内存
    • 3、查看调用堆栈、汇编、寄存器
  • 总结


前言

这篇文章大都是我的个人笔记: 调试在日常程序设计中是很重要的。调试说白了就是为了解决代码的bug问题。但是如何学好调试,成为一名会解决问题的学习者呢?这篇文章我们就来探讨一下调试问题。


一、Bug

平常我们写完代码运行的时候,总会遇到一些出乎你意料的错误。比如,很经典的:

我写完代码啦->运行一下->为什么错误了呢?-这里改改,再运行一下->为什么又错误了呢?->再改改,再运行->这下可以了,但是为什么呢?

以上是不是你的真实写照呢?其实,这种调试的方法叫做迷信式调试,是一种不可取的调试方法,原因也很简单,因为你不知道代码具体哪里有问题,只能靠猜,而且大多数时候,你都不知道改完后正确的代码为什么是这样的。

二、调试工具

1.DeBug

Debug是被称为程序员版本,里面不做任何优化,可以方便程序员检查代码。
(按一下f10就会走一步,并且是一步一步来的)

2.Release

Release版本被称为发布版本,里面进行了各种优化。
(调试的时候就是一步到位)

三、调试快捷键

  1. F5 — — 启动调试,常用来直接跳到下一个断点处。常以F9配合使用
  2. F9 — —创建断点和取消断点。(后面我会说明断点点作用)
  3. F10 — —逐过程。通常用来处理一个过程。一个过程可以是一个函数调用,也可以是一条语句。(一步一步走)
  4. F11 — —逐语句。每次都执行一个语句,在遇到函数时会进入函数内部。(相对F10会更加细致)
  5. CTRL F5 — —执行但是不调试,也就是不经历调试而直接执行代码

以上就是常用的快捷键了

1、断点

断点大致意思就是让程序在指定的位置停下。
举个例子

int i = 0int arr[10] = {0};
for(i = 0; i < 10; i++){
	arr[i] = i;
}
for(i = 0; i < 10; i++){
	printf(%d”, arr[i]);
}

这里,我们在第二个for循环的地方按一下F9,就会产生一个断点。
正常情况下如果你调试,那么程序就会先进入到第一个循环,然后你按一下键盘他就执行一次。不过你知道第一个循环里的内容是没有问题的,你想去第二个循环的地方进行调试。但是程序要到第二个循环的话就需要先把第一个循环跑完,这就会很繁琐。
有了断点后,程序就会一次跑完断点之前所有的代码,在断点处停下,这样一来,你就可以继续进行你的调试了。

如果还没理解为什么这样的话,我就再举个例子:
现在假设你有5000行代码,你完全不知道代码哪里出了问题,你就得一次一次一行一行一直慢慢调试下去。这样下来,手都要先按断掉了。有了断点,你就可以在你所知道的没有问题的代码前设置断点,跳过这些代码。大大提高你的效率。

不过要注意的是,当出现两个断点时,并不是按一下F5就会跳到下一个断点处。按F5时,他会跳到一个**“逻辑断点”。**

意思是,如果断点假设在第一个循环中,并且我第二个循环的开始(不在循环体内)也设置了一个断点。那么第一次F5是进到第一个断点没错,但是我再按一次F5就不是跳到第二个断点了,而是在第一个循环中在来一次。

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

1、查看临时变量

int a = 0;
int b = 100;
int c = 200;
printf(%d”, a);

如果你想看这些临时变量的值时,该怎么办呢?
在这里插入图片描述
注意:一定是在启动调试(F10)的时候才能打开
流程:窗口 -> 自动窗口
或:窗口 -> 局部变量
或:窗口 -> 监视 (常用)

在这里插入图片描述
这里:
名称这一栏是可以进行输入的,只要输入的合法就可以。
值会显示当前名称的状态
类型顾名思义就是变量的类型了

这里我来说明一下数组在传参时应该怎么查看数组里的内容
在这里插入图片描述

我想查看数组arr的成员,那么我只需要在监视窗口内的值这一栏输入arr,4就可以看到前四个值了。
解释一下,因为指针传递的是数组的首元素的地址,所以我输入arr就是查看arr数组的第一个值,同理,我想看四个我就输入arr,4 我想看10个我就输入arr,10。

2、查看内存

创建一个数组并赋予初值,我们可以查看该数组在内存中存放的位置

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

在这里插入图片描述

内存窗口比较复杂
首先,我们要把需要看的东西写在地址栏上。
然后这里会有三列,第一列表示地址,第二列表述数据,第三列表示编译器推测的数据信息。
先来看看第一行第二列的数据:
01 00 00 00
再来看看第一列的数据:
0x00 8F FB C8
这俩有什么关联呢?
01 是内存中存储的数据,对应的就是第一列C8的位置,这第一列表示地址,而又因为我们只显示4列。所以01 00 00 00这个数据对应的地址00 8F FB C8+4就是00 8F FB CC。而我们第二行第一列的数据00 8F FB CC末尾处正是CC。所以答案显而易见了,这就是一个连续的地址,数据是存储在连续的内存空间中的
画个图会更好理解:
在这里插入图片描述

1.栈区内存的使用习惯是先使用高地址处的空间,再使用低地址处的空间
2.而数组下标的增长地址是由低到高变化的。
所以这里,我们的数据 1 的地址往上+4个字节就是数据 2 的地址,再往上就以此类推。
当然这里还可以补充堆与栈的知识。但是这部分知识与调试无关,我会在下次的文章中详细讲解一下堆栈。

3、查看调用堆栈、汇编、寄存器

这部分用的较少,但是调试窗口是可以查看的
在这里插入图片描述

总结

这篇文章全然是我自己的笔记,但是也可以方便大家快速理解一些调试中的术语的解释。好啦,这篇文章先到这里,如果有补充我会重新编辑,那么,下篇文章见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper客户端

启动单机版的zookeeper 配置Maven环境 (1) IDEA自带maven (2) 更新Maven库镜像地址&#xff1a; ① 拷贝D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\plugins\maven\lib\maven3\conf\settings.xml [IntelliJ的安装目录]到 C:/用户/username/.m2 (如果.m2文件不存在&…

大话哈希冲突

Map是很常用的数据结构, 而哈希表是 HashMap 等集合的底层实现之一&#xff0c;它通过将键的哈希值映射到数组中的位置来存储键值对。哈希冲突 (Hash Collision) 是指在使用哈希函数将数据映射到有限大小的哈希表时&#xff0c;不同的数据项被映射到了同一个哈希表位置上。 一…

【C++】拆分详解 - stack和queue

文章目录 一、stack的介绍和使用1. 简介2. 使用3. 模拟实现 二、queue的介绍和使用1. 简介2. 使用3. 模拟实现 三、容器适配器1. 简介2. STL标准库中的使用 四、deque&#xff08;了解&#xff09;1. 简介2. 底层原理2.1 底层空间2.2 模拟访问元素2.3 迭代器2.4 STL源码片段摘要…

高清无水印推文视频素材下载网站推荐

在制作抖音短视频时&#xff0c;选择合适的视频素材至关重要。想知道哪里可以下载热门的推文视频素材吗&#xff1f;别担心&#xff0c;我为你整理了六个高品质的视频素材网站&#xff0c;让我们一起来看看吧&#xff01; 蛙学网 首先介绍的是蛙学网&#xff0c;作为国内知名的…

期权懂|股票下跌时可以使用期权止损吗?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;股票下跌时可以使用期权止损吗&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 股票下跌时可以使用期权止损吗&#xff1f; 在股市中&am…

Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊

一.简介 位图索引&#xff08;Bitmap Index&#xff09; 是 Oracle 数据库中一种特殊类型的索引&#xff0c;适用于低基数&#xff08;Low Cardinality&#xff09;列&#xff0c;即那些列中可选值相对较少的情况下使用。它与常规的 B-tree 索引不同&#xff0c;位图索引通过位…

MybatisPlus入门教程及实现基础的增删改查

此篇博客主要针对于有开发基础的朋友学习~ 首先提几个问题&#xff1a; 1、什么是Mybatis&#xff1f; 2、什么是MybatisPlus&#xff1f; 3、Mybatis和MybatisPlus又有什么区别呢&#xff1f; 问题1&#xff1a;Mybatis是一个持久层的框架&#xff0c;我们通过配置mapper.xm…

Linux 外设驱动 应用 2 KEY 按键实验

2 按键 2.1 按键介绍 按键是指轻触式按键开关&#xff0c;也称之为轻触开关。按键开关是一种电子开关&#xff0c;属于电子元器件类&#xff0c;最早出现在日本&#xff0c;称之为&#xff1a;敏感型开关&#xff0c;使用时以满足操作力的条件向开关操作方向施压开关功能闭合…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…

MySQL中查询语句的执行流程

文章目录 前言流程图概述最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;今天我们一起探讨一下执行一条查询的SQL语句在MySQL内部都发生了什么&#xff0c;让你对MySQL内部的架构具备一个宏观上的了解 流程图 概述 对于查询语句的SQL的执行流程&#xff0c;主要可以分为…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。它利用数学或逻辑分析技术&#xff0c;针对系统的一致性、正确性、质量属性、规划结果等不同方面&#xff0c;提供描述性、预测性和指令性的分析结果。 重要概念 敏感点&#xff1a;敏感点是…

信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分求最小

PDF文档回复:20241017 1 P8814 [CSP-J 2022] 解密 [题目描述] 给定一个正整数 k&#xff0c;有 k 次询问&#xff0c;每次给定三个正整数 ni,ei,di&#xff0c;求两个正整数 pi,qi&#xff0c;使 nipiqi、eidi(pi−1)(qi−1)1 [输入格式] 第一行一个正整数 k&#xff0c;表…

单神经元建模:基于电导的模型[神经元结构、静息电位和等效电路]

文章目录 神经元结构、静息电位和等效电路神经元结构静息电位能斯特方程1. **描述浓度比的非线性关系**&#xff1a;2. **化学势与电势的关系**&#xff1a;3. **对称性**&#xff1a;4. **热力学与平衡**&#xff1a;总结&#xff1a; GHK方程Nernst方程和GHK方程的对比 等效电…

自动化检查网页的TDK,python+selenium自动化测试web的网页源代码中的title,Description,Keywords

首先&#xff0c;TDK是什么&#xff1f;对于新手小白来说&#xff0c;可能是懵逼的&#xff0c;所以这里给出一个官方的解说‌网页的TDK是指标题&#xff08;Title&#xff09;、描述&#xff08;Description&#xff09;和关键词&#xff08;Keywords&#xff09;的集合‌。这…

vue3播放m3u8格式hls监控流

1. 摄像头的hls监控流不同于普通m3u8的视频&#xff0c;video标签&#xff0c;iframe&#xff0c;videojs&#xff0c;vue-video-player无法解析 2. 解决办法 更换LivePlayer插件 官网https://www.liveqing.com/docs/manuals/LivePlayer.html#%E5%B1%9E%E6%80%A7-property 3…

Java项目-基于Springboot的招生管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多&#xff0c;哪一个最好&#xff1f; 先说说我选择的思路&#xff0c;我的目的是开发一个易用的软件&#xff0c;最重要的是稳定&#xff0c;并且碰到问题能够解决&#xff0c;因此&#xff0c;我的目标很明确&#xff0c;有比较大的用户群…

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验

一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…

【计算机网络原理】GBN,SR,TCP区别以及案例介绍

概念介绍 GBN、SR和TCP协议的主要区别在于它们的重传机制、确认方式以及缓存机制的不同。‌ GBN&#xff08;Go-Back-N&#xff09;协议在数据传输中&#xff0c;如果某个报文段没有被正确接收&#xff0c;那么从这个报文段到后面的所有报文段都需要重新发送。GBN采用累计应答…

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法&#xff0c;通过模拟用户行为&#xff0c;自动执行Web界面的各种操作&#xff0c;并验证操作结果是否符合预期&#xff0c;从而提高测试效率和准确性。 目的&#xff1a; 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…