您如何解决使您困惑10多个小时的异常错误呢?[关闭]


29

您知道他们,那些没有道理的错误。好像一颗鬼针弹跳到了筹码的深处,弄乱了一些东西。您会散步,写东西,给叔叔打电话吗?


3
您的描述可能是正确的-重新启动,然后重试!
2011年

5
当然将其发布在stackoverflow上:)
William

5
您为什么决定将阈值设置为10小时?这太长了-如果您对一两个小时内导致意外行为的原因一无所知,那您就很麻烦了。
矢量

5
“当事情变得艰难时,艰难的睡眠去让潜意识去做。” -匿名
迈克尔·复活节

2
1.找人帮助。两个人是必须的。2.使用大量的调试语句来缩小范围。有一个文件,在每一行之前都有一个调试宏,以查明发生段错误的宏。
SF。

Answers:


9

对于那些真正可怕的问题,我的策略通常如下。

  • 实验和谷歌。继续尝试解决问题。在大多数情况下,这可以在一小时或更短的时间内解决问题。

  • 所以那没有用。休息一下。喝咖啡,谈论与同事无关的事情。将问题排除在外。当您在5或10分钟后查看问题时,您是从稍微不同的角度查看问题。在大多数情况下,这是可行的。

  • 在这种情况下,没有。因此,请再花10到30分钟查看一下。然后打电话给同事。但是在做之前,请做一些笔记;您想演示问题,重现问题,然后列出您尝试过的事情,最重要的是证明您已经尝试过。因此,请先进行空运行。在代码中设置一些书签,关闭所有多余的打开文档等。通过这种方式,您可以自己解决问题,也可以在演示问题时避免浪费时间。

  • 请您的同事让您证明所有假设。该setter实际上是被调用的吗?该方法真的返回您所声称的内容吗?您认为该对象不是null-向他们显示它不是null。

  • 在大多数情况下,要么演示问题,要么使您意识到您没有尝试所有可能,否则您的同事将看到您的错误。

  • 如果那不起作用,那么它的时间就会变得严肃起来。准确记录您正在尝试做的事情,尝试过的事情以及为什么行不通。通过电子邮件发送给您的所有同事。将其发布在SO上。此时,文档应该是一个完美的SO问题。

  • 当您等待回复时,google google google。尝试对问题进行所有排列。打开一堆标签。到那时您可能无法获得答案,但是您正在寻找想法,可能性和解决问题的不同方法。

  • 如果您在某个问题上花费了5个小时,则可以将其留给另一天。也许您会得到有用的答复。也许第二天当您攻击该问题时,它将很明显。

  • 如果这些都不起作用,那就该寻找其他解决方案了。也许您可以使用不同的方法,不同的技术。也许您应该考虑暂时放弃此功能。您是按小时向客户收费吗?您在内部应用程序的公司工作吗?您需要将此问题上报给所有者,然后告诉他们:“看,我花了x个小时在此上却没有取得进展,这样做是否值得呢?” 您不想去找老板,告诉他们您在问题上花了16个小时,只是让他们转身说,没那么重要,请在此版本中跳过它。您需要更早发现。

  • 如果那不起作用?那么,您唯一的选择就是不断地解决问题或寻求行业专业知识。在Twitter上询问技术专家。给您的技术提供商发送电子邮件。


79

退出。不,不是你的工作!刚起床回家。您白天或周末都做完了。接下来的20个问题中有19个问题会在一个小时内显示出来。


17
您也可以尝试橡皮鸭。zh.wikipedia.org/wiki/Rubber_duck_debugging
Dave Nay

2
19之20,是的。我最糟糕的一个从来没有解决过,只能解决。没有测试环境能够显示它,只有运行中的整个生产环境-我们甚至无法在几个小时后复制它。
洛伦·佩希特尔

3
摆脱烦人的事情真的很难-但多年来我发现这始终是最好的事情。当您吃饭,睡觉,休息,看电视...以及第二天(或第二天)情况变好时,潜意识可以解决该问题。但是有一个警告词:走开之前收集信息...走开与忽略它并假装不在那里是不同的。您仍然需要努力!
quick_now 2011年

1
我一个小时不知道。通常,早上起床时,我会在淋浴时解决大多数此类问题。第二个最频繁的时间是当我晚上快要入睡时,终于让自己停止思考了。
SoylentGray 2011年

3
尼尔·德格拉斯·泰森(Neil deGrasse Tyson)主持了一本引人入胜的NOVA Science NOW,其中谈到了睡眠科学。在其中讨论了一个问题,将您的头撞上几个小时,睡觉,醒来立即解决问题。当我们睡觉时,我们的大脑会一遍又一遍地改变我们一天中发生的事件,并从许多不同的角度对其进行分析。它留下的是新的神经通路,它们实际上可以帮助我们下意识地以全新的方式看待问题,然后真正解决问题。太棒了
Byrne Reese

44

在十小时之前,我会得到一些帮助。

  1. 向其他人,甚至您的橡皮鸭描述问题。
  2. 让其他人看看代码,或与他们一起逐步学习。
  3. 隔离它。删除一堆东西,然后将其一点一点带回来,直到问题再次出现。
  4. 去睡一会!

12
+1用于删除所有内容,直到问题消失。
约拿(Jonah)

4
您应该在1小时之前完成其中一项操作。凝视得越多,实现顿悟的可能性就越小。我通常通过与某人交谈来解决问题。

发现。我经常通过首先描述问题来弄清问题(或接近它)。通常在编写StackOverflow问题的问题描述时会发生这种情况。这也需要减少(隔离),然后做不到这一点,在那里你一步从问题离开,让答案滚滚而来的SO一个等待周期。
sholsinger

17

一个词timebox设置了有限的时间来完成某项工作,如果未解决,请继续进行其他工作,并在第二天以崭新的视角回到工作上。

那双眼睛和另一双眼睛永远比您浪费时间盯着某件事更有价值。

我永远不会花费超过45分钟到一个小时的时间来尝试解决一个问题,因为这违反了收益递减的规律。


非常感谢-我阅读了Wikipedia上的时间盒文章,非常有用。
阿德尔(Adel)

7

向其他人解释这个问题。

通过向其他人解释问题,您必须加以澄清:这通常可以使您看到解决方案。

(英国一本专业的计算机杂志曾经提议专门为此目的出售高级程序员的真人大小的纸板切口。)

我发现在一个问题上睡觉(有时几天)也可以有所帮助。


1
“其他人”不必是人类。有时候我向猫解释事情,哈哈!我找到问题了。
DarenW 2011年

我真的也应该买猫。我会训练它按需挠头。
阿德尔(Adel)

真的应该由Jon Skeet制作与实物大小一样的纸板切口。
唐·罗比

5

我有一个三步计划:

  1. 喝杯咖啡或其他美味的饮料。
  2. 在一天的剩余时间里,还要做其他的事情。
  3. “给朋友打电话”并在白板上涂鸦。

如果上一步失败,则每个阶段都会升级。在第2阶段,我几乎总是可以从事其他工作。


好的建议!所以引用“给朋友打电话”是因为它应该限制为60秒,就像在百万富翁上那样,是吗?我也喜欢白板的想法。
阿德尔(Adel)

1
我发现白板确实有助于系统地思考。引用是因为朋友经常在同一个办公室,所以实际打电话是很奇怪的。但这有点像电视节目中的生命线。
Flexo

4

睡在上面

否则,请打电话给附近的人,并请他快速浏览一下代码。

通常,其他人很容易发现需要很长时间才能发现的错误(因为它是您的代码)


3

您可以看到起床,走动并思考问题是否有助于您找到解决方案。无论您实际上是站着还是站着,都要在思考的时候尽量远离计算机。


3

我通常会执行以下三个操作之一:

  1. 散步/骑自行车...有些会让您远离电脑的。
  2. 和我的狗或猫一起玩
  3. 如果您有爱好,请花一点时间。

这三个人中的任何一个都能很好地分散自己的注意力。我发现这些干扰让我的潜意识的大脑咀嚼了一段时间。大约一个小时后,ba,有解决方法了:-)。


3

建立测试线束以针对确切的缺陷并将其隔离

在复制缺陷时,只需消除好代码即可。在确定确切的代码段大小之前,该错误。然后跟踪代码。

