如何调试并行化随机软件?

时间:2015-08-03 18:50:56

标签: java debugging parallel-processing stochastic-process

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

  1. 跨多个线程运行任务(我不是control which thread runs which task
  2. 每项任务的执行取决于随机值(我不是control the randomization seed
  3. 任务的状态是一个复杂的对象图,无法轻易地序列化为平坦的人类可读格式
  4. 到目前为止,我已尝试过以下方法:

    1. 检查调试器中的各个线程:这是有问题的,因为大多数任务成功完成(在问题发生之前设置断点会导致许多误报)。另一方面,如果我设置一个断点,一旦任务处于不良状态就停止,我不能回过头来弄清楚我是如何在那里结束的。

    2. 在理论上倾倒跟踪日志是很好的(我可以在发现一个糟糕的状态时回过头来)但是我还没弄清楚如何将一个任务的状态序列化为一个单位人类可读的格式。

    3. 在一个理想的世界中,我希望能够为一个糟糕的状态设置一个断点,然后使用调试器来检查我是如何达到这一点的。

      你以前遇到过这种问题吗?你是如何调试它的?

1 个答案:

答案 0 :(得分:0)

我做了以下事情:

  1. 为每个任务分配一个不可变的TaskID,该TaskID包含在代表该任务的数据结构中。
  2. 在任务开始时,记录TaskID和任务数据结构的完整状态。
  3. 在每个重要的执行步骤中,编写一个包含TaskID的单行日志条目以及对任务数据结构的任何重大更改。
  4. 然后,当您诊断问题时,使用工具将日志过滤到您感兴趣的任务。“穷人”""这样做的方法是使用grep。富人""方法是使用类似Splunk的东西。

    使用调试器的策略不会让您走得更远,因为(就您的诊断数据而言),您将受限于您可以承受的能力和#34;保持堆积。