window.cnblogsConfig = { homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

【转】浅谈调试--赖特

浅谈调试——赖特

何为调试及为什么要调试

调试是程序运行结果与期望结果不统一时,在手动计算模拟的前提下编译程序,对比不同,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。
运行代码只能得到两种结果: A c 或 Wa。但是程序很笨,不能直接告诉你错哪里了,需要你一个函数、一个循环、乃至一行一行地去debug。这时候,了解并掌握dev的动态调试可以帮助你找到错误位置,发现错误原因,从而在更短的时间内成功debug。
此外,调试也是程序员必备的一个技能,在日后的面试或者工作中,掌握调试技能是不可或缺的。


接下来开始详细介绍调试

调试环境准备

在这里我用Dev c++的做例子,不同的编程软件有不同的调试方式,会有所出入,其他的编译器请读者自行研究或在CSDN上搜索有关攻略

你需要

  • Dev c++ 一个,并事先将语言文字调成中文,以方便寻找
  • 笔,演草纸。
  • 正常的脑子一个~

步骤

  1. 打开工具栏,点击第一行编译选项
  2. 选择代码生成/优化一栏,再选择连接器,下面第二行名为产生调试信息的地方设为YES
  3. 简单两步,调试环境就准备好了。

注意

这两步极其关键。如果没有将产生调试信息一栏选为“YES“就直接开始调试,就会报错。如下图
如果你不小心点了Yes, 那么恭喜你,Dev c++会用卡退和没有保存的代码来回馈你的懒惰。

调试的对象

广义上调试的对象是一整个代码。而我这里的调试对象是指哪些类型的变量或者常量可以在调试的窗口中直接看到。根据我一年来的调试经验,我总结出以下几个方面

支持调试的类型

  • i n t 类型,包括一维、二维数组(一般来说一维数组简单明了,二维数组比较难观察,三维及以上的数组很少用到,观察起来也很困难,所以我不介绍三维及以上的数组调试)。也可以直接观察到数组的指定位置(下标)
  • double 和 float 类型及其数组
  • bool类型及其数组
  • char 类型及其数组
  • pair 类型及其数组
  • struct 类型及其数组
  • const和 define定义的常量

不支持调试的类型

先解释一下不支持调试的意思。一种情况是指个别少数的数据类型在添加查看后无法进行调试,或者会卡退,导致调试中断或无法进行,则称之为不可调试类型。还有一种就是调试窗口显示的是类型的地址或“乱码”(就是你看也看不懂,也没有显示你需要的信息),我也把他加入不可调试的范畴里。

  • s t r i n g 类型。所以在涉及字符串的调试时,建议先将其转化为 char数组,在进行调试,会舒服很多。
  • vector类型
  • map和 set类型

查看调试

在了解了调试的对象后,我们就可以输入自己想查看的变量或者常量了。

添加查看

添加查看有两种方式。其一为手动输入,其二为选择 输入

  1. 手动输入。在底下选择调试栏目,点击添加查看,再输入变量名
  2. 选择输入 拖选一个变量名,再点击添加查看。适用于变量名过长或带有下标的数组。

  1. 查看方式 初始情况下再代码区左侧处,拖动可以调整调试区域大小。有时候数组的长度过大,调试区域并不会自动换行,就会出现下面的尴尬情况 :

    这时候,把调试区域设为浮窗,可以有效解决这种问题。在调试二字处单击鼠标右键,点击浮动项目管理器,就可以轻松解决啦。

    把调试浮动窗口调节到合适的位置,这样就能舒服得调试啦,如下图

会打断点

什么是断点?断点就是在调试的时候告诉程序在运行到哪一步时停下,然后人为的一行一行运行代码,毕竟电脑一秒内可以运行好多好多行,你的大脑是算不过来的。断点涉及到三个问题

  1. 怎么打? 在代码左边的行数显示中单击想要停止运行的那一行(那一行不会运行),那一行就会变红。此时断点就打好了,如下图
  2. 在哪打? 这个问题可能会有些奇怪,但确实是一个很重要的问题。一个代码可以打很多个断点,但是并不是每一行都需要打上断点。例如下图的断点和上图的断点是等价的。

    这样其实和上上张图是等价的。因为断点后面的程序都是一步一步运行的,你点击下一步才会运行。所以在一个板块内(这里的板块是指一个循环、或者一些代码的组合来解决一个分支问题的意思),只用在板块的首行打上断点即可。
  3. 会跳过。
  4. 函数调用断点。当程序存在自定义函数时,我们又怀疑函数有点小问题时,在函数的定义那一行打上断点即可。在函数调用的地方不用打断点。当然,打了也不会有问题,只是与没打没有区别而已。

下一步

在点击开始调试前,有个小建议。建议用文件输入窗口输出。文件输入可以一次性将数据点输入到 .in文件里,避免了边调试边输入的情况发生。窗口输出可以实时查看输出情况。
当以上都准备好的时候,我们点击任务栏中的紫色小钩钩或者点击 F 5 即可进入调试。进入调试成功的时候,第一个断点会变成蓝色。如下图

这时候我门鼠标点击下一步或者按快捷键Alt + N,即可进入到下一行。

跳过

跳过是指从一个断点直接跳过多行,进入下一个断点。每当这个断点到下一个断点又很长的距离(运行的距离)时,一直点击下一步显然不是个办法。这时,你就需要一个跳过。掌握跳过技能可以方便地让你进入到指定的代码。
跳过按钮的快捷键为Alt + S

跳过在 for和 while循环中是一个常用技能。例如,先在双重 for循环的那一行的下一行 (一定要下一行,原因有点难解释,这是我多年来的经验) 打上断点,然后点击跳过。此时, for运行了一个周期。这时,循环进入到第二个周期,这是,程序又来到了那一行的断点。而那个断点就是程序理解的下一个断点断点。所以,程序会在第二个周期前停下。这样我们就跳过了一个循环周期。在多组测试数据时,会遇到第一组数据过了但是第二组没过,那么在多组测试数据的循环的下一行上打上断点,再点击跳过,即可跳过第一组数据,直接进入下一组的调试。
再次强调!!一定要在下一行

当然如果你想特别的看 i == 95的情况怎么办,其实也很简单,我们把代码改装一下。(演示代码,没有任何使用价值)
点击调试,在点击跳过,我们就会发现,代码直接停在了 i = = 0 , j = = 95 的情况。

这时候,我们的目的就达到了。

局部变量延时查看

局部变量在调试查看窗口是快速变化的(这里的快速变化我在后面解释,不是字面意思上的快速变化)。有的时候,尤其是循环里面,当前的下一行是下一个周期,而当前查看的变量正好与周期变量 i 有关。例如查看 a[i]的值,但是下一步 i++了,这时候查看窗口中显示的是 a[i+1]的值,你不能直观地查看 a[i]的值,这就是我定义的快速变化的窗口。此时,我们只需要在下一行输入一个不会改变代码作用的随便一个指令,例如定义一个 bool,或者把一个无关紧要的变量赋个值,就可以让调试区缓冲一下,延时查看。

我的习惯是定义一个全局布尔变量 flag,在想要延时查看的地方给他赋值,就能在调试的时候达达延时查看的效果了。

总结

关于调试的介绍就这么多了。还有许多的功能等待大家探索。

$$\tiny{本文作者chenweizhen}$$

posted @ 2023-11-24 19:38  gsczl71  阅读(24)  评论(0编辑  收藏  举报