C++ 如何在事后gdb会话中找到导致SEGFAULT的线程?

C++ 如何在事后gdb会话中找到导致SEGFAULT的线程?,c++,gdb,segmentation-fault,C++,Gdb,Segmentation Fault,在我的应用程序中,我处理SIGSEG以生成回溯跟踪,并调用abort()以生成核心转储 如果我现在对内核运行gdb事后分析,导致SEGFAULT的线程将不再可见。我能做些什么来找出故障的原因吗 致以最良好的祝愿, Martin您可以使用命令thread apply all bt或thread apply all bt full获取所有线程的回溯。可能有用 顺便问一下,如果你摆脱了你的处理器,你的操作系统会创建一个核心文件吗 目前,我使用处理程序向stderr写回溯,所以我有任何东西,因为我无法从

在我的应用程序中,我处理SIGSEG以生成回溯跟踪,并调用
abort()
以生成核心转储

如果我现在对内核运行gdb事后分析,导致SEGFAULT的线程将不再可见。我能做些什么来找出故障的原因吗

致以最良好的祝愿,
Martin

您可以使用命令
thread apply all bt
thread apply all bt full
获取所有线程的回溯。可能有用


顺便问一下,如果你摆脱了你的处理器,你的操作系统会创建一个核心文件吗

目前,我使用处理程序向stderr写回溯,所以我有任何东西,因为我无法从核心文件中获得任何东西。我必须尝试默认处理程序是否会产生“更好的”内核转储。
ulimit-c unlimited
并查看在没有任何处理程序的情况下您将获得什么内核。@skwllsp,有没有办法确切地知道是哪个线程导致了SIGSEGV?您的意思是说实际上不可能知道并且必须使用回溯跟踪来查找它吗?通常,
gdb
(用于分析核心文件时)使用命令
bt
打印导致核心转储的线程的堆栈跟踪。这是一种默认行为。问题实际上是关于相反的情况,当coredump不在第一个线程中时。这就是为什么我建议获取所有线程的回溯。您是否也在处理程序中执行其他工作?为什么不让操作系统使用其默认行为为您留下一个内核呢?只需创建一个到stderr的backlog,然后调用abort()。请指定您的操作系统,以及您在GDB中观察到的具体内容。在Linux(以及我能想到的所有其他UNIX)上,SIGSEGV处理程序将在首先导致SIGSEGV的线程中运行。如果该hander调用abort(),那么核心转储将包含该线程作为线程#1,并且可以准确地找到导致问题的指令和调用堆栈。因为你有困难,你要么是在一些“奇怪”的操作系统上,要么你没有正确地描述你实际观察到的东西。不,SIGSEGV在主线程上被调用,而SEGFULT发生在另一个线程上。我目前无法重现这个问题,因为它是一个单一的文档,我至今无法重现。