c语言在运行时弹出终止重试,C语言第四篇调试.doc

本文介绍了程序调试的重要性,特别是针对C语言的调试方法,包括手动跟踪、程序跟踪和交互式调试。手动跟踪适合小型程序,程序跟踪通过插入输出语句观察变量变化,而交互式调试利用集成开发环境如Visual C++ 6的调试器进行高效定位错误。文章以一个数组下标越界的例子展示了如何通过调试找出问题。强调了调试技巧的实践性和学习价值,以及assert宏在调试中的作用。
摘要由CSDN通过智能技术生成

C语言第四篇调试

第四篇在Visual C++ 6中调试

在初学者的思想中,经常把处理程序的语法错误等看作是调试程序。而对非初学者来说,调试程序主要是指处理程序的语义(semantics)错误和运行时的异常处理。其中,语义错误的一种情况指程序代码的语法是正确的,程序也能被编译和链接生成可执行的程序,但由于程序中存在不正确的逻辑因而会在程序运行时产生错误。另一种情况的语义错误指程序没有按设计者的预想工作,从而出现意料之外的结果。而异常处理指程序在运行中遇到特殊情况(如内存不足、要访问的文件不存在)如何进行处理等。本篇主要包括以下内容:

程序调试方法

程序跟踪

交互式调试

C++的异常机制与标准异常处理

学习和提高调试技巧

程序调试方法

当程序在运行时出现错误或者出现意想不到的运行情况时,我们必须通过跟踪某些关键量的变化来确定出错的原因。根据跟踪方式的不同,程序的调试方法(不是软件的调试)可以分为手动跟踪、程序跟踪和交互式调试三种方法,程序设计者应根据实际情况来选取这些调试方法。

所谓程序的手动跟踪,其实就是通过认真地阅读程序代码,通过画流程图等方法弄清程序运行的流程,同时手动运行和跟踪程序的每一步,看其实际运行结果是否和设计结果一致。这种跟踪方法,对于小型程序或简单函数来说是非常合适的。但对于大型程序来说,这个过程太耗时间了。

所谓程序跟踪,即在程序的关键位置插入跟踪语句(如用printf、cout等语句输出变量的值)以追踪变量值的变化,通过观察程序的运行情况而最终找到程序出错的原因。

交互式调试则是利用集成开发环境中所带的调试器软件,通过在程序中设置断点,同时对所有变量进行自动跟踪,从而最终找出错误原因的方法。

初学者每当遇到运行时错误或者程序出现意料之外的运行结果时,往往茫然不知所措或者惊慌不定。其实应该认识到,程序出现错误之时往往是学习程序设计的最佳时机。通过对错误的处理,使我们能够更深刻更真实的理解语法以及程序设计中应该重视的方方面面,从而在以后的设计中避免犯同类错误。总之,程序调试是每一位初学者都必须跨过的坎,所有的常用调试技术都应该认真学习和掌握。

此外值得注意的是,程序调试技能的培养与提高往往不是传统的教学方法能够完成的,这往往需要学习者有较高的专注程度,同时通过大量的编码来渐进掌握。不过,虽然程序调试的技巧和能力是应当在实际的编程过程中来掌握的,但在此之前对调试方法和相关知识作一些了解是非常有必要的。由于手动跟踪相对简单,因此以下主要介绍程序跟踪和交互式调试方法。

程序跟踪

一个程序需要调试,往往是由于在程序运行中出现死锁、程序不响应,或者是程序运行结束却输出不正确,或者是程序无缘无故中止却没有任何出错信息或异常。这些情况与编译错误和链接错误不同,编译错误和链接错误分别由编译器和链接器发现,并且一般能大致判定出错的原因和位置,有些甚至能非常准确的定性错误产生的原因,因而能较容易的发现和处理。而调试时的异常情况常常是没有任何系统信息可以帮助你的,对于错误在何处发生,你也可能有线索,也可能没有线索,取决于你对语言的了解、对程序流程的了然于胸,因此,调试是比处理编译和链接错误更困难的事情,需要更高的技巧和水平。以下是一个最简单的、也是大多数初学者最常犯错误的、需要调试的程序。

这个程序由于数组下标越界,从而出现内存的非法访问系统错误,但这个错误是不会被编译器和链接器发现的,因而能够顺利地通过编译链接从而生成应用程序。但在程序运行时却会出现错误,这个错误一般会被操作系统捕获,捕获后如果系统中没有实时的调试器则会提示关闭程序,如系统中有实时的调试器在则会由调试器接管应用程序。实时调试器一般会提示用户选择直接退出程序或者启动调试,如下图则是在系统中安装有VC6所带实时调试管理器(Debug Manager)时的情况:

当用户选择[确定]时将由VC启动调试器来调试程序,如下图所示:

对于需要调试的程序,使用程序本身并不需要的输出语句来进行跟踪,是调试程序的一个最重要的方法。其中最常用的方法就是在程序的关键位置用printf语句或cout语句输出当前关键变量或某些变量的值,通过查看这些变量的值的变化来查找程序出错的原因。当然,如果愿意,你可以在每行源代码的后面都加上输出语句,从而一步一步地追踪程序的行为,但这样作在时间和精力上是缺乏效率的。因此必须经过认真思考和选择,确定应在何处插入输出语句之后,跟踪才可能凑效。

插入printf和cout输出语句的方法存在一个缺点,就是当程序调试完毕后我们必须将所有程序不需要的输出语句逐一手动删除,如果再次需要调试时又要经历逐一加上和删除的过程,很不方便。为此,在C++中提供了另外的处理方法实现对变量的检查,并且能很方便地让这些检查语句失效,其中最常用的就是assert宏。assert宏接收一个表达式,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值