为集群上运行的mutithread程序定位分段错误

在交互模式下运行一个简单的程序时,使用gdb来定位分段错误非常简单。 但考虑我们有一个多线程程序 - 由pthread编写 - 提交给群集节点(通过qsub命令)。 所以我们没有互动操作。

我们如何找到分段故障? 我正在寻找一种通用的方法,程序或测试工具。 我无法提供一个可重复的例子,因为在某些未知的情况下,程序非常庞大并且在群集上崩溃。

我需要在这种困难的情况下发现问题,因为程序在具有任意数量的线程的本地机器上正确运行。


“正常”的做法是让环境产生一个核心文件并抓住这些文件。 如果这不是一个选项,你可能想要尝试为SIGSEGV安装一个信号处理程序,它至少可以获得转储到某处的堆栈跟踪信息。 当然,这会立即导致“如何获得堆栈跟踪”这个问题,但这在别处得到了解答。

最简单的方法可能是获取核心文件。 假设你有一个可以读取核心文件的类似机器,你可以使用gdb program corefile来调试产生核心文件corefile的程序program :你应该能够看到不同的线程,它们的数据(在一定程度上)等等。如果你没有合适的机器,可能需要交叉编译与运行机器硬件相匹配的gdb

我对核心文件为空的说法有点困惑:您可以在shell上使用ulimit设置核心文件的限制。 如果核心的大小设置为零,则不应生成任何核心文件。 制作一个空的似乎很奇怪。 但是,如果你不能改变你的程序的限制,你可能只需要安装一个信号处理程序,然后从违规的线程中抛出堆栈跟踪。

考虑到这一点,假设你可以在相应的机器上运行一个调试器,你可能可以使程序在信号处理程序中睡眠并使用调试器附加到程序中。 您可以确定进程ID(例如,使用ps -elf | grep program ),然后使用它附加到它

gdb program pid

我不知道如何从程序中将程序放入睡眠状态,但(可能会安装SIGSTOP for SIGSEGV的处理程序...)。

这就是说,我假设你尝试在你的本地机器上运行你的程序......? 一些问题比需要在每个节点上运行多个线程的分布式系统更重要。 显然,这不是对上述方法的替代。

链接地址: http://www.djcxy.com/p/66027.html

上一篇: Locating segmentation fault for mutithread program running on cluster

下一篇: expressionengine won't display all entries