论文部分内容阅读
当软件出现问题时,你第一个会想到的是什么?自己操作不当、操作系统有故障……有没有想过是软件本身的设计缺陷(或者说BUG)造成的呢?你不用是程序员也能区分软件本身和系统究竟谁“犯了错”,如果是软件缺陷造成的故障,应该如何避开呢?
收集线索,找出软件故障真凶
1.缺胳膊少腿当然无法动弹
现象:运行软件提示找不到DLL文件
系统中包含很多运行库文件,有了它们软件才能正常运行。软件就像一张光盘,而运行库则是适合的光驱,有时系统中只有CD光驱(自带的运行库),那么要播放DVD光盘(需要其他运行库才能运行的软件)时自然就不行了。想让软件不再受到缺少运行库的干扰,可见本刊2005年第15期的《畅行无阻,给程序一张无敌通行证》。
2.毫无征兆的错误
现象:程序运行中突然发生错误退出
大家平时遇到这种情况最多的可能就是QQ的无故退出了,有时聊了几句切换了一下输入法,或者视频聊天后关闭窗口,很容易就出现了QQ发生错误需要关闭的提示。这种情况大多是软件本身的毛病,有些软件错误退出时还挺“厚道”,询问你是否查看详细的错误报告,根据这个可以确定是系统目录中的文件还是软件本身出了问题。
3.运行到这儿就出错
现象:软件每次运行到特定位置就出错
比起毫无征兆的错误,这种错误还是比较“人性化”的。在判断故障原因前应该先关闭杀毒软件的实时监控,然后在软件出错后,在“控制面板→管理工具”的系统事件查看器中找找错误日志,看看是不是哪个系统服务被禁用了而导致软件出错,因为很多软件的功能都是基于系统服务的。
4.从软件的“遗书”里找线索
现象:软件发生错误退出后留下错误日志
有些软件发生错误后会在运行目录下生成错误日志(文件名很明显,如ERR.LOG),用“记事本”打开后可以找到发生错误的原因。
谁留下了“破绽”

