实用调试技巧 上

简介: 实用调试技巧

1.什么是bug?

bug--->臭虫、虫子。

为什么含义是臭虫、虫子呢?

答案是:第一次被发现的导致计算机错误的是一只飞蛾,也是第一个计算机程序的错误。


2.调试是什么?有多重要?

前言:

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

       顺着这条途径顺流而下就是犯罪,逆流而上就是真相。

   一名优秀的程序员都是一名出色的侦探。

       每一次调试都是尝试破案的过程。

2.1调试是什么?

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

2.2调试的基本步骤

①发现程序错误的存在

  ②以隔离、消除等方式对错误进行定位

  ③确定错误产生的原因

  ④提出纠正错误的解决办法

  ⑤对程序错误予以改正,重新测试

2.3Debeg和Release的介绍

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

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

(1)在VS2019中如何转换?

(2)Release对代码大小上是最优的:

代码:

#include<stdio.h>
//自定义函数——实现对整数数组的冒泡排序
void bubble_sort(int* str, int sz)
{
  //趟数
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
    //一趟冒泡排序的过程
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      //升序
      if (str[j] > str[j + 1])
      {
        int tmp = str[j];
        str[j] = str[j + 1];
        str[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[] = { 10,9,8,7,5,6,4,1,2,3 };//定义整形数组,并初始化
  int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的大小
  //调用函数,实现升序
  bubble_sort(arr, sz);
  //输出升序后的数组
  int i = 0;//循环变量
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
  return 0;
}

观察分别在Debeg和Release环境下生成的可执行程序的大小:

(3)Release对代码运行速度上是最优的

代码:

#include <stdio.h>
int main()
{
  int i = 0;
  //数组下标界限0~9
  int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  for (i = 0; i <= 12; i++)
  {
    //数组下标为10~12时数组越界
    arr[i] = 0;
    printf("hehe\n");
  }
  return 0;
}

在Debeg和环境下该代码死循环,解释在调试的实例二。

在Release环境下该代码打印13次hehe,不死循环,因为编译器优化把i的地址放在数组arr地址的下面了。


3.Windows环境调试介绍

3.1调试环境的准备

在环境中选择debug选项,才能使代码正常调试。

3.2学会快捷键

最常使用的几个快捷键:

F5

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

F9

创建断点和取消断点。

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

F5和F9常配合使用,F5一般不会单独使用的。断点再多文件、多代码中常用。

F10

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

F11

逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。

ctrl + F5

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

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

注意:只有先F10开始调试,才能看到程序当前信息。

3.3.1查看临时变量的值

在调试开始之后,用于观察变量的值。



3.3.2查看内存信息

在F10调试开始之后,用于观察内存信息。


3.3.3查看汇编信息

在F10调试开始之后,有两种方式转到汇编。

(1)第一种方式:右击鼠标,选择[转到汇编]:

(2)第二种方式:

可以切换到汇编。

3.3.4查看寄存器信息

在F10调试起来之后,有两种方式观察寄存器信息。

(1)第一种方式:

(2)知道寄存器的名字,可以在监视中观察寄存器信息


可以查看当前运行环境的寄存器的使用信息。

3.3.5查看调用堆栈

在F10调试之后,可以观察调用堆栈。

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。


相关文章
|
存储 Oracle Unix
关于小机 | 计算机百年趣味史(上)第8篇
小机即小型机(minicomputer),从名字上我们可以知道是体积会较小的机器,不过体积也是针对大机(mainframe)来说是,如果光从绝对体积上讲,那显然又不对。所以,小机是对特定时代一群类似机器的统称。我们来看下小机的关键历史。其历史时间是与大型机并行的。
2881 0
关于小机 | 计算机百年趣味史(上)第8篇
|
6月前
|
存储 NoSQL 定位技术
MongoDB索引知识
MongoDB索引是提升查询性能的关键工具,通过构建特殊的数据结构(如B树)优化数据访问路径。无索引时,查询需全集合扫描,时间复杂度为O(n);使用索引后可降至O(log n),实现毫秒级响应。MongoDB支持多种索引类型:单字段索引适用于高频单字段查询;复合索引基于最左前缀原则优化多条件过滤和排序;专业索引包括地理空间索引(支持LBS服务)、文本索引(全文搜索)和哈希索引(分片键优化)。合理选择和优化索引类型,可显著提升数据库性能。建议使用explain()分析查询计划,并定期清理冗余索引。
|
安全 机器人
Nature子刊:人机融合即将成真!纳米机器人杀死癌细胞,肿瘤生长抑制70%
【7月更文挑战第9天】DNA纳米机器人成功抑制小鼠体内癌细胞生长70%,展示出人机融合治疗癌症的前景。卡罗林斯卡学院科学家利用DNA构造的纳米机器人,识别并选择性攻击癌细胞,其pH敏感设计确保只在肿瘤微环境中激活,减少对健康细胞的影响。尽管需进一步研究优化设计及进行临床试验,这一创新为癌症疗法带来新希望。[链接](https://www.nature.com/articles/s41565-024-01676-4)**
427 1
|
12月前
|
存储 消息中间件 缓存
本地缓存Caffeine系列(三)
本地缓存Caffeine系列(三)
|
10月前
|
搜索推荐 开发者
熊猫比分-专业体育赛事直播app/网页搭建
体育赛事直播APP已成为体育迷观看和讨论赛事的重要渠道。其核心功能包括:1) 实时直播,支持转播、录播、回放,确保低延迟、高流畅度和优质画质;2) 比分数据分析,提供首发阵容、历史对战等信息;3) 用户互动,支持评论、打赏及私聊;4) 主播中心,允许用户申请成为主播并获平台支持。
|
10月前
|
机器学习/深度学习 文字识别 并行计算
一款.NET开源的屏幕实时翻译工具
一款.NET开源的屏幕实时翻译工具
205 0
|
12月前
|
前端开发 Java Spring
springboot自定义拦截器的简单使用和一个小例子
本文介绍了如何在Spring Boot中创建和使用自定义拦截器,通过一个登录验证的示例,演示了拦截器在MVC流程中的preHandle、postHandle和afterCompletion三个环节的作用,并说明了如何在Spring Boot配置类中注册拦截器。
|
11月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
349 0
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
233 7
|
机器学习/深度学习 分布式计算 监控
在大数据模型训练中,关键步骤包括数据收集与清洗、特征工程、数据划分;准备分布式计算资源
【6月更文挑战第28天】在大数据模型训练中,关键步骤包括数据收集与清洗、特征工程、数据划分;准备分布式计算资源,选择并配置模型如深度学习架构;通过初始化、训练、验证进行模型优化;监控性能并管理资源;最后保存模型并部署为服务。过程中要兼顾数据隐私、安全及法规遵守,利用先进技术提升效率。
335 0