linux下根文件系得统制作工具。内带shell命令
源代码在线查看: unix系统开发-程序调试概述.txt
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语言程序的调试为例来说明其用法。