1.Windows消息机制=听啥干啥
传说中程序员都是一群极端严谨的人,怎么会平白无故在软件中留下这么多问题呢?很多人觉得不可思议。先来说说Windows的程序是怎么“跑”起来的吧!程序员在开发软件时所要做的其实也就是替程序设定在听到什么消息时做什么事,比如听到“按钮被按下”的消息时,做“弹出一个对话框”的动作。
2.比大小比出“破绽”来
软件的“破绽”大多是没有充分考虑可能听到的消息而造成的,比如以前曾经有个新手编写了一个比较两个数字大小的工具,界面很简单,有两个输入框一个按钮,在两个输入框内分别填入数字后点击按钮,就会弹出对话框告诉你哪个数字比较大,但当你尝试往输入框中填入非数字内容(比如一个英语单词)时,程序就发生错误强行退出了,提示“变量类型不匹配”。这是为什么呢?因为那个新手以为软件用户会按照使用说明在输入框中填写数字,而没有考虑有人会填写英语单词的情况,于是直接拿两个单词来比大小,就发生了错误。而一个完善的程序,可能仅仅在软件开头处多加了一个动作,先对输入框的内容进行检测,如果不是数字就不进行比较操作。
惹不起我躲得起:直面4大最常见BUG
软件缺陷不仅存在于那些制作低劣的软件中,几乎每个软件都存在或大或小的缺陷(据说Windows 2000刚发布时就发现了数千个BUG)。如果在不知情的情况下,你因为软件的BUG而把一大堆辛辛苦苦整理出来的数据弄丢了,会是何种心情呢?所以看清常用软件的缺陷对于避免造成损失是非常重要的,除此之外,看看各大知名软件出的“丑”也是件有意思的事。
最常见BUG第1名:程序进入假死,界面呈白色。
典型代表:MailWasher 危害程度:★★★★☆
病情分析:在MailWasher中选择了一大堆垃圾邮件,点击“Process”(处理)键后界面就开始假死,有时甚至会出现假死整整一下午的情况,界面无响应呈白色。不得不承认MailWasher的编写者在功能上做得不错(能解决CFan邮箱中多达每天数千封的垃圾邮件),可他的编写者却犯了一个非常严重的错误——功能实现和界面显示使用单线程一起进行。当在MailWasher中按下“Process”按钮后,程序就开始删除已识别的垃圾邮件,在删除完成前,程序不接收用户的键鼠操作也不刷新软件界面(所以界面变白了),所以尽管你拼命地点击“Stop”按钮,可是程序根本不听“按钮被按下”的消息,所以自然也不会完成停止操作了。优秀的程序会将逻辑处理和界面显示放在两条并行的线程上进行,这样不耽误删除垃圾邮件同时也能够及时地响应用户的操作。
BUG防弹衣:当然不能指望作者在短期内将软件的结构重新规划并推出多线程的升级版本,而且存在此缺陷的软件很多,如何避免这类假死程序拖慢整个系统?右击任务栏空白处选择“任务管理器”,在弹出窗口的“进程”选项卡中找到假死的进程(可以通过排序“CPU”占用来迅速定位),右击选择“设置优先级→低”(见图)。这样虽然不能解决程序自身暂时假死的问题,但系统中的其他进程不会被一起拖慢了。
最常见BUG第2名:初次运行时不正常
典型代表:QQ 2005
危害程度:★★★☆☆
病情分析:作为一款国内使用人数最多的即时通信工具,QQ在编写时犯的一些低级错误不可原谅。初次登录某个QQ号码时,一定会提示“密码不正确”,有经验的老鸟会尝试点击到服务器确认,而菜鸟则会觉得自己的密码被盗了放弃登录。QQ安装目录下会有每个在本机登录过的号码的目录(以号码命名),其中保存了用户密码的MD5值,用户下次登录时先会将其输入的密码计算出MD5值与本地文件中保存的MD5值进行比较,如果一致的话就直接连接服务器登录,反之则提示密码不正确并询问是否到服务器验证。不过QQ的编写者显然忽略了一个重要的问题:某个号码在第一次登录时,QQ安装目录中是不存在上一次登录过的密码的MD5值的,那么把正确密码的MD5值与空白(程序认为“空白”就是上一次登录计算出的MD5)进行比较的结果当然是“密码不正确”!除此之外,QQ还有一大堆类似的设计缺陷(比如新安装QQ后登录框中的文字“请在此输入您的QQ号码”在获得鼠标焦点后不自动清除等),强烈建议腾讯对程序员进行一次基础培训。
其实要解决这个BUG很简单,腾讯要做的仅仅是在“登录”按钮的“点击”事件发生时判断一下是否存在上次登录密码的MD5记录,可是好几个Beta版本过去了,到了正式版仍有这个问题。
BUG防弹衣:在提示“密码不正确”后选择到服务器端验证,经过一次登录后就不会再提示了。
最常见BUG第3名:文件/设置没有及时保存
典型代表:Maxthon
危害程度:★★★★☆
病情分析:经过测试发现,最新版的Maxthon已经修正了设置没有及时保存到硬盘文件的问题,这个问题仅存在于老版本中。具体表现为在Maxthon选项中更改了一些设置后,如果Maxthon未被正常关闭(包括关机前未手动关闭Maxthon)或发生错误退出,这些设置在下次打开Maxthon时就已经全丢失了。存在这个缺陷的软件也实在不少,软件的设置还是小事,如果是花费一晚上整理出来的文档……
其实这种BUG的原因是软件在运行时将文件或设置的修改保存在内存中,而在听到“程序退出”消息时才进行“写入硬盘”的操作。不过程序发生错误或者被强行关闭时,还没来得及听到“程序退出”消息并作出反应时就已经被关闭了,那么内存中的信息也就无法保存到硬盘中了。
BUG防弹衣:为了确保程序在发生错误异常关闭时数据不丢失,需要时常手动保存一下或使用软件提供的定时自动备份功能,比如EmEditor,选择菜单“Tools→Properties for Current Configuration”(工具→当前配置属性),在弹出窗口中选择“Backup”(备份)选项卡,勾选“Save Backups to Backup Folder”(将数据保存到备份文件夹),在下方的“Backup Folder”(备份文件夹)中设定用来保存备份的位置,点击“确定”(见图)。同时,如果是软件设置由于设计缺陷无法自动保存,那么可以在设置完成后手动关闭程序一次再重新打开。
最常见BUG第4名:文件被强制锁定
典型代表:QQ及其他IM软件
危害程度:★★★☆☆
病情分析:QQ 2005正式版已经修正了这个问题,不过由于这个故障现象在其他软件中也很常见,不得不说啊!在QQ中使用“发送文件”功能,其全过程其实就是“发送端QQ打开并读取要发送的文件→将读出的内容发送至接收端QQ→接收端QQ将收到的内容写入硬盘文件中”,在发送端QQ打开读取要发送的文件时,有一个选项“是否锁定该文件”,如果设置为“锁定”,则该程序在未关闭读取的文件前,其他程序是无法访问此文件的,而QQ正是使用“锁定”读取。正确的方式应该是在最后添加一个“关闭打开的文件”的动作,QQ发送完文件后该文件就能被其他程序正常读取了。
BUG防弹衣:在遇到文件被某个程序长期强制锁定时,可以尝试关闭锁定的程序,如果找不到究竟是谁锁定了文件,可以从http://www.onlinedown.net/soft/24732.htm下载Unlocker并安装,安装时注意选择简体中文,安装完成后打开“资源管理器”,右击锁定的文件,在弹出菜单中选择“Unlocker”,解除锁定后就能正常使用该文件了(见图)。
收集线索,找出软件故障真凶
1.缺胳膊少腿当然无法动弹
现象:运行软件提示找不到DLL文件
系统中包含很多运行库文件,有了它们软件才能正常运行。软件就像一张光盘,而运行库则是适合的光驱,有时系统中只有CD光驱(自带的运行库),那么要播放DVD光盘(需要其他运行库才能运行的软件)时自然就不行了。想让软件不再受到缺少运行库的干扰,可见本刊2005年第15期的《畅行无阻,给程序一张无敌通行证》。
2.毫无征兆的错误
现象:程序运行中突然发生错误退出
大家平时遇到这种情况最多的可能就是QQ的无故退出了,有时聊了几句切换了一下输入法,或者视频聊天后关闭窗口,很容易就出现了QQ发生错误需要关闭的提示。这种情况大多是软件本身的毛病,有些软件错误退出时还挺“厚道”,询问你是否查看详细的错误报告,根据这个可以确定是系统目录中的文件还是软件本身出了问题。
3.运行到这儿就出错
现象:软件每次运行到特定位置就出错
比起毫无征兆的错误,这种错误还是比较“人性化”的。在判断故障原因前应该先关闭杀毒软件的实时监控,然后在软件出错后,在“控制面板→管理工具”的系统事件查看器中找找错误日志,看看是不是哪个系统服务被禁用了而导致软件出错,因为很多软件的功能都是基于系统服务的。
4.从软件的“遗书”里找线索
现象:软件发生错误退出后留下错误日志
有些软件发生错误后会在运行目录下生成错误日志(文件名很明显,如ERR.LOG),用“记事本”打开后可以找到发生错误的原因。
谁留下了“破绽”

