UNIX系统管理:程序调试概述

对任何">程序开发而言,程序的调试都是开发过程中的一个重要阶段。程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作。

程序的调试有几种不同的级别。最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之。最低级别是对汇编代码进行调试。由于汇编语言代码的复杂、冗长与不直观。在汇编级对程序进行调试是一件比较费力的事。但UNIX得开发环境提供了汇编级的调试工具adb。使用此调试程序可以找出程序执行失败的原因,并在受控的环境下执行程序。

使用得最多的大概还是源程序级即符号级的调试,在此种调试方式下我们能够把高级语言的语句当作一个可执行的最小单位,在调试程序中使用源程序中出现的符号和代码的行号来交互式地引用变量或控制语句的执行。

UNIX环境下进行符号级调试的工具有两个。一个是dbx,使用它可以确定程序崩溃的位置、显示变量和表达式的值,在程序中设置断点以及跟踪程序的执行,等等。这一调试工具主要来源于BSD 的UNIXT系统中使用的比较多。另外一个符号级的调试工具是sdb。sdb的最初来源于UNIX System V。它的功能同dbx类似。使用sdb,我们不仅能够在事后对某个程序进行调试,而且能够在程序运行中对之进行调试。

本章我们主要介绍sdb。

我们将要讨论的内容包括:

程序调试概述 主要讨论一般的程序调试方法和大部分调试工具都提供的功能。

sdb的启动 主要讨论在进入sdb时所涉及到的一些问题。

sdb的交互式命令 主要介绍sdb提供的完成各种调试工作的命令的用法。

程序调试概述

所谓程序调试,就是找出程序中的错误,进行修改,使之能够正常地运行。“调试”这一词对应的英文单词为“debug”。

虽然程序调试同编程一样,是一项技巧性和经验性都非常强的工作,但总的来说程序调试还是有其一般性的。这种一般性不是指程序调试做法上的一般性,而是指程序调试中所用到的各种技术的一般性。例如,设置断点、控制指令的执行、显示或修改变量的值等。虽然各种语然有其各自不同的特点,各种调试工具在具体使用方法上也有所不同,但对于这些一般性的技术却是基本上相同的。

程序调试说到底也无非就是观察各指令的执行情况。而指令除了那些顺序执行的之外。其他也无非是条件分支、循环转移和函数调用几类。条件分支和循环转移地具体执行过程都是由条件控制的,而条件最终是由各变量构成的。函数调用则是参数的传递,而这些参数绝大部分是由程序中的变量充当的(有些参数是一些常量)。因此程序的调试过程,就是观察程序程序中各变量的值的变化过程,分析各个值出现的原因,并进而找出根源,排除之。

有了这种一般性的看法我们再回过头来理解程序调试和各种调试工具的使用就会觉得比较自然了。各种调试工具的最终目的都是要使用户能够方便地观察在某些指令被执行之后有关变量的值的变化情况。

归纳起来,程序调试中所用到的一些技术包括:

程序执行流程控制:主要指断点的设置、指令的单步或连续执行等。

变量的检查: 主要指显示或修改变量的值。这里的变量不仅仅指程序中自己定义的变量,还包括内存的某块存储区域以及寄存器等。

函数调用栈的显示: 指的是当前程序执行过程中函数的调用关系。借助于此种调用关系,我们能够从总体上把握程序的执行情况。

汇编语言级的调试: 上面我们所说的指令的单步或连续执行中的指令,是指一条条的高级语言语句讲的。但经过编译之后,一条高级语言语句将被编译成多条功能与之等效的汇编指令。在需要更仔细地观察程序执行情况时,就能够使用调试工具进行汇编级的调试。

源程序的显示: 主要使调试人员能够方便地观察已经或将要被执行的指令到底是些什么指令。

各种不同的调试工具虽然在具体的操作方法、工作方式上有所不同,但它们一般都能提供上述的各种功能。不同的只是这些功能的表示形式。例如,在多窗口的系统中,上面说说的各个方面可以按照一种比较直观的方式在多窗口中分别显示出来。而在面向命令行的系统中,则需要我们更深刻地领会调试和调试工具的本质,在学会了使用某个调试工具之后,再去使用其他任何调试工具都会感到得心应手。

从下一节开始,我们将具体介绍此类面向命令行的调试工具中的一个杰出代表sdb的使用。这种调试工具是源代码级的,而且除了可以调试C语言程序之外,还可以对其他高级语言程序,如Fortran,Pascal程序进行调试。在后面的介绍中我们将对C语言程序的调试为例来说明其用法。

时间: 2024-07-28 15:26:07

UNIX系统管理:程序调试概述的相关文章

UNIX系统管理:sdb命令使用-程序执行控制

