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

标签 multithreading segmentation-fault coredump core-file

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

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

现在出现以下模式

  • 主线程中的SEGV -> 生成核心文件
  • 非主线程中的SEGV -> 没有核心文件生成

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

  • 发送“kill -s SIGSEGV ”->生成核心文件

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

  • 发送“kill -s SIGSEGV ”-> 没有核心文件生成

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

我还在不同的操作系统下尝试了相同的代码,这只发生在我们的生产环境 (redhat6) 而不是在 Ubuntu 下。 我仍在尝试弄清楚它是否与调试/非调试构建有关。

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

感谢任何帮助。

最好的问候 马蒂亚斯

最佳答案

就其值(value)而言 - 它与我通过反复试验发现的核心模式有关

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 表现不同,以及为什么我最简单的程序没有显示问题 - 因为没有代码为线程命名

关于multithreading - 当 SEGV 发生在与主线程不同的线程中时缺少核心文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60709367/

相关文章:

c++ - 为什么我在第一个代码中出现段错误,但在第二个代码中却没有?

c++ - 什么会导致 C++ 中的段错误?

c++ - gdb中<exp+6>是什么意思?

linux - 当程序具有命令行参数时,如何使用 GDB 分析程序的核心转储文件?

python - 导入 pyqtgraph 时 python 2.7 中的段错误(核心转储)

java - 如何通知正在运行的线程发生更改

java - 在构造函数中创建防御副本的正确方法是什么

Java客户端/服务器多线程文件传输问题

选择 pthread 中的打印顺序

c++ - 格罗马克 : Illegal instruction (core dumped)