Stamp of Software Debugging
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
navigation bar seprate line
第4篇 编译器的调试支持

今天,我们经常把编程(programming)和编码(coding)两个词等同使用,泛指使用程序语言实现算法的过程。但是在现代计算机诞生后的大约十年中(上个世纪40年代和50年代初期),编程和编码却是两个不同的概念。编程是指将使用公式(equation)、框图(diagram)等表达的算法细化为包含输入输出和控制逻辑的流程图(flow chart)的过程。而编码是指将流程图翻译为计算机机器指令的过程。因为要靠手工编辑每一条机器指令,所以当时的编码工作不仅要精通计算机技术,还要有耐心和顽强的毅力。在这一背景下,很多人开始探索自动的编码方法(automatic coding)。 [因篇幅所限,此段未在书中印出]

在计算机科学尤其是软件的发展历史中,Grace Murray Hopper(1906—1992)是一位做出了重大贡献的杰出女科学家。她的主要成就之一就是发明了编译器——可以将程序语言翻译成机器码的自动编码工具。Grace于1951年到1952年间开发了A-0编译器,A-0编译器被公认为是计算机历史上的第一个编译器。

编译器的出现为编程语言的繁荣和软件产业的形成奠定了基础。有了编译器,人们把繁琐的编码工作交给机器来完成,编码时间一下子减小到几乎可以忽略的地步,以至于今天我们很少再关心机器码的产生过程,就连编码这个词的主要含义也由本来的编写机器码演变为编写源代码。

编译器的出现,对软件调试也有着极其重要的意义。在1955年题为《数字计算机自动编码》的著名演讲中,Grace在谈到自动编码的优势时,首先讲的是降低了调试时间,因为编译器编码比人工编码更加准确,而且可以做很多自动的检查。可见,Grace在设计第一个编译器时便考虑到了检查编程错误和支持软件调试。今天的编译器尽管与50多年前Grace所发明的编译器有了很大的变化,但是有一点没有变,那就是支持调试仍然是编译器设计中的一项基本任务,很多调试技术都是建立在编译器的有关支持基础上的。可以把编译器的调试支持概括为以下几个方面。

编译期检查:编译器在编译过程中,除了检查代码中的语法错误外,还会检查可能存在的逻辑错误和设计缺欠,并以编译错误或警告的形式报告出来。

运行期检查:为了帮助发现程序在运行阶段所出现的问题,编译器在编译时可以产生并加入检查功能,包括内存检查、栈检查等。

调试符号:今天的大多数软件都是使用更易于人类理解的中高级编程语言(如C/C++,Pascal等)编写的,然后由编译器编译为可执行程序交给CPU执行。当调试这样的程序时,我们可以使用源程序中的变量名来观察变量,跟踪或单步执行源程序语句,仿佛CPU就是在直接执行高级语言编写的源程序。我们把这种调试方式称为源代码级调试(Source Code Level Debugging)。要支持源代码级调试,调试器必须有足够的信息将CPU使用的二进制地址与源程序中的函数名、变量名和源代码行联系起来,起到这种桥梁作用的便是编译器所产生的调试符号(Debugging Symbols)。调试符号不仅在源代码级调试中起着不可缺少的作用,在没有源代码的汇编级调试和分析故障转储文件时,也是非常宝贵的资源。有了正确的调试符号,我们便可以看到要调用的函数名称或要访问的变量名(只要调试符号中包含它)。当对冗长晦涩的汇编指令进行长时间跟踪时,这些符号的作用就好像是黑夜中航行时所遇到的一个个灯塔。

内存分配和释放:使用内存的方法和策略关及软件的性能、稳定性、资源占用量等诸多指标,很多软件问题也都与内存使用不当有关。因此,如何降低内存使用的复杂度,减少因为内存使用所导致的问题便很自然地成为编译器设计中的一个重要目标。例如,在编译调试版本时,编译器通常会使用调试版本的内存分配函数,加入自动的错误检查和报告功能。

异常处理:Windows操作系统和C++这样的编程语言都提供了异常处理和保护机制。编译包含异常保护机制的代码需要编译器的支持。

映射(MAP)文件:很多时候,我们可以得到程序崩溃或发生错误的内存地址,这时我们很想得到的信息就是这个地址属于哪个模块,哪个源文件,甚至哪个函数更好。调试符号中包含了这些信息,但是调试符号通常是以二进制的数据库文件形式存储的,适合调试器使用,不适合人工直接查阅。映射(MAP)文件以文本文件的形式满足了这一需要。

本篇将先介绍编译有关的基本概念和编译期检查(第20章),然后介绍运行库和运行期检查(第21章),第22章和第23章将分别介绍栈和堆的原理和有关问题,第24章将介绍编译器编译异常处理代码的方法,第25章将详细讨论调试符号。

navigation bar seprate line
Copyright (C) 2008-2013 Raymond Zhang, All Rights Reserved