Ali*_*Ali 7 c++ multithreading hpc cluster-computing segmentation-fault
gdb在交互模式下运行简单程序时,使用它非常简单,以便找到分段错误.但是考虑一下我们有一个多线程程序 - 写入pthread- 提交给集群节点(通过qsub命令).所以我们没有互动操作.
我们如何定位分段错误?我正在寻找一般方法,程序或测试工具.我不能提供一个可重现的例子,因为程序非常大并且在某些未知情况下会在集群上崩溃.
我需要在这种困难的情况下找到问题,因为程序在具有任意数量线程的本地机器上正确运行.
“正常”方法是让环境生成核心文件并获取它们。如果这不是一个选项,您可能需要尝试安装一个信号处理程序,该处理程序SIGSEGV至少可以获得转储到某处的堆栈跟踪。当然,这立即导致了“如何获取堆栈跟踪”的问题,但这在其他地方得到了解答。
最简单的方法可能是获取核心文件。假设您有一台可以读取核心文件的类似机器,您可以使用它来调试生成核心文件的gdb program corefile程序:您应该能够查看不同的线程、它们的数据(在某种程度上)等。如果您如果没有合适的机器,可能需要交叉编译以匹配运行它的机器的硬件。programcorefilegdb
我对核心文件为空的说法有点困惑:您可以ulimit在 shell 上使用核心文件设置限制。如果核心大小设置为零,则不应生成任何核心文件。生产一个空的似乎很奇怪。但是,如果您无法更改程序的限制,您可能只能安装信号处理程序并从有问题的线程中转储堆栈跟踪。
考虑到这一点,假设您可以在相应的机器上运行调试器,您也许可以让程序在信号处理程序中休眠并使用调试器附加到它。您将确定进程 ID(使用,例如ps -elf | grep program),然后使用附加到它
gdb program pid
Run Code Online (Sandbox Code Playgroud)
不过,我不确定如何让程序在程序内进入睡眠状态(可能安装 for SIGSTOP...的处理程序SIGSEGV)。
也就是说,我假设您尝试在本地计算机上运行程序......?有些问题比需要在每个节点上运行许多线程的分布式系统更为根本。显然,这不能替代上述方法。
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |