gpt4 book ai didi

c++ - 定位运行在集群上的多线程程序的段错误

转载 作者:可可西里 更新时间:2023-11-01 18:37:57 24 4
gpt4 key购买 nike

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

我们如何定位段错误?我正在寻找一种通用方法、程序或测试工具。我无法提供可重现的示例,因为该程序确实很大,并且在某些未知情况下会在集群上崩溃。

我需要在如此困难的情况下找出问题,因为程序可以在具有任意数量线程的本地计算机上正确运行。

最佳答案

“正常”方法是让环境生成核心文件并获取这些文件。如果这不是一个选项,您可能想尝试为 SIGSEGV 安装信号处理程序它至少获得了在某处转储的堆栈跟踪。当然,这会立即引出问题 "how to get a stack trace"但这在别处得到了回答。

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

我对核心文件为空的说法有点困惑:您可以使用 ulimit 设置核心文件的限制。在外壳上。如果核心大小设置为零,则不应生成任何核心文件。生产一个空的似乎很奇怪。但是,如果您无法更改程序的限制,您可能只能安装信号处理程序并从有问题的线程中转储堆栈跟踪。

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

附加到它
gdb program pid

不过,我不确定如何从程序内部让程序进入休眠状态(可能为 SIGSTOP 安装处理程序 SIGSEGV ...)。

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

关于c++ - 定位运行在集群上的多线程程序的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com