推荐阅读: 实用程序员特别是第10章:Tracer项目符号


所有这一切都是好事,但必须认为该错误已经并且可以被复制。如果到目前为止花费的19个小时仅仅是为了……试图找到一种确定性和系统性的方式重现问题的方法,那该怎么办?对我来说,这就是这里问题的实质!
Newtopian 2011年

实用程序员非常出色
Adel

2

所有这些建议都很棒。但是,我经常使用一种我没有提到的技术。列出清单以组织您对问题的想法。如果我有一个特别棘手的问题,我通常会写出多个列表,例如:事实,假设,问题,症状等。我发现在以这种方式组织事物的过程中,我经常发现自己没有意识到的假设(常常被证明是错误的),我没有意识到需要提出的问题,可以检查的其他排列方式等。


2

编辑:

简短的答案:

问:您如何解决真正奇怪的错误,使您困惑10多个小时?

答:请确保它们永远不会发生:了解您的设计,了解您的代码,了解如何使用调试器。


说明:

“好像鬼怪弹跳到了筹码的深处,弄乱了东西”

这永远都不会发生。如果是您的代码,则在尝试修复该错误之前,您应该对导致该错误的原因有很好的了解。

此外,在编写代码时,您应该已经知道它可能在哪里以及为什么会失败。

话虽如此-询问同伴,在SO上发帖,追溯和回滚您的步骤并休息一下-上述所有建议都将有所帮助。

另一件事是,您必须了解自己的工具-调试工具包。在代码中的可疑点记录消息,仔细检查调用堆栈,使用条件断点和监视等等,等等。调试技能不是多余的-它们是编程的一部分。


能够追回自己的脚步至关重要。谢谢!
阿德尔(Adel)

>能够追回自己的脚步至关重要。SourceControl软件是能够回滚/追溯的关键。请对此保持关注,如果可以的话,请设置您的设置,以强制您在签到时发表评论。
矢量

3
不幸的是,无论您对代码的了解程度如何,有时问题都在于与他人(封闭源代码)的交互作用。
Nate CK

2
+1 @Nate CK-非常正确。当您从所依赖的Web服务中获得某种胡言乱语时,就会发生最糟糕的错误。不久前,我有一个Saas供应商,他巧妙地更改了某些功能,而没有在Web服务中发出警告。我不得不向开发人员说明如何通过电话修复自己的错误,因为他向我描述了他的代码是什么样的。
Morgan Herlocker 2011年

1
确定什么?第三方代码有问题吗?这部分相对容易。困难的部分是弄清楚是什么情况触发了它,以及如何解决它,当您没有源时,供应商就没有响应,也许在您的测试系统上也没有发生。如果您认为知道自己的代码将为您解决所有问题,那么我建议您也许永远都不必处理它。
Nate CK

1

我有一个类似的问题,就是在Objective-C中出现明显的内存损坏,这让我苦苦挣扎了许多小时。但是后来我和我的同事们散步去吃午餐,然后我解释了这个问题(其中一个特定的问题与init方法中对象的反序列化有关),并向我自己基本上解释了整个问题。

(技术细节:基本上,我初始化了一个对象并将其返回到除self之外的其他对象上,所以有两个alloc,但是仅返回了一个对象。内存移动并发疯,崩溃,并且调试器并不真正知道该怎么做它要么)。


1
“我初始化了一个对象并将其返回到除self之外的其他对象上”-像这样的bug很难!您可以看到它100多次,而不会被抓住。但是您无法通过在调试器中进行遍历来看到两个分配吗?
矢量

1

在此处输入图片说明

洗个澡

罗德尼·麦凯(Rodney McKay)粉丝吗?

严重的是,如果在所有这些答案中有一个共同点,那就是休息一下,做点其他的事情

我喜欢将其归因于您的潜意识。即使我们没有意识到,我们的思想(似乎)仍会继续解决该问题,即使我们正在做其他事情,例如洗个澡


好主意...。现在我只需要让老板在办公室里放六个浸泡桶。
Dave Nay

如果只有一群小隔间的工人每个都有这样的房间。
阿德尔(Adel)

1

逐步进行操作,直至组装完成。谁调用什么,内存访问的断点。这通常会很快地真正捕获到该错误。

