我正在编写跨计算集群(使用秃鹰)运行的C应用程序。我尝试了许多方法来揭示有问题的代码,但无济于事。

线索:

  • 平均而言,当我在15台机器上运行代码2天时,我得到了两个或3个segfaults(信号11)。
  • 当我本地运行代码时,我不会得到segfault。我在家用机器上运行了将近3周。

尝试:

  • 我在瓦尔格林德(Valgrind)运行了四天,没有内存错误。
  • 我通过定义自己的信号处理程序来捕获SegFault信号,以便可以输出一些程序状态。
  • 现在,当发生segfault时,我可以使用Backtrace打印出当前的堆栈。
  • 我可以打印出变量值。
  • 我创建了一个设置为当前行号的变量。
  • 还尝试评论代码的块,希望如果问题消失了,我会发现segfault。

可悲的是,输出的线号是相当随机的。我不完全确定我可以使用StackTrace做什么。假设它仅记录了Segfault发生的功能的地址,我是否正确?

怀疑:

  • 我怀疑Condor用于跨机器移动作业的检查指向系统对内存腐败更敏感,这就是为什么我在本地看不到它的原因。
  • 该索引正在被错误损坏,并且这些索引导致了segfault。这将解释以下事实:segfaults发生在相当随机的行号上。

更新

对此进行了一些研究,我发现了以下链接:

更新2

格雷格(Greg)建议查看秃鹰日志,并“将segfaults与秃鹰从检查点重新启动可执行文件的何时相关联”。看着日志,segfaults全部发生在重新启动后。当作业从一种类型的机器转换为另一种类型时,所有故障似乎都会发生。

更新3

Segfault是由主机之间的差异引起的,通过将“需求”字段设置为Condor提交文件中的“需求Emberet”字段完全消失。

可以设置单个机器:

requirements = machine == "hostname1" || machine == "hostname2"

或整个机器:

requirements = classOfMachinesName

请参阅要求示例 这里

有帮助吗?

解决方案

如果可以的话,请通过调试进行编译,并在GDB下运行。或者,将核心倾倒并加载到调试器中。

MPICH拥有内置调试器,或者您可以购买商业并行调试器。

然后,您可以浏览代码以查看调试器中发生的情况

http://nmi.cs.wisc.edu/node/1610

http://nmi.cs.wisc.edu/node/1611

其他提示

当您的SEGFAULT发生时,您可以创建一个核心转储吗?然后,您可以调试此转储,以尝试弄清楚该代码的状态。

查看什么指令导致了故障。这甚至是有效的指令还是您要执行数据?如果有效,它要访问什么内存?这个指针从何而来。您需要缩小故障的位置(堆叠损坏,堆损坏,非初始化的指针,访问无效的内存)。如果是损坏,请查看损坏区域中是否有任何讲述数据(指向符号,看起来像结构中的东西的数据...)。您的内存分配器可能已经具有内置的功能来调试一些损坏(请参阅 MALLOC_CHECK_ 在Linux或 MallocGuardEdges 在Mac OS上)。这些常见的情况是使用已免费的内存()'d,因此记录malloc() / free()对可能会有所帮助。

如果您使用Condor_compile工具将代码重新链接到Condor检查点代码,则其做一些事情与普通链接不同。最重要的是,它可以静态地链接您的代码,并使用其自己的Malloc。另一个很大的区别是,秃鹰然后将其运行在外国机器上,在外国机器中,环境可能与您期望引起的问题足够不同。

Condor_compile生成的可执行文件可作为孔托系统外部的独立二进制运行。如果您在Condor的Condor_compile中运行二进制,在Condor之外,您仍然会看到Segfaults吗?

如果没有,您可以将Segfaults与Condor从检查点重新启动可执行文件时相关联(用户日志会告诉您何时发生这种情况)。

您已经尝试了我想到的大部分内容。我建议的唯一另一件事是开始添加大量的记录代码,希望您可以缩小发生错误的地方。

您不说的一件事是要解决问题需要多少灵活性。例如,您可以停止系统并运行您的应用程序吗?这些崩溃要解决的重要性也有多重要?

我假设您大部分时间都这样做。这可能需要大量资源。

短期步骤是将每个变量的“断言”(半手写)放置,以确保当您不想要它时不会更改它。在您完成长期过程时,这可以进行工作。

长期 - 尝试在两个集群(也许是家用计算机和VM)上运行它。您仍然看到Segfaults吗?如果不增加群集的大小,直到您开始看到segfaults。

以最小配置(获取segfaults)进行运行,并记录所有输入,直到崩溃。使用您记录的输入来自动运行系统,对其进行调整,直到您可以一致地崩溃,而最少的输入。

那时环顾四周。如果您仍然找不到错误,那么您将不得不再次询问您收集的这些运行的额外数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top