确定性记录与回放
仅关注进程的非确定性行为
本专栏介绍了与确定性记录与回放相关的三项最新研究进展,旨在展示经典用例和新兴用例。越来越多的系统使用较弱形式的确定性记录与回放。本质上,这些系统利用许多程序执行中存在的确定性,但出于性能原因,有意允许一些非确定性。这种趋势在 GPUReplay 中尤其明显,在 ShortCut 和 Dora 等系统中也很明显。
石刀和熊皮
如果您查看软件工具领域,您会发现大多数开发人员使用开源工具;或者来自最近改革的专有软件之家 Microsoft 的工具,该公司已经意识到其 Visual Studio Code 系统是将人们吸引到其平台上工作的好方法;或者最后是 Apple,其工具仅适用于其平台。在专业市场(例如深度嵌入式、军事和航空航天)中,专有工具通常比其开源同类工具差得多,因为此类工具的市场很小但利润丰厚。
摆脱疯狂之路
调试器和断言
KV 继续咬牙切齿,因为他看到代码中充满了调试语句,如果编写代码的程序员对其调试器充满信心并熟练使用,这些语句将完全没有必要。如果一个人足够幸运能够访问一个好的调试器,那么他应该对他通常感谢的任何事物表示极大的感谢,并使用该死的调试器!
分而治之
二分法的应用和局限性
如果您遇到仅不时出现的海森堡 bug,则二分法毫无用处。这些细微的 bug 最难修复,并且会让我们批判性地思考我们正在做的事情。定时 bug、分布式系统中的 bug 以及我们在构建日益复杂的软件系统时面临的所有难题,目前还无法通过简单的二分法解决。通常情况下,为一个复杂问题编写一个可用的二分法测试比在树梢分析问题花费的时间更长。
调试 Google 分布式系统中的事件
专家如何在复杂的分布式系统中调试生产问题
本文介绍了 2019 年对 Google 工程师如何调试生产问题进行的研究成果,包括工程师以不同组合方式有效调试所使用的工具类型、高级策略和低级任务。它考察了用于捕获数据的研究方法,总结了生产调查的常见工程历程,并分享了专家如何调试复杂分布式系统的示例。最后,本文扩展了这项研究的 Google 特性,以提供您可以在组织中应用的一些实用策略。
捕获失败:记录与回放调试方法
与 Robert O’Callahan、Kyle Huey、Devon O’Dell 和 Terry Coatta 的讨论
当 Mozilla 开始在名为 rr 的记录与回放调试工具上工作时,目标是为捕获 Firefox 浏览器中的低频非确定性测试失败提供一种实用、经济高效、资源高效的方法。随后的许多工程努力都投入到确保该工具能够以最小的开销兑现这一承诺。然而,出乎意料的是,rr 将在 Mozilla 之外得到广泛使用——不仅用于查找难以捉摸的失败,还用于常规调试。
实践研究:跟踪和调试分布式系统;通过示例编程
专家策展的 CS 研究最佳实践指南
本期“实践研究”涵盖了分布式系统和编程方法论中的两个令人兴奋的主题。首先,Peter Alvaro 带领我们参观了调试世界上一些最大、最复杂系统(现代分布式系统和服务导向架构)的最新技术。Peter 调查的技术可以揭示分布式调用图混乱中的秩序。其次,Sumit Gulwani 说明了如何在不显式编写程序的情况下进行编程,而是从示例中合成程序!Sumit 介绍的技术允许系统从说明性示例中“学习”程序表示,从而允许非程序员用户创建越来越重要的功能,例如电子表格宏。
调试心态
理解学习策略的心理学有助于培养有效的问题解决能力。
软件开发人员花费 35-50% 的时间来验证和调试软件。调试、测试和验证的成本估计占软件开发项目总预算的 50-75%,每年超过 1000 亿美元。虽然工具、语言和环境减少了个人调试任务所花费的时间,但它们并没有显着减少调试的总时间或成本。因此,在开发过程中过度关注消除 bug 是适得其反的;程序员应该将调试视为一种解决问题的练习。
外包责任
当您的调试器让您失望时,您会怎么做?
尊敬的 KV,我被分配到一个新项目,并且一直在查看团队放在内部 wiki 上的公认简陋的文档。我花了一天左右的时间盯着看似他们打算集成到他们正在构建的系统中的开源项目长列表,但我找不到他们在哪里描述了他们的原始工作。
肆意妄为的调试行为
保持您的调试消息清晰、有用且不令人讨厌。
尊敬的 KV,为什么向程序添加日志记录的人们缺乏区分其日志消息的创造力?如果它们都说同样的事情——例如,DEBUG——就很难分辨发生了什么,甚至不清楚之前的程序员最初为什么要添加这些语句。
在实时系统上调试
这更多的是一个社会问题,而不是技术问题。
我一直在尝试调试工作中系统上的一个问题,但是运行我们生产系统的控制狂不想让我访问总是出现 bug 的系统。我无法在桌面上的测试环境中重现该问题,但每天 bug 都会在多个生产系统上发生。
端口不足
调试一个短暂存在的问题
我一直在调试一个网络问题,这个问题应该出现在一段简单的网络代码中。我们有一个小型服务器进程,它监听来自我们数据中心中所有其他系统的命令,然后将命令分发到其他服务器上运行。对于发出的每个命令,客户端都会建立一个新的 TCP 连接,发送命令,然后在我们的服务器确认命令后关闭连接。
使用跟踪增强调试
模拟器开发中使用的一项基本技术是任何程序员工具箱的有用补充。
创建模拟器来运行旧程序是一项艰巨的任务。您需要透彻理解目标硬件以及模拟器要执行的原始程序的正确功能。除了功能正确之外,模拟器还必须达到以其原始实时速度运行程序的目标性能。实现这些目标不可避免地需要大量的调试。这些 bug 通常是模拟器本身中的细微错误,但也可能是对目标硬件的误解或原始程序中实际已知的 bug。(原始程序的二进制数据也可能已被微妙地破坏或不是预期的版本。)
调试设备
调试故障硬件的正确方法是什么?
我建议拿一把非常锋利的刀,随机切割电路板走线,直到东西可以工作或闻起来很奇怪!我想您不是在问导致我在另一专栏中使用“changeineer”一词的同一个问题。我认为您有一个实际故障的硬件,并且您已经将之前的三个版本连同措辞恶劣的信件发回给制造商,信中含蓄地提到了如果他们继续向您发送损坏的产品,将采取法律行动。
又一天,又一个 Bug
我们询问读者他们使用哪些工具来消除 bug。以下是他们的说法。
作为本期关于程序员工具的一部分,我们在 Queue 决定就调试主题进行一项非正式的 Web 投票。我们要求您告诉我们您使用的工具以及您如何使用它们。我们还收集了关于那些难以追踪的 bug 的故事,这些 bug 有时会让我们想到从事其他职业。