导致致命异常错误和无效页错误的原因是什么?
如果Microsoft Word或Excel“崩溃”,意味着在程序执行过程中出现了严重的错误。操作系统常常会发现存在一个严重问题,并完全关闭产生冲突的应用程序。执行这一操作时,操作系统会显示“致命异常错误”之类的含糊不清的提示(常常还显示一大堆十六进制数,这些数字对于原始程序员可能有一点用,而对用户却毫无用处)。程序崩溃还有一种可能,就是它将操作系统拖垮了,在这种情况下,您必须重新启动。
即使您对这些含糊不清的错误消息束手无策,至少也应该知道它们的含义!现在,让我们了解三个最常见的消息:
- 致命异常错误——Microsoft Word等应用程序由很多层和组件构成。其中包括操作系统内核、操作系统服务层,在系统服务之上可能还有封装层,另外还有几百个软件库、内部函数/类库和DLL,以及主应用程序层。大多数现代操作系统和语言(如C++、Java等)支持异常和异常处理的编程概念。通过异常机制,不同的层可以相互传播问题。例如,假设程序需要一些内存,它就会请求操作系统保留一块内存。如果操作系统无法满足内存请求(由于请求的内存块太大、或系统内存不足等原因),就会“抛出一个内存异常”,向上传播到提交请求的层。各层可以继续向上抛出异常。在这条通道的某个位置,总有一个层需要来“捕获异常”,处理相应问题。程序必须得说:“哎呀——系统内存不足。我得在一个漂亮的对话框中告诉用户这一消息。”如果程序未能捕获异常(由于某种原因,程序员没有编写处理这个特殊异常的代码),异常就会一路向上经过所有层,而操作系统就会将它视作“未处理的异常”。然后,操作系统会关闭程序。设计完备的软件可以处理所有异常。
- 无效页错误——程序使用内存(RAM)来存储数据。例如,在将文档加载到Microsoft Word中时,正在编辑的那部分文件很大,占用了全部RAM空间。程序需要内存时,它会请求操作系统提供特定大小的内存块。程序使用“指针”,记住它所分配的每个内存块的位置。如果程序试图向内存块以外的位置写入数据,或者错误地使用无效指针,试图访问不存在的内存块,操作系统就可以发现这种情况,并生成“页错误”或“段错误”消息。由于程序明显是在胡乱操作,因此操作系统会将其关闭。
- 非法操作——微处理器需要处理它理解的有限数量的指令,每条指令都由一个称为“操作码”的数字表示。操作码43可以表示“加”,52可以表示“乘”。如果微处理器在执行一个程序时,遇到不能识别的操作码,或者遇到在当时状态下无法执行的操作码,微处理器就会停止执行程序。操作系统通过关闭冲突的程序,解决这一问题。非法操作码通常是由于软件跳到内存中不含有效程序信息的位置引起的。
所有这些问题都是程序员的人为错误引起的。程序员工作不够细致,没有捕获某个异常,或者允许程序访问无效内存。有时候,根本原因在于其能力欠缺或经验不够。但在很多情况下,还是因为现在的程序太复杂了。在复杂的分层环境中,程序要管理几百个异常,通常还要管理数以百万计的内存块。一步失误,就可能导致应用程序崩溃——软件是非常脆弱的。测试可以发现很多错误,但通常难以发现全部错误。