当 SEGV 发生在与主线程不同的线程中时缺少核心文件

missing corefiles when SEGV occurs in thread different from main thread

我目前正在调试我们的一个 c++ 应用程序中的段错误,这让我很难过,因为发生段错误时没有生成核心文件。

在阅读和检查 ulimits 等之后,我可以重现核心文件未生成的情况。它似乎以某种方式与线程有关。为此,我修改了我们的软件以人工生成 SEGV:

现在出现以下模式

然后为了不改变程序本身,我也尝试了发送信号。

然后我在 /proc//task 中搜索一个非主线程并获取了 id

您是否知道可以解释这种行为的任何线程特定属性?

我也在不同的 OS 下尝试了相同的代码,这只发生在我们的生产环境 (redhat6) 而不是在 Ubuntu 下。 我仍在尝试弄清楚它是否与 Debug/Non-Debug 构建有关。

仍然这种行为看起来很奇怪,一定是因为一些微妙之处。 我也想知道,如果我想故意创建此行为,我什至不知道要更改什么才能实现此目的。

感谢任何帮助。

此致 马蒂亚斯

它的价值 - 它与我通过反复试验发现的核心模式有关

core_pattern  core                   -> corefile
core_pattern  /opt/tmp/core          -> corefile
core_pattern  /opt/tmp/core_%e.%p    -> no corefile
core_pattern  /opt/tmp/core_%e       -> no corefile
core_pattern  /opt/tmp/core_%h       -> corefile
core_pattern  /opt/tmp/core_%h_%p    -> corefile
core_pattern  /opt/tmp/core_%h_%p_%e -> no corefile

所以 %e 似乎是为什么有时没有写核心的原因。 那么core dump filename gets thread name instead of executable name with core_pattern %e.%p.core 解释发生了什么——即 %e 不是可执行文件名称,而是包含有关线程的信息——在我的例子中包含“/”

这也解释了为什么不同线程中的 segv 表现不同,以及为什么我最简单的程序没有显示问题 - 因为没有代码为线程命名