如果没有,请散步。


1

所有这些的组合:

  • 离开它一会儿,以便它可以放在后面的燃烧器上。睡觉,休息,吃饭,散步,随便什么。

  • 进一步检查问题,还有什么不对劲,您还能找到其他症状吗?

  • 研究问题,看看可以找到什么。切记尝试使用其他关键字

  • 尝试一些不同的东西。变通。另一种调试技术。验证者。不同的计算机。

  • 与某人交谈。即使他们无法提供帮助,甚至连程序员都无法提供帮助,有时说话也会触发灯泡的想法

  • 重新开始!如果合适,请尝试重新启动计算机,服务器等。如果没有其他原因,您可以花时间思考。

  • 询问StackOverflow!我们在这里为您提供帮助


1

我真的不喜欢投票率最高的答案,因为尽管有时这个答案可行,但有时候您只需要在当天找出答案,所以我建议按以下顺序进行:

  1. 确认这不仅是发生在您身上。这样可以节省很多时间。也许您卸载了必需的组件,或者在您的环境中进行了更改,并且代码中的某个地方吞下了异常。如果只发生在您身上,我将使用环境比较工具。最近,我读到一个名为Envy的软件,尽管它不是免费软件,但允许您执行此操作,但它的价格为10美元。

  2. 发生在每个人身上?很好,现在在代码上执行“查看历史记录”,并验证直接或间接导致错误的最近更改。

  3. 最近没有变化吗?如果是非常具体的错误(异常),请“ stackoverflow it”。现在,这听起来不比“ google它”好,但是我要说我比Google第一次搜索stackoverflow来进行编程研究。如果这是一个真正已知的问题,很可能会在这里找到解决方案。如果不是,则在相关的stackexchange网站上发布问题。您可能会得到非常快速的答案,或者即使您没有,也可以在进行更多研究时找到问题。那是一个好处。

  4. 如果您没有在线找到答案或不是一般性错误,那么请逐步浏览代码,检查每个步骤所获得的结果是否符合您期望的结果。开始每种方法的完成,然后从下至上选择分层解决方案。(即,如果要对性能进行故障诊断,请从检索记录的代码开始。如果可以快速确定第一步是否有问题,那么从UI中开始就没有意义了)。

  5. 如果经过几次代码仍未发现问题所在,请致电他人进行讨论。正如已经提到的,大声谈论它可以点亮灯泡。再加上配对编程真的很有用。

  6. 此时,如果可行,请走一段时间或一天。我昨天读了一条非常真实的推文,上面写着:“我上床睡觉时想着'怎么fck',然后醒来就想'但是当然'”。如此真实。

  7. 如果您仍然没有答案,我敢说您可以尝试将其重构为较小的任务/方法/功能。亨利·福特(Henry Ford)表示,“没有一项任务如此复杂,无法将其分解为较小的任务来完成”。在这一点上,如果解决方案过于复杂,并且您自己或在其他人的帮助下还没有弄清楚,请将代码重构为较小的任务。即使您最终没有提交它,它也可以帮助您找到原因。

  8. 将检测添加到您的代码中。

  9. 关于它的推文?


1

您需要退后一步。我的座右铭是“如果问题太难了,那么您正在解决错误的问题”。您的假设是什么?什么都不相信

必然的结果是“问题更奇怪,解决方案更奇怪”。计算机的优势在于其逻辑性,因此您无法在逻辑上取胜。您有头脑,必须思考一下。

在现代,系统上还有许多其他的东西在交互-防火墙,AV,反间谍软件,每晚都会发生的自动更新-您必须应对移动的目标。


如此真实,以至于“问题变得更奇怪,解决方案变得更奇怪”
Adel

-1

去谷歌上查询。Stackoverflow。将其发布在论坛上。基本上,如果您不能独自解决问题,请寻求帮助。


-1
  1. 写下问题。
  2. 认真想。
  3. 实施解决方案。

简洁,非常好!
阿德尔(Adel)

1
其实没有 沿着相同的轨道思考得太厉害了,这是您可能会做的最糟糕的事情。解决方案是“ 以系统的方式挑战,枚举,重新审视和检验您的每个假设”。人们正在讨论实现这一目标的不同策略。
smci 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.