0

如果您查看程序的调用堆栈并将每个返回指针视为令牌,那么需要什么样的自动机来为程序的有效状态构建识别器?

作为推论,需要什么样的自动机来为特定的错误状态构建识别器?

(注意:我只查看可以从此函数获得的信息。)


我的想法是,如果这些形成常规语言,那么可以围绕它构建一些有趣的工具。例如,给定一组崩溃/故障转储,自动将它们分组并生成识别器以识别已知错误的新实例。


注意:我并不是建议将其作为诊断工具,而是将其作为数据管理工具,用于将一堆崩溃报告变成更有用的东西。

  • “这 54 次崩溃似乎是相关的,这 42 次也是如此。”
  • “这些新的崩溃似乎与日期 X 之前的任何事情都无关。”
  • 等等

似乎我并不清楚我想要完成什么,所以这里有一个例子:

假设您有一个包含三个错误的程序。

  • 导致无效参数被传递给单个函数的两个错误导致相同的健全性检查。
  • 一个函数,如果给定一个(有效的)极端情况,就会进入无限递归。

同样,当程序崩溃(断言失败、未捕获的异常、seg-V、堆栈溢出等)时,它会抓取堆栈跟踪,提取其上的调用站点并将它们发送到 QA 报告服务器。(我假设只提取该信息,因为 1,每个项目成本一次很容易获得,2,它具有简单、明确的含义,可以在没有任何关于程序的特殊知识的情况下使用)

我提议的是一个工具,它会尝试将传入的报告分类为与已知错误之一(或作为新错误)相关联。

最简单的事情是假设一个故障站点是一个错误,但在第一个示例中,在同一个位置检测到两个错误。下一个最简单的方法是要求整个堆栈匹配,但同样,这在第二个示例这样的情况下不起作用,其中您有多个(有效)有效代码可以触发相同的错误。

4

2 回答 2

0

堆栈上的返回指针只是一个指向内存的指针。从理论上讲,如果您查看仅进行一次函数调用的程序的调用堆栈,则返回指针(对于该函数)对于程序的每次执行都可能具有不同的值。你会怎么分析呢?

理论上,您可以使用映射文件读取核心转储。但是这样做是非常特定于平台和编译器的。您将无法使用任何程序创建通用工具来执行此操作。阅读编译器的文档,看看它是否包含任何用于进行事后分析的工具。

于 2010-04-09T22:17:56.130 回答
0

如果你的程序是用 assert 语句修饰的,那么每个 assert 语句都会定义一个有效的状态。断言之间的程序语句定义了有效的状态变化。

一个崩溃的程序已经违反了足够多的断言,导致某些东西被破坏了。

一个不正确但“不稳定”的程序至少违反了一个断言,但并未失败。

根本不清楚你在寻找什么。有效状态 - 有时 - 难以定义,但 - 通常 - 很容易表示为简单的assert陈述。

由于崩溃的程序违反了一个或多个断言,因此具有显式可执行断言的程序不需要崩溃调试。它只会使断言语句失败并明显死亡。

如果您不想放入断言语句,那么基本上不可能知道哪个状态应该是真实的以及违反了哪个(从未实际陈述过的)断言。

展开调用堆栈以计算位置和嵌套是微不足道的。但目前尚不清楚这表明了什么。它告诉你是什么坏了,但不是什么其他的东西导致了破损。这需要猜测哪些断言应该是正确的,这需要对设计有深入的了解。


编辑。

如果不求助于实际应用程序的实际设计以及在每个堆栈帧中应该为真的实际断言,“似乎相关”和“似乎无关”是无法定义的。

如果您不知道应该为真的断言,那么您所拥有的只是一堆随机的变量。给定一堆随机值,你能对“相关”提出什么要求?

Crash 1: a = 2, b = 3, c = 4 

Crash 2: a = 3, b = 4, c = 5 

有关的?无关?在不了解代码的所有内容的情况下,如何对这些进行分类?如果您对代码了如指掌,就可以制定本应为assert真的标准语句条件。然后你知道实际的崩溃是什么。

于 2010-04-09T21:28:39.113 回答