0

我正在寻找处理一个相当高级问题的具体建议:如何调试软件(如果您有兴趣,可以使用遗传算法):

  1. 跨多个线程运行任务(我不控制哪个线程运行哪个任务
  2. 每个任务的执行取决于随机值(我不控制随机化种子
  3. 任务的状态是一个复杂的对象图,不能轻易序列化为人类可读的平面格式

到目前为止,我已经尝试了以下方法:

  1. 在调试器中检查单个线程:这是有问题的,因为大多数任务都成功完成(在问题之前设置断点会导致许多误报)。另一方面,如果我设置了一个断点,一旦任务处于不良状态就停止,我无法及时退后一步来弄清楚我是如何到达那里的。

  2. 转储跟踪日志在理论上很好(一旦发现错误状态,我可以及时退回),但我还没有弄清楚如何将任务的状态序列化为平面的人类可读格式。

在理想的世界中,我希望能够为错误状态设置断点,然后使用调试器及时退回以检查我是如何到达这一点的。

你以前遇到过这种问题吗?你是怎么调试的?

4

1 回答 1

0

我做了以下事情:

  1. 为每个任务分配一个不可变的 TaskID,该任务ID 包含在表示该任务的数据结构中。
  2. 在任务开始时,记录 TaskID 和任务数据结构的完整状态。
  3. 在每个重要的执行步骤中,编写一个单行日志条目,其中包括 TaskID 和对任务数据结构的任何重大更改。

然后,当您诊断问题时,使用工具将日志过滤到您感兴趣的任务。“穷人”的方法是使用 grep。“有钱人”的方式是使用 Splunk 之类的东西。

使用调试器的策略不会让您走得足够远,因为(就您的诊断数据而言)您将被限制在您可以“负担”的范围内以保持在堆上。

于 2015-08-03T20:50:20.837 回答