自学C语言——VS实用调试技巧总结

接上一篇:自学C语言——扫雷游戏(无递归)

什么是bug

        “bug”本意是昆虫或虫子,一般指电脑系统或程序中,隐藏着一些未被发现的缺陷或者问题,简称程序漏洞。

        第一代的计算机是由许多庞大且昂贵的真空管组成,并利用大量的电力来使真空管发光。可能正是由于计算机运行产生的光和热,引得一只小虫子(Bug)钻进了一支真空管内,导致整个计算机无法正常工作。研究人员费了半天时间,总算发现原因所在,把这只小虫子从真空管中取出后,计算机又恢复正常。后来,Bug这个名词就沿用下来,用来表示电脑系统或程序中隐藏的错误、缺陷、漏洞等问题。

        格蕾丝·霍波(Grace Murray Hopper,是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。)她公布过早期电子计算机的一个故障原因,通常错误地归功于她。这个版本的故事源自下面这段话:“在1946年,当霍波退役后后,她加入哈佛大学的计算机实验室,继续研究马克II型和马克III型计算机的工作。操作员在追踪马克II型的错误时发现继电器中有一只飞蛾,遂有bug术语。这个bug被仔细移除,并被贴在日志本上。这带来的第一个bug,就是我们今日所说的错误(error)或程序中的故障(glitch)。”

什么是调试(debug)

        当我们发现程序中存在的问题时,下一步就是找到问题并修复问题。

        这个找问题的过程称为调试,英文叫debug(消灭bug)的意思。

        调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所在的位置,然后确定错误产生的原因,再修复代码,重新测试。

debug和release

再VS上编辑代码时,能看到有debug和release两个选项:

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

        程序员在写代码的时候,需要经常性的调试代码,就设置为debug,这样编译产生的是debug版本的可执行程序,其中包含调试信息,是可以直接调试的。

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

        当程序员写完代码,测试再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为release,编译产生的就是release版本的可执行程序,这个版本是用户使用的,无需包含调试信息等。

同样的一段代码,release版本比debug版本的可执行文件大小要小得多。

VS调试快捷键

环境准备

需要一个支持调试的开发环境,把VS设置为debug

快捷键

F5:启动调试,经常用来直接跳到下一个断点处,一般是和F9配合使用。

CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

F9:创建断点和取消断点

        断点:作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,接下来就可以使用F10,F11这些快捷键,观察代码的执行细节。

        条件断点:满足一定条件才能触发断点。

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

F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。 在函数调用的地方,想进入函数内部观察细节,必须使用F11,如果使用F10,直接完成函数调用

......

监视和内存观察

监视可以打开多个窗口,方便进行观察

内存是由二进制保存,十六进制的形式展示的

最左边是地址0x000......

最右边是解析(基本没用)

调试举例

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{int i = 0;int arr[10] = { 0 };//给数组元素的赋值for (i = 0; i < 10; i++){arr[i] = 10 - i;}//打印数组元素for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}int Add(int x, int y)
{return x + y;
}int main()
{int c = Add(3, 5);printf("%d\n", c);return 0;
}
#include <stdio.h>int main()
{int arr[10] = { 0 };int num = 100;char c = 'w';int i = 0;for (i = 0; i < 10; i++){arr[i] = i;}return 0;
}
求1!+2!+3!+4!+...10!的和求n的阶乘
5! = 1*2*3*4*5
4! = 1*2*3*4
n! = 1*2*..*nint main()
{int n = 0;
//	scanf("%d", &n);int i = 0;int ret = 1;int sum = 0;for (n = 1; n <= 10; n++){ret = 1;for (i = 1; i <= n; i++){ret *= i;}sum += ret;}printf("%d\n", sum);return 0;
}
int main()
{int n = 0;
//	scanf("%d", &n);int i = 0;int ret = 1;int sum = 0;for (n = 1; n <= 10; n++){ret *= n;sum += ret;}printf("%d\n", sum);return 0;
}
//VS2022 X86 debug 模式下#include <stdio.h>int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&i = %p\n", &i);printf("&arr[9] = %p\n", &arr[9]);/* for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}*/return 0;
}

栈区:

默认情况下,先使用高地址处的空间,再使用低地址处的空间。数组随着下标的增长,地址是由低到高变化的,代码在运行的过程中,会依赖编译环境,这个是取决于编译器的。

#define  _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void test(int arr[])
{}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };test(arr);return 0;
}
int main()
{printf("hehe\n");return 0;
}int add(int x, int y)
{return x + y;
}int main()
{int a = 10;int b = 20;int c = Add(a, b);return 0;
}
#include <stdio.h>int main()
{printf("hehe\n");main();return 0;
}
#include <stdio.h>int Fact(int n)
{if (n == 0)return 1;elsereturn n * Fact(n - 1);
}int main()
{int n = 0;scanf("%d", &n);//5int r = Fact(n);printf("%d\n", r);return 0;
}

 

编程常见的错误归类

  1. 语法错误
  2. 链接错误
  3. 运行时错误

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件&#xff0c; 我们可以为总线添加额外的信息和控制选项&#xff0c; 以便与设备和驱动进行交互。 简单就是&#xff0c;属性文件&#xff0c;可以完成用户空间和内核空间的数据交互&#xff0c; 比如在应用层快速修改g…

