【问题标题】:How to debug parallelized stochastic software?如何调试并行随机软件?
【发布时间】:2015-08-03 18:50:55
【问题描述】:

我正在寻找处理一个相当高级问题的具体建议:如何调试软件(Genetic Algorithm,如果您有兴趣):

  1. 跨多个线程运行任务(我不control which thread runs which task
  2. 每个任务的执行取决于随机值(我不control the randomization seed
  3. 任务的状态是一个复杂的对象图,无法轻松序列化为人类可读的平面格式

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

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

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

在理想情况下,我希望能够为不良状态设置断点,然后使用调试器及时退回以检查我是如何到达这一点的。

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

【问题讨论】:

    标签: java debugging parallel-processing stochastic-process


    【解决方案1】:

    我做了以下事情:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多