《Effective Debugging:软件和系统调试的66个有效方法》——第14条:考虑对软件进行更新

第14条:考虑对软件进行更新

接下来,笔者要说几个很多人都意想不到的bug来源。并非所有错误都是由于你自己所写的代码而造成的,用来处理这些代码的编译器或解释器、你所使用的程序库、你所依赖的数据库和应用程序服务器,以及上述工具所在的操作系统,也有可能要对程序中的bug负有责任。笔者编写本书时,Linux的源代码里面包含2700多条带有XXX字样的注释,该标记通常意味着可疑的内容,这其中有一些肯定是bug。

于是,有些bug就可以通过更新软件来解决。如果你要发布的打包应用程序里面出现了隐晦的bug,那么使用新版的编译器或程序库或许能够帮助你修复这个bug。如果你要发布基于软件的服务,那么对中间件、数据库及操作系统进行更新也是很有好处的。至少应该尝试用最新的版本来构建、链接或运行程序代码,以尽量消除因第三方组件而引入bug的概率。然而,有时采用稍微保守一些的升级策略也是很有道理的,这就是说,尽管我们知道旧版软件不太完美,但是基于某些原因,我们还是决定继续使用这些软件。有很多中间件本身编写得就有错误,或是向后兼容性不太好,因此,有经验的用户通常会较为谨慎地进行升级,他们会升级到能够解决其问题,而且发布时间第二早的那个bug修复版本上面(如6.4.3版)。此外,新版软件也会引入新的bug与兼容性问题,因此在升级的时候至少要给自己留一条退路,也就是要拟定一套明智的后退计划,如果升级失败,或是升级到的版本无法解决你所面对的bug,那么可以根据该方案退回原有的版本。我们可以在沙盒中更新第三方的代码,例如,可以对虚拟机进行复制,在复制出来的镜像里面进行更新,如果更新后的效果不好,那么直接把这份镜像丢掉就行了,这是一种可靠且较为简便的办法。尽管更新软件对解决bug确实有一定的帮助,但无论如何都不要对此抱有过高的期望。

除非你能够证明外部代码确实有错,否则最好是先假设它们正确无误。有些bug看上去好像是由第三方代码所引发的,然而在大多数情况下,其实是由于你自己的问题而造成的。30年的调试历程中,笔者在自己的代码里面修复了数以千计的bug,与之相对,由于某款流行的商业编译器生成了错误的代码而导致的bug只出现了一次,由于程序库而导致的bug只出现了几次,由于操作系统的功能不稳定而导致的bug只出现了一次,由于描述系统调用的文档有错而导致的bug只出现了几次,由于工具和其他系统软件而导致的bug也只出现了几十次。因此,对软件进行更新的最大意义,就在于给我们提供一个新的起点,令我们可以下定决心来好好清理自己的代码。

要点

  • 在更新之后的环境里面重新尝试你所编写的代码,看看这次会不会出错。
  • 不要对更新软件所带来的效果抱有过高的期望。
  • 要考虑因第三方组件而引发bug的可能性。
时间: 2024-09-20 14:35:04

《Effective Debugging:软件和系统调试的66个有效方法》——第14条:考虑对软件进行更新的相关文章

《Effective Debugging:软件和系统调试的66个有效方法》——导读

前 言 我们在开发软件或对运行软件的系统进行管理的时候,经常会遇到故障.有些故障是因代码问题而引发的编译错误,这种故障可以在短时间内修复:还有一些故障则会使大型系统停机,这将给公司带来每小时数百万的损失(具体货币单位依情况而定).要想成为一名优秀的专业人士,你就必须在发生故障时迅速找出背后的原因并加以修复.这正是调试的意义所在,也是本书所要谈论的主题. 本书是写给有一定经验的开发者看的,而不是一本介绍性质的读物.它假设读者能够理解用各种编程语言所写成的代码片段,并且会使用高级的GUI编程工具以及

《Effective Debugging:软件和系统调试的66个有效方法》一导读

前 言 我们在开发软件或对运行软件的系统进行管理的时候,经常会遇到故障.有些故障是因代码问题而引发的编译错误,这种故障可以在短时间内修复:还有一些故障则会使大型系统停机,这将给公司带来每小时数百万的损失(具体货币单位依情况而定).要想成为一名优秀的专业人士,你就必须在发生故障时迅速找出背后的原因并加以修复.这正是调试的意义所在,也是本书所要谈论的主题. 本书是写给有一定经验的开发者看的,而不是一本介绍性质的读物.它假设读者能够理解用各种编程语言所写成的代码片段,并且会使用高级的GUI编程工具以及

《Effective Debugging:软件和系统调试的66个有效方法》一第15条:查看第三方组件的源代码,以了解其用法