1.Windows消息机制=听啥干啥
传说中程序员都是一群极端严谨的人,怎么会平白无故在软件中留下这么多问题呢?很多人觉得不可思议。先来说说Windows的程序是怎么“跑”起来的吧!程序员在开发软件时所要做的其实也就是替程序设定在听到什么消息时做什么事,比如听到“按钮被按下”的消息时,做“弹出一个对话框”的动作。
2.比大小比出“破绽”来
软件的“破绽”大多是没有充分考虑可能听到的消息而造成的,比如以前曾经有个新手编写了一个比较两个数字大小的工具,界面很简单,有两个输入框一个按钮,在两个输入框内分别填入数字后点击按钮,就会弹出对话框告诉你哪个数字比较大,但当你尝试往输入框中填入非数字内容(比如一个英语单词)时,程序就发生错误强行退出了,提示“变量类型不匹配”。这是为什么呢?因为那个新手以为软件用户会按照使用说明在输入框中填写数字,而没有考虑有人会填写英语单词的情况,于是直接拿两个单词来比大小,就发生了错误。而一个完善的程序,可能仅仅在软件开头处多加了一个动作,先对输入框的内容进行检测,如果不是数字就不进行比较操作。
惹不起我躲得起:直面4大最常见BUG
软件缺陷不仅存在于那些制作低劣的软件中,几乎每个软件都存在或大或小的缺陷(据说Windows 2000刚发布时就发现了数千个BUG)。如果在不知情的情况下,你因为软件的BUG而把一大堆辛辛苦苦整理出来的数据弄丢了,会是何种心情呢?所以看清常用软件的缺陷对于避免造成损失是非常重要的,除此之外,看看各大知名软件出的“丑”也是件有意思的事。
最常见BUG第1名:程序进入假死,界面呈白色。
典型代表:MailWasher 危害程度:★★★★☆
病情分析:在MailWasher中选择了一大堆垃圾邮件,点击“Process”(处理)键后界面就开始假死,有时甚至会出现假死整整一下午的情况,界面无响应呈白色。不得不承认MailWasher的编写者在功能上做得不错(能解决CFan邮箱中多达每天数千封的垃圾邮件),可他的编写者却犯了一个非常严重的错误——功能实现和界面显示使用单线程一起进行。当在MailWasher中按下“Process”按钮后,程序就开始删除已识别的垃圾邮件,在删除完成前,程序不接收用户的键鼠操作也不刷新软件界面(所以界面变白了),所以尽管你拼命地点击“Stop”按钮,可是程序根本不听“按钮被按下”的消息,所以自然也不会完成停止操作了。优秀的程序会将逻辑处理和界面显示放在两条并行的线程上进行,这样不耽误删除垃圾邮件同时也能够及时地响应用户的操作。
BUG防弹衣:当然不能指望作者在短期内将软件的结构重新规划并推出多线程的升级版本,而且存在此缺陷的软件很多,如何避免这类假死程序拖慢整个系统?右击任务栏空白处选择“任务管理器”,在弹出窗口的“进程”选项卡中找到假死的进程(可以通过排序“CPU”占用来迅速定位),右击选择“设置优先级→低”(见图)。这样虽然不能解决程序自身暂时假死的问题,但系统中的其他进程不会被一起拖慢了。
最常见BUG第2名:初次运行时不正常
典型代表:QQ 2005
危害程度:★★★☆☆
病情分析:作为一款国内使用人数最多的即时通信工具,QQ在编写时犯的一些低级错误不可原谅。初次登录某个QQ号码时,一定会提示“密码不正确”,有经验的老鸟会尝试点击到服务器确认,而菜鸟则会觉得自己的密码被盗了放弃登录。QQ安装目录下会有每个在本机登录过的号码的目录(以号码命名),其中保存了用户密码的MD5值,用户下次登录时先会将其输入的密码计算出MD5值与本地文件中保存的MD5值进行比较,如果一致的话就直接连接服务器登录,反之则提示密码不正确并询问是否到服务器验证。不过QQ的编写者显然忽略了一个重要的问题:某个号码在第一次登录时,QQ安装目录中是不存在上一次登录过的密码的MD5值的,那么把正确密码的MD5值与空白(程序认为“空白”就是上一次登录计算出的MD5)进行比较的结果当然是“密码不正确”!除此之外,QQ还有一大堆类似的设计缺陷(比如新安装QQ后登录框中的文字“请在此输入您的QQ号码”在获得鼠标焦点后不自动清除等),强烈建议腾讯对程序员进行一次基础培训。
其实要解决这个BUG很简单,腾讯要做的仅仅是在“登录”按钮的“点击”事件发生时判断一下是否存在上次登录密码的MD5记录,可是好几个Beta版本过去了,到了正式版仍有这个问题。
BUG防弹衣:在提示“密码不正确”后选择到服务器端验证,经过一次登录后就不会再提示了。
最常见BUG第3名:文件/设置没有及时保存
典型代表:Maxthon
危害程度:★★★★☆
病情分析:经过测试发现,最新版的Maxthon已经修正了设置没有及时保存到硬盘文件的问题,这个问题仅存在于老版本中。具体表现为在Maxthon选项中更改了一些设置后,如果Maxthon未被正常关闭(包括关机前未手动关闭Maxthon)或发生错误退出,这些设置在下次打开Maxthon时就已经全丢失了。存在这个缺陷的软件也实在不少,软件的设置还是小事,如果是花费一晚上整理出来的文档……
其实这种BUG的原因是软件在运行时将文件或设置的修改保存在内存中,而在听到“程序退出”消息时才进行“写入硬盘”的操作。不过程序发生错误或者被强行关闭时,还没来得及听到“程序退出”消息并作出反应时就已经被关闭了,那么内存中的信息也就无法保存到硬盘中了。
BUG防弹衣:为了确保程序在发生错误异常关闭时数据不丢失,需要时常手动保存一下或使用软件提供的定时自动备份功能,比如EmEditor,选择菜单“Tools→Properties for Current Configuration”(工具→当前配置属性),在弹出窗口中选择“Backup”(备份)选项卡,勾选“Save Backups to Backup Folder”(将数据保存到备份文件夹),在下方的“Backup Folder”(备份文件夹)中设定用来保存备份的位置,点击“确定”(见图)。同时,如果是软件设置由于设计缺陷无法自动保存,那么可以在设置完成后手动关闭程序一次再重新打开。
最常见BUG第4名:文件被强制锁定
典型代表:QQ及其他IM软件
危害程度:★★★☆☆
病情分析:QQ 2005正式版已经修正了这个问题,不过由于这个故障现象在其他软件中也很常见,不得不说啊!在QQ中使用“发送文件”功能,其全过程其实就是“发送端QQ打开并读取要发送的文件→将读出的内容发送至接收端QQ→接收端QQ将收到的内容写入硬盘文件中”,在发送端QQ打开读取要发送的文件时,有一个选项“是否锁定该文件”,如果设置为“锁定”,则该程序在未关闭读取的文件前,其他程序是无法访问此文件的,而QQ正是使用“锁定”读取。正确的方式应该是在最后添加一个“关闭打开的文件”的动作,QQ发送完文件后该文件就能被其他程序正常读取了。
BUG防弹衣:在遇到文件被某个程序长期强制锁定时,可以尝试关闭锁定的程序,如果找不到究竟是谁锁定了文件,可以从http://www.onlinedown.net/soft/24732.htm下载Unlocker并安装,安装时注意选择简体中文,安装完成后打开“资源管理器”,右击锁定的文件,在弹出菜单中选择“Unlocker”,解除锁定后就能正常使用该文件了(见图)。