开发者社区> 华章计算机> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《C语言程序设计进阶教程》一3.3 后执行式和交互式调试

简介: 本文讲的是C语言程序设计进阶教程一3.3 后执行式和交互式调试,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第3章,第3.3节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

3.3 后执行式和交互式调试

本文讲的是C语言程序设计进阶教程一3.3 后执行式和交互式调试,要调试一个程序是需要策略的。你需要把程序分为几阶段,在每一阶段的基础上隔离问题。在把不同部分整合起来之前确保程序在每一阶段都是正确的。例如,把一个程序看作3个阶段:①从一个文件中读取一些整数;②把整数排序;③把排好序的整数存到另一个文件中。在整合之前测试每一部分叫作单元测试。对于单元测试,你经常需要写一些额外的代码作为单独部分的“驱动”。例如,要在还未从文件中获得数据的情况下测试排序是否正常工作了,你就需要编写能够产生数据的代码(也许使用一个随机数生成器)。调试可能是交互式或者是后执行式的。如果一个程序会花费几个小时,你就不会想要用交互式来调试这个程序了。相反,你会想要程序打印出调试信息(叫作日志)。这个信息帮助你知道在长时间的执行期间发生了什么。另一种情况是调试一个与其他程序有着即时通信要求的程序。例如,你调试一个程序,此程序与另一个程序通过网络进行通信。如果你对这个程序进行交互式的调试就会让它慢很多,其他程序会认为网络中断从而停止与你的程序进行通信。另一种情形是你的程序与实体世界进行关联(例如控制一个机器人)。实体世界不会等待你的程序,它也不会慢下来。打印日志也会让程序慢下来,因此不要添加过多的日志。
在许多其他情况下,你可以让你的程序慢下来,对程序进行交互式的调试——运行程序的一些部分,观察中间的结果,修改程序,再次运行它们,继续这个过程直至你认为程序正确。对于交互式调试,打印调试信息通常是低效费时的。对交互式调试而言打印调试信息存在多个问题:
screenshot需要插入代码来打印调试信息。这将会耗费相当的精力。多数情况下,调试信息必须在随后被移除,因为此信息不应该出现在最终的代码和它的输出中。
screenshot如果只有很少的信息,那么就会缺少足够的信息帮助你判断是哪里错了。
screenshot如果有太多的信息,一些信息可能会是不相关的,应该被忽略。要得到恰好数量的信息,不多也不少,是很困难的。
screenshot最糟糕的是,问题可能会出现在意想不到的地方,而那里却并未插入调试信息。结果就是需要添加越来越多的调试信息进来。这将会是耗时耗力的。
与在交互式调试中使用调试信息相比,gdb(或DDD)在多数情况下是一个更好的工具。前文已经展示过一些gdb指令了。在本书后续部分会介绍更多指令。

原文标题:C语言程序设计进阶教程一3.3 后执行式和交互式调试

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
0 0
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
0 0
0基础C语言自学教程——收官之战——第十四节 文件的编译和链接
这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
0 0
0基础C语言自学教程——第十三节 文件操作
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
0 0
0基础C语言自学保姆教程——第十二节 动态内存分配
在开辟数组的过程中,其必须是一个定长的数组,就是在开辟空间的过程中就要指定大小;并且空间开辟的大小是固定的。
0 0
0基础C语言自学保姆教程——第十一节 自定义类型(结构体、枚举、位段、联合)与预处理指令(#define、#include等)
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
0 0
0基础C语言自学教程——第十节 字符串函数
源字符串必须以'\0'结束。 会将源字符串中的'\0'拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。 目标空间必须可变。
0 0
0基础C语言自学教程——第九节 从底层汇编的角度简单理解函数栈帧的创建和销毁
我们在现在,其实已经比较清楚函数是怎么样运行的了,包括怎样传参 、函数调用等等。但是呢,这样也只是理解到了会用的地步。
0 0
0基础C语言自学教程——第八节 函数指针数组的各种关系
const int* 是指向一个常量整数的指针,所以说,const int*所修饰的指针变量,其指针变量本身(即指向元素的地址)是可以被修改的,但是其指针所指向的值是不允许被修改的。
0 0
0基础C语言自学教程——第七节 初始指针
我们把计算机中的内存看作一条长街上的一排房屋。比如繁华大道上的多少多少号。每个房子可以容纳数据,并通过多少多少号来标识。
0 0
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
Python 脚本速查手册
立即下载
小程序云应用入门实操系列课程 - 第四讲
立即下载
小程序云应用入门实操系列课程 - 第一讲
立即下载