4

什么是统计调试?我还没有找到一个清晰、简洁的解释,但这个词听起来确实令人印象深刻。

它只是一个研究课题,还是在某个地方用于实际开发?换句话说:它会帮助我找到程序中的错误吗?

4

3 回答 3

18

多年来,我与各种出色的合作者一起创建了统计调试。我希望我几个月前就注意到了你的问题!但如果你还是好奇的话,或许这个迟来的答案总比没有好。

在非常高的层次上,统计调试是使用程序成功/失败的统计模型来跟踪错误的想法。这些统计模型揭示了特定程序行为与运行的最终成功或失败之间的关系。例如,假设您注意到程序中有一个特定的分支有时向左,有时向右。而且您还注意到分支向左的运行很好,但分支向右的运行崩溃的可能性要高出 75%。所以这里有一个统计相关性,可能值得更仔细地研究。统计调试使查找与故障相关的程序(错误)行为的过程形式化和自动化,从而引导开发人员找到错误的根本原因。

回到你原来的问题:

它只是一个研究课题,还是在某个地方用于实际开发?

它主要是一个研究课题,但它以两种方式存在于“真实”世界中:

  1. Cooperative Bug Isolation Project的公开部署旨在寻找在 Fedora Linux 下运行的各种开源程序中的错误。您可以下载预先安装的软件包,每次使用它们时,您都会向我们提供数据以帮助我们查找错误。

  2. Microsoft 发布了Holmes,这是一种针对 .NET 的统计调试实现。它很好地集成到了 Visual Studio 中,并且应该是您使用统计调试来帮助您在自己的代码中找到自己的错误的一种非常简单的方法。我曾与 Microsoft Research on Holmes 密切合作,他们都是非常聪明的人,他们知道如何推出高质量的工具。

要记住的一个警告:统计调试需要充足的原始数据来构建良好的统计模型。在 CBI 的公共部署中,原始数据来自真实的最终用户。对于 Holmes,我认为微软假设原始数据将来自内部自动化单元测试和手动测试。根本没有运行的代码,或者只有失败的运行但没有成功的反例的代码是行不通的。统计调试根据好运行和坏运行之间的对比来工作,因此您需要同时提供它。如果您想要没有运行的错误搜索工具,那么您将需要某种静态分析。我也对此进行研究,但这不是统计调试。:-)

我希望这会有所帮助,而且不会太久。我很乐意回答任何后续问题。快乐的寻虫!

于 2009-12-09T18:57:19.150 回答
1

听起来像统计抽样。当您购买产品时,很有可能并非每件从“装配线”下来的产品都经过质量检查。

统计抽样要求检查一定比例的产品,以几乎确保它们都没有问题。它最大限度地减少了一些问题潜入的风险,并且在测试过程具有破坏性的情况下是绝对必要的 - 如果您对生产线的 100% 进行破坏性测试,那将不会为分销留下太多 :-)

老实说,除非您检查每一个执行路径和每一个可能的输入值,否则您已经在测试中这样做了。为除了最简单的系统之外的任何系统进行测试所需的工作量是不值得的。额外的成本将使您的产品成为非竞争项目。

请注意,统计抽样不仅仅涉及每 100 个单元进行测试。有一些方法可以针对抽样来提高发现问题的机会。例如,如果历史数据表明大多数错误是在特定阶段引入的,则以该阶段为目标。如果您的一位开发人员比其他开发人员更有问题,请更仔细地检查他的东西。

从我粗略浏览一些研究论文中可以看出,统计调试就是这样 - 根据过去的问题历史定位区域。

我知道我们已经为我们的软件这样做了。由于任何得到修复的错误都必须通过单元和系统测试来复制问题(我们的 TDD 表示这些测试应该在尝试修复错误之前编写),这些测试会自动添加到回归测试套件中,以便那些区域导致更多问题自然会在未来更频繁地测试。

于 2009-02-03T03:21:37.943 回答
1

那是你发布软件时说“好吧,它可能工作......”;-)

编辑:这是一个研究课题,使用机器学习和统计聚类来尝试在程序中找到可以很好地预测错误的模式,以确定更多错误可能隐藏的位置。

于 2009-02-03T03:36:57.490 回答