这是本应在一年前学习的Debug

前言

这里是嘉禾与她的Debug(暴风哭泣)
真的真的太绝望了,第一节上WX老师的C程实验课就是讲的Debug,但是对于我这种脑回路发育失败的人来说,讲一遍怎么可能掌握,于是懒癌作怪,接下来也一直没有再去自主学习这个东西。说来神奇,写了一年的代码了,竟也从未用过Debug,果真不是一个专业的程序员,必然也没有在这个过程种学到什么知识。但确实有很多逻辑上的问题,没有error和warning,但运行结果就是不对,这个时候不会Debug就实在太令抓狂了。不能再像大一的编程课那么划水了,那就从头再来吧!TAT

一、背景介绍

本来这个环节就常规程序没必要嘛,但是这个背景确实有点东西,成功引起了我的注意,那就把它记录下来,成为以后秃头路上的一点小甜点吧!

马克2号(Harvard Mark II)编制程序的葛丽丝·霍波(Grace Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一。 有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。 于是,霍波诙谐的把程序故障统称为“臭虫(BUG)”,把排除程序故障叫DEBUG,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。(确实够神秘。)

二、来看一些可能的错误

(确实都碰见过)

语法错误

在编写程序时违反了 C 语言的语法规定。语法不正确、关键词拼错、标点漏写、数据运算类型不匹配、括号不配对等都属于语法错误,在进入程序编译阶段,编译系统会给出出错行和相应“出错信息”。我们可以双击错误提示行,将光标快速定位到出错代码所在的出错行上。根据错误提示修改源程序,排除错误。

连接错误

如果使用了错误的函数调用,比如书写了错误的函数名或不存在的函数名,编译系统在对其进行连接时便会发现这一错误。纠正方法同 1。

逻辑错误

虽然程序不存在上述两种错误,但程序运行结果就是与预期效果不符。 逻辑错误往往是因为程序采用的算法有问题,或编写的程序逻辑与算法不完全吻合。逻辑错误比语法错误更难排除,需要程序员对程序逐步调试,检测循环、分支调用是否正确,变量值是否按照预期产生变化。

运行错误

程序不存在上述错误,但运行结果时对时错。 运行错误往往是由于程序的容错性不高,可能在设计时仅考虑了一部分数据的情况,对于其他数据就不能适用了。例如打开文件时没有检测打开是否成功就开始对文件进行读写,结果程序运行时,如果文件能够顺利打开,程序运行正确,反之则程序运行出错。要避免这种类型的错误,需要对程序反复测试,完备算法,使程序能够适应各种情况的数据。

三、调试过程

断点

断点,就是在需要的地方让它断开,如果你在某一行代码处添加了断点,那么程序运行到断点处即会暂停,不再继续往下运行,直到接到你继续运行的命令。
设置断点的方法是:右击并选择(不知道为什么F9在我这里不适用……)在这里插入图片描述
断点所在代码行的最左边出现了一个深红色的实心圆点,这表示断点设置成功。

调试

在 VC“Build”(组建)菜单下的“Start Debug”(开始调试)中点击 Go(F5)命令进入调试状态,Build 菜单自动变成 Debug 菜单在这里插入图片描述
提供以下专用的调试命令:

==
Go(F5) 从当前语句开始运行程序,直到程序结束或断点处。
Step Into(F11) 单步执行下条语句,并跟踪遇到的函数。
Step Over(F10) 单步执行(跳过所调用的函数)
Run to Cursor(Ctrl+F10) 运行程序到光标所在的代码行。
Step out(Shift+F11) 执行函数调用外的语句,并终止在函数调用语句处。
Stop Debugging(Shift+F5) 停止调试,返回正常的编辑状态==

如果希望能一句一句地单步调试程序,在编写程序时就必须一行只写一条语句。

查看变量

单步调试程序的过程中,我们可以在下方的Variables (变量)子窗口和Watch(监视) 子窗口中动态地察看变量的值,如下图所示。Variables 子窗口中自动显示当前运行上下文中的各个变量的值变量,而 Watch 子窗口内只显示在此 Watch 子窗口输入的变量或表达式的值。随着程序的逐步运行,也可以直接用鼠标指向程序中变量查看其值。例如在下图中,我们可以清楚地看到,程序已经为自动型变量 first、second、big 分配了内存,但它们的初始值是随机的。
在这里插入图片描述
Variables 子窗口有 3 个选项卡:Auto、Locals 和 This。

Auto 选项卡: 显示出当前语句和上一条语句使用的变量,它还显示使用 Step over 或 Step out 命令后函数的返回值。

Locals 选项卡:显示出当前函数使用的局部变量。

This 选项卡: 显示出由 This 所指向的对象(C 语言不用 this)。

如果变量较多,自动显示的Variables 窗口难以查看时,还可以在右边的Watch 子窗口中添加想要监控的变量名。例如,在上图中在 Watch1 子窗口中添加了变量“first”。我们还可以直接将变量拖动到 Watch 子窗口的空白 Name 框中。 添加结束后,该变量的值会被显示出来。并且随着单步调试的进行,会看到变量 first 的值逐渐变化。如果各变量的值按照设想的方式逐渐变化,程序运行结果无误,本次开发就顺利结束了。如果发现各变量值的变化和设想的不一致,说明程序存在逻辑错误,那就需要停止调试,返回编辑窗口,查错并修改程序。

查看内存

数组和指针指向了一段连续的内存中的若干个数据。可以使用 memory 功能显示数组和指针指向的连续内存中的内容。在 Debug 工具条上点 memory 按钮,弹出一个对话框,在其中输入数组或指针的地址,就可以显示该地址指向的内存的内容。如下图所示:
图1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值