【Searxng】Searxng docker 安装

SearXNG将用户的查询请求分发至多个支持的搜索引擎&#xff0c;并收集返回的结果进行汇总处理。在这个过程中&#xff0c;它通过内置的过滤器功能屏蔽广告和其他不相关内容&#xff0c;确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…

gitlab不同账号间·仓库转移

背景&#xff1a;公司业务调整&#xff0c;原先在海外仓库的代码转移回国内 诉求&#xff1a;完整的保留项目记录 操作&#xff1a; 步骤一: 定位到需要迁移的原项目地址 步骤二&#xff1a;创建新项目 步骤三&#xff1a;打开命令行&#xff0c;创建好文件路径为需要clo…

Ubuntu 安装 npm

1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装&#xff01;

Pytorch学习--神经网络--线性层及其他层

一、正则化层 torch.nn.BatchNorm2d torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue, deviceNone, dtypeNone)正则化的意义&#xff1a; 加速训练收敛&#xff1a;在每一层网络的输入上执行批量归一化可以保持数据的分布稳…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器&#xff1a;逻辑&#xff0c;冒烟测试版发布二 Zig 语言是一种新的系统编程语言&#xff0c;其生态位类同与 C&#xff0c;是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust&#xff0c;尤其是在开发过程中无穷无尽抛错的过程&#x…

复现第一周24

1.[SWPUCTF 2021 新生赛]gift_F12 1&#xff09;打开题目 2&#xff09;看源码 3&#xff09;直接ctrl&#xff0b;f搜索flag 2.[SWPUCTF 2021 新生赛]nc签到 1&#xff09;开题 2&#xff09;下载附件用记事本打开 3&#xff09;打开kali使用nc连接代码 输入l\s命令绕过黑名…

warmup

首页只有一个笑脸&#xff0c;没有什么有效信息&#xff0c; 查看源代码发现,source.php。 访问source.php,显而易见&#xff0c;php代码审计。 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){ //设立白名单&#xff0c;so…

Python 的安装及开发环境搭建

Python 的安装及开发环境搭建 文章目录 Python 的安装及开发环境搭建一、基础环境二、适用场景三、过程方法 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2024年10月29日首发于CSDN&#xff0c;转载请附上原文出…

Spring的高效开发思维(二)

时间&#xff1a;2024年 10月 30日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;我是小蒋&#xff01;今天咱们继续深入 Spring 和 Spring Boot 的核心哲学。其实开发并不只是“码…

LeetCode算法(链表)

今天的算法是链表篇&#xff0c;这篇比较简单&#xff0c;总体是之前完成的手写链表&#xff0c;几乎就是链表的大部分知识了&#xff0c;所以今天算是一个复习内容了。 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一…

Docker:容器化和虚拟化

虚拟化 虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&#xff08;如CPU、内存、磁盘空间、网络适配器等&#xff09;予以抽象、转换后呈现出来&#xff0c;并可供分割、组合为一个或多个电脑配置环境。这些资源的新虚拟部分是不受现有资源的架设方式、地域或…

如何有效提升MySQL大表分页查询效率(本文以一张900万条数据体量的表为例进行详细解读)

文章目录 1、提出问题1.1 问题测试 2、解决问题&#xff08;三种方案&#xff09;2.1、方案一&#xff1a;查询的时候&#xff0c;只返回主键 ID2.2、方案二&#xff1a;查询的时候&#xff0c;通过主键 ID 过滤2.3、方案三&#xff1a;采用 elasticSearch 作为搜索引擎 3、总结…

DGUS屏使用方法

1、DGUS工程下载 迪文DGUS屏的所有硬件参数和资料下载&#xff0c;都是通过屏上的SD/SDHC接口来完成的&#xff0c;文件必须使用FAT32文件格式。第一次使用SD卡前&#xff0c;推荐先格式化一次&#xff0c;流程如下&#xff1a; 1、 右键单击SD卡&#xff0c;在弹出来的菜单中选…

设计产品宣传册没头绪?推荐一个超多产品宣传册、画册的案例网站

在当今市场竞争激烈的背景下&#xff0c;产品宣传册和画册是企业宣传的重要手段之一。一本独具匠心的宣传册&#xff0c;不仅能够准确传达产品特点&#xff0c;还能吸引潜在客户&#xff0c;提升品牌形象。然而&#xff0c;设计一本优秀的宣传册并非易事&#xff0c;许多设计师…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1&#xff0e;合理利用display:block属性2&#xff0e;利用margin-bottom设置间隔效果3&#xff0e;利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…

基于LangChain构建安全Agent应用实践(含代码)

概述&#xff1a;本文基于langchain和Cyber Security Breaches数据集构建Agent&#xff0c;并基于该Agent实现了数据分析、趋势图输出、预测攻击态势三个功能&#xff0c;最后给出Agent在安全领域应用的三点启示。 前提&#xff1a; 1、拥有openai API KEY&#xff1b;&#…

机器学习-决策树

登录后复制 import numpy as np import matplotlib.pyplot as plt from sklearn import datasetsiris datasets.load_iris() X iris.data[:,2:] y iris.target plt.scatter(X[y0,0], X[y0,1]) plt.scatter(X[y1,0], X[y1,1]) plt.scatter(X[y2,0], X[y2,1]) plt.show() 1.2.…