我们说程序调试的主要目的是观察变量的变化情况.但如果程序就一直不停地运行直至它终止或出错时才停下来的话,将没有机会去观察任何变量.因此,如何有效地控制程序中各语句的执行,使之在适当的时候暂停下来,待调试人员在显示或设置了某些存储单元的值之后再从停下的地方继续执行下去,是调试程序应具有的一项基本功能.在这一节中我们就来具体介绍如何控制程序的运行. 对程序执行控制的第一个问题是设置断点.一个断点实际上就是程序中某行语句.当程序执行到这条语句时控制会重复返回到sdb,由此提供给用户进行其他操作,如显示

详解如何将Unix应用程序移植到Linux系统

介绍 您知道 Linux 现在已是世界第二的服务器操作系统吗?今天,您的应用程序在 Linux 上运行吗?如果不是,那么本文将给您些提示和技巧,在您把应用程序移植到 Linux 的时候为您提供指导.本文依据的是软件工程师的经验,这些工程师来自独立软件供应商(Independent Software Vendors,ISV)和全世界的 IBM 实验室,他们参与了许多把应用程序移植到 Linux 的项目. 首先我们描述 Linux 的特征和它在开发和管理应用程序中的具体价值.接着,我们将回顾重要问题

UNIX系统管理:CC命令

在UNIX系统中,实现C源程序到可执行文件的这一转换过程的工具是cc.在大多数系统中cc实际上是一个shell命令文件.有些系统中的C编译程序可能并不叫cc而是其它的一个什么名称,如Sun工作站上常用的gcc等等.但这些都无关紧要.大多数系统中C编译命令的用法基本上都是类似的.我们这里介绍的将以SVR4上的C编译系统为基础. cc基本用法 一般我们只需要将C源程序的名字写在CC命令行中,cc即可对这些源文件(.c文件)进行编译.如果这些源文件中都没有main()函数的定义,那么cc将只能生成与各

UNIX系统管理:sdb的启动

首先来看看在哪些情况下需要对程序进行调试. 第一种情况(这是大多数用户都会碰到的),程序在运行过程中忽然跳了出来,屏幕上显示一个xxxx-core dumped消息,然后Shell提示符就又显示出来了,其中xxxx表示出错原因.这种情况的出现一般是系统核心认为进程的执行出现了异常,如进程试图去访问一块不允许它访问的存储区域(Memory Fault,Segmentation Fault);或者扫描某个无终止符的字符串(Bus http://www.aliyun.com/zixun/aggrega

php程序调试方法总结

  相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心,更需要耐心,切忌心浮气躁.但是当找出问题并顺利解决它时,又会给人无比激动的喜悦.这里总结一下笔者在程序调试中的使用的原则,工具,以及方法.这里需要说明的是,某些原则性的东西,各种语言都是差不多的,而涉及到具体的工具和某些具体的调试方法,这里只涉及web开发方面的内容. 总体原则: 1.找出问题原因: 程序需要调试,是因为程序有问题.而调试的第一目标是找到原因.常见调试方法, 排除法: 当我们面对整个复

为 IBM PureApplication System 做好准备(一)应用程序迁移概述

简介 IBM PureApplication System 是一种优化了工作负载的集成式硬件和软件设备,设计用于显著简化私有云环境中应用程序的开发.供应和管理.它具有集成管理功能,允许通过自助服务提供灵活的应用程序.数据库和其他工作负载. 利用 PureApplication System,IBM 重新定义了一些关键数据中心概念.硬件和软件深度集成在一起,提供无与伦比的自动化.性能和简单性水平.为了更好地在业务中利用这种力量,务必谨慎考虑您的应用程序组合,关注如何利用这些特征的优势.本文章系列立

第十二章-异常处理与程序调试(二)(5)

12.4 程序调试简介 Delphi提供了一个功能强大的内置调试器(Integrated Debugger), 因而对程序的调试不用离开集成开发环境(IDE)就可以进行. 程序错误基本可以分为两类,即运行时间错和逻辑错.所谓运行时间错是指程序能正常编译但在运行时出错.逻辑错是指程序设计和实现上的错误.程序语句是合法的,并顺利执行了,但执行结果却不是所希望的. 对于这两类错误,调试器都可以帮助你快速定位错误,并通过对程序运行的跟踪和对变量值的监视帮助你寻找错误的真正原因和解决错误的途径. 程序调试

.NET程序调试技巧(一):快速定位异常的一些方法

  这篇文章主要介绍了.NET程序调试技巧(一):快速定位异常的一些方法,本文讲解了定位本机异常.在客户环境定位.net程序异常两方面的内容,需要的朋友可以参考下 作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重要的.有句话叫"发现问题是解决问题的一半. 本文讲述就快速定位异常(专指.NET程序异常)的方法.包括在本机定位异常,在客户环境定位.n

c语言-C语言简单程序调试问题

问题描述 C语言简单程序调试问题 这是源码: #include #include int main() { double x,y,z,i; for(x = 1;x<100000;x++) { y = sqrt(x+100); z = sqrt(x+268); if((y*y == x+100)&&(z*z == x+268)) { printf("%lfn",x); } } return 0; } 不知道问题出在哪里?麻烦解答一下. 另,为什么知道设定的数值范围是