当 SEGV 发生在与主线程不同的线程中时缺少核心文件
missing corefiles when SEGV occurs in thread different from main thread
我目前正在调试我们的一个 c++ 应用程序中的段错误,这让我很难过,因为发生段错误时没有生成核心文件。
在阅读和检查 ulimits 等之后,我可以重现核心文件未生成的情况。它似乎以某种方式与线程有关。为此,我修改了我们的软件以人工生成 SEGV:
现在出现以下模式
- 主线程中的SEGV -> 生成核心文件
- 非主线程中的SEGV -> 不生成核心文件
然后为了不改变程序本身,我也尝试了发送信号。
- 正在发送"kill -s SIGSEGV < pid >" -> 生成核心文件
然后我在 /proc//task 中搜索一个非主线程并获取了 id
- 正在发送"kill -s SIGSEGV < threadid >" -> 没有生成核心文件
您是否知道可以解释这种行为的任何线程特定属性?
我也在不同的 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 表现不同,以及为什么我最简单的程序没有显示问题 - 因为没有代码为线程命名
我目前正在调试我们的一个 c++ 应用程序中的段错误,这让我很难过,因为发生段错误时没有生成核心文件。
在阅读和检查 ulimits 等之后,我可以重现核心文件未生成的情况。它似乎以某种方式与线程有关。为此,我修改了我们的软件以人工生成 SEGV:
现在出现以下模式
- 主线程中的SEGV -> 生成核心文件
- 非主线程中的SEGV -> 不生成核心文件
然后为了不改变程序本身,我也尝试了发送信号。
- 正在发送"kill -s SIGSEGV < pid >" -> 生成核心文件
然后我在 /proc/
- 正在发送"kill -s SIGSEGV < threadid >" -> 没有生成核心文件
您是否知道可以解释这种行为的任何线程特定属性?
我也在不同的 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 表现不同,以及为什么我最简单的程序没有显示问题 - 因为没有代码为线程命名