第15条:查看第三方组件的源代码,以了解其用法 我们所要调试的代码之所以会出bug,通常并不是由于它使用的第三方程序库或应用程序本身有问题(参见第14条),而是因为它使用这些第三方组件时所采取的方式有误. 这种情况并不令人惊讶,由于这些软件本身是作为黑盒来与你所写的代码进行集成的,因此,你不太可能在它们之间相互协调.对于这类问题来说,有一个很有用的办法,就是去查看第三方程序库.中间件甚至是底层软件的源代码. 首先,如果想查明某个API为什么没有像你所期望的那样运作,或是想查明某条奇怪的错误消息是

《Effective Debugging:软件和系统调试的66个有效方法》——第16条:使用专门的监测及测试设备

第16条:使用专门的监测及测试设备 调试嵌入式系统及系统软件的时候,我们可能要对从硬件到应用程序的整个计算栈进行分析.调试工作一旦深入硬件层面,我们就需要关注电流的微小变化以及磁矩的对齐情况等细节.在大多数情况下,可以通过强大的IDE以及一些追踪软件与日志记录软件来探查这些问题,然而有的时候,就连这些工具也帮不上忙.这通常发生在软件与硬件有所接触的场合,也就是说,虽然你认为你所写的软件能够像预期的那样运作,但是硬件却有着它自己的处理方式.例如,你把正确的数据写入磁盘,再将其读取出来,却发现这些数

《Effective Debugging:软件和系统调试的66个有效方法》一第6条:使用软件自身的调试机制

第6条:使用软件自身的调试机制 程序是一种很复杂的东西,因此它们通常都包含内置的调试机制.(至于怎样给自己正在开发的软件里面添加这样的机制,请参见第40条.)这种机制有很多好处,其中包括:我们可以通过禁用后台执行或多线程执行等特性来简化程序的调试工作.我们可以有选择地执行其中某一部分功能,以便通过测试用例来精确地再现相关的故障.程序可以给我们提供与性能有关的报表及其他信息.程序可以把更多的信息记录在日志文件中.因此,我们应该花一些时间,看看自己要调试的这款软件内置了哪些调试机制.想要了解这些机制

《Effective Debugging:软件和系统调试的66个有效方法》一第8条:把工作焦点放在最为重要的问题上

第8条:把工作焦点放在最为重要的问题上 许多大型软件系统都含有数量极其众多的bug(有一些是已知的bug,还有一些则尚未发现).要想高效地进行调试,就必须把应该受到关注的bug与可以忽略的bug明智地区分开.这样做不是为了单纯地缩减事务清单中的未决事务,而是为了帮助我们开发出稳定.易用.可维护而且效率较高的软件,毕竟这才是公司给我们支付薪水的原因.为此,我们要通过事务追踪系统来设定各项事务的优先级(参见第1条),从而使自己能够把工作重心汇聚在优先级较高的那些事务上,并把优先级较低的事务忽略掉.下

《Effective Debugging:软件和系统调试的66个有效方法》——第8条:把工作焦点放在最为重要的问题上

第8条:把工作焦点放在最为重要的问题上 许多大型软件系统都含有数量极其众多的bug(有一些是已知的bug,还有一些则尚未发现).要想高效地进行调试,就必须把应该受到关注的bug与可以忽略的bug明智地区分开.这样做不是为了单纯地缩减事务清单中的未决事务,而是为了帮助我们开发出稳定.易用.可维护而且效率较高的软件,毕竟这才是公司给我们支付薪水的原因.为此,我们要通过事务追踪系统来设定各项事务的优先级(参见第1条),从而使自己能够把工作重心汇聚在优先级较高的那些事务上,并把优先级较低的事务忽略掉.下

《Effective Debugging:软件和系统调试的66个有效方法》——第15条:查看第三方组件的源代码,以了解其用法

第15条:查看第三方组件的源代码,以了解其用法 我们所要调试的代码之所以会出bug,通常并不是由于它使用的第三方程序库或应用程序本身有问题(参见第14条),而是因为它使用这些第三方组件时所采取的方式有误. 这种情况并不令人惊讶,由于这些软件本身是作为黑盒来与你所写的代码进行集成的,因此,你不太可能在它们之间相互协调.对于这类问题来说,有一个很有用的办法,就是去查看第三方程序库.中间件甚至是底层软件的源代码. 首先,如果想查明某个API为什么没有像你所期望的那样运作,或是想查明某条奇怪的错误消息是

《Effective Debugging:软件和系统调试的66个有效方法》——第6条:使用软件自身的调试机制

第6条:使用软件自身的调试机制 程序是一种很复杂的东西,因此它们通常都包含内置的调试机制.(至于怎样给自己正在开发的软件里面添加这样的机制,请参见第40条.)这种机制有很多好处,其中包括: 我们可以通过禁用后台执行或多线程执行等特性来简化程序的调试工作. 我们可以有选择地执行其中某一部分功能,以便通过测试用例来精确地再现相关的故障. 程序可以给我们提供与性能有关的报表及其他信息. 程序可以把更多的信息记录在日志文件中. 因此,我们应该花一些时间,看看自己要调试的这款软件内置了哪些调试机制.想要了