我目前正在调试我们的一个 C++ 应用程序中的段错误,这让我很难过,因为在发生段错误时没有生成核心文件。
在阅读和检查 ulimits 等之后,我可以重现核心文件未生成的情况。它似乎以某种方式与线程有关。为此,我修改了我们的软件以人工生成 SEGV:
现在出现以下模式
- 主线程中的SEGV -> 生成核心文件
- 非主线程中的SEGV -> 没有核心文件生成
为了不改变程序本身,我也尝试了发送信号。
- 发送“kill -s SIGSEGV
”->生成核心文件
然后我在/proc/
- 发送“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/