《Effective Debugging:软件和系统调试的66个有效方法》——第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感

第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感

现在很少有哪个工作场所不能上网,如果在一个无法上网的地方开发程序,那我的效率会很低。遇到代码错误的时候,我们应该上网搜索,或者与同事一起寻找解决办法。

有一个相当有效的搜索技巧,是把由第三方组件所给出的错误消息打上双引号,并将其粘贴到浏览器的搜索框里面。把待搜索的内容放在一对双引号中,意思是要告诉搜索引擎:只搜索与该内容精确匹配的页面。这样做可以使搜索结果更加准确。还有一个很有用的技巧,是把与错误有关的程序库或中间件的名称、对应的类名或方法名,以及所返回的错误代码,也一并放在搜索框里面。要查找的函数名称越罕见,搜索到的结果也就越确切,例如,搜寻PlgBlt所得到的结果,要比搜寻BitBlt好得多。此外,我们也应该试着搜索意思相近的词,例如,除了搜索“hangs”(挂起),还可以搜索“freezes”(冻结),除了搜索“disabled”(禁用),还可以搜索“grayed”(变灰)。

要想解决一些与API调用有关的难题,我们通常可以观察其他人是如何使用这些API的。我们可以看看开源软件如何使用某个函数,如何对传给该函数的参数进行初始化,以及如何解读函数所传回的结果。在这种情况下,专门用来搜索代码的引擎(如Black Duck Open Hub Code Search),要比Google那样的通用引擎更好。例如,如果在这个搜索引擎里面查找mktime,并且只看与某个项目有关的代码,而过滤掉程序库的声明及定义,那我们就会发现下面这样的代码片段:

通过上述代码片段,我们可以看出:mktime函数与localtime函数有所不同,它要求传入的年份必须是完整的数值,而不是距离1900年的偏移量,而且它的月份是从1开始计算的。这两个地方经常会出错,对于那些没有仔细阅读函数文档的人来说,更是容易在调用时传入错误的参数。

在查看由搜索引擎所给出的结果时,我们要注意这些结果是从哪个网站抓取到的。StackExchange旗下的网站(如Stack Overflow)通过很多措施来鼓励用户进行有效的交流,因此,在由搜索引擎所给出的结果中,有很多比较切题的讨论及答案都来自这个系列的网站。在浏览Stack Overflow上面的答案时,不仅要看提问者所接受的那个回答,而且还要看看其他那些赞同数量比较高的回答。除了答案的正文,我们还可以关注答案下面的评论,因为很多人都会通过评论的方式来给出新的消息,例如,有人会在评论中告诉大家,自己发现了一个可以避免错误的新办法。

如果你把自己精心构造的关键词放入搜索引擎之后,并没有得到有用的结果,那么或许意味着你找错了目标。对于常见的程序库与软件来说,你不太可能成为第一个遭遇某问题的人,因此,如果在网上找不到类似的描述,那可能说明你对问题的判断发生了偏差。例如,你本来以为程序崩溃的原因是某个API函数的实现有bug,但实际上却是传入的日期有误。

如果网上找不到答案,那你可以在Stack Overflow网站提问,把自己所面对的问题描述出来,然而,这需要花一定的时间来构建一个简单、自足且正确的范例(SSCCE)。凡是在论坛发问,都应该遵循该SSCCE原则,也就是要给出一个其他人可以直接复制、粘贴并编译的例子,使得他们能够看到你所经历的问题(参见第10条)。对于某些编程语言来说,甚至可以把范例代码嵌入SourceLair或JSFiddle这样的在线IDE,令大家能够在网上直接看到运行效果。sscce.org网站详细解释了应该怎样针对具体的语言和技术来构造良好的范例。Eric Raymond所写的文章《How To Ask Questions The Smart Way》也与这个话题有关,值得一读。

笔者发现:只要我能够恰当地描述问题,并且附上合适的范例,那么该问题的解决方案通常就会自然地浮现出来。就算我自己找不到答案,这样的问题也可以吸引一些懂行的人过来进行试验,他们或许能找到办法。

如果你所遇到的问题在某种程度上与开源的软件库或程序有关,而且你认为它们的代码中很可能有bug,那么可以联系其开发者。常见的做法应该是访问那个开源项目的bug追踪系统,并在上面提交一项事务。提交的时候,也应该首先确保其他人没有报告过类似的bug,并且要把重现该问题的详细步骤准确地写进去。如果那款软件没有bug追踪系统,那你可以给它的作者发邮件,邮件要写得相当谨慎,措辞要得体、语气要谦和,因为大部分开源软件的开发者都不是你的雇工。

要点

  • 把错误消息打上双引号,以便在网上准确地进行搜索。
  • 认真查看StackExchange系列网站上面的回答。
  • 如果上述两种办法都不见效,那你可以自己提问或提交事务。
时间: 2024-08-31 19:47:31

《Effective Debugging:软件和系统调试的66个有效方法》——第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感的相关文章

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

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

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

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

《Effective Debugging:软件和系统调试的66个有效方法》一第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感

第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感 现在很少有哪个工作场所不能上网,如果在一个无法上网的地方开发程序,那我的效率会很低.遇到代码错误的时候,我们应该上网搜索,或者与同事一起寻找解决办法. 有一个相当有效的搜索技巧,是把由第三方组件所给出的错误消息打上双引号,并将其粘贴到浏览器的搜索框里面.把待搜索的内容放在一对双引号中,意思是要告诉搜索引擎:只搜索与该内容精确匹配的页面.这样做可以使搜索结果更加准确.还有一个很有用的技巧,是把与错误有关的程序库或中间件的名称.对应的类名

《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个有效方法》——第6条:使用软件自身的调试机制

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

《Effective Debugging:软件和系统调试的66个有效方法》一第13条:使自己尽可能多地观察到与调试有关的数据

第13条:使自己尽可能多地观察到与调试有关的数据 我们在调试的过程中要处理大量数据,并且要把各式各样的数据关联起来,如源代码.日志文件中的条目.变量的值.栈的内容.程序的I/O以及测试的结果等.这些数据通常是由多个处理流程与计算主机所产生的,如果能够把它们全都适当地展示在调试者眼前,那么将会给调试工作带来很多的好处.首先,可以使我们发现数据之间的相互关系.例如,我们可以看到:当测试失败的时候,日志文件中会多出来一条记录.其次,它可以令人尽量保持专注,避免因为来回切换而使思路受到干扰.有时我们必须

《Effective Debugging:软件和系统调试的66个有效方法》——第13条:使自己尽可能多地观察到与调试有关的数据

第13条:使自己尽可能多地观察到与调试有关的数据 我们在调试的过程中要处理大量数据,并且要把各式各样的数据关联起来,如源代码.日志文件中的条目.变量的值.栈的内容.程序的I/O以及测试的结果等.这些数据通常是由多个处理流程与计算主机所产生的,如果能够把它们全都适当地展示在调试者眼前,那么将会给调试工作带来很多的好处.首先,可以使我们发现数据之间的相互关系.例如,我们可以看到:当测试失败的时候,日志文件中会多出来一条记录.其次,它可以令人尽量保持专注,避免因为来回切换而使思路受到干扰.有时我们必须