C++ 如何使SIGSEGV处理程序仅在堆栈溢出情况下在备用堆栈上启动?

C++ 如何使SIGSEGV处理程序仅在堆栈溢出情况下在备用堆栈上启动?,c++,c,linux,C++,C,Linux,我的应用程序使用了一个SIGSEGV分段冲突信号处理程序,该处理程序已向sigaction注册 当我的应用程序访问空指针时,我的SIGSEGV处理程序将获得一个控件,打印到控制台并记录出错线程的堆栈跟踪,并调用默认信号处理程序,从而生成核心转储。因此,当测试人员报告崩溃时,我会在日志中快速看到有问题的线程堆栈跟踪,而不分析核心转储 但是,在堆栈溢出的情况下,我的信号处理程序没有启动,应用程序会崩溃,并显示静默日志。在分析核心转储时,我或我的同事看到崩溃发生在正确代码的中间。要理解堆栈溢出是崩溃的

我的应用程序使用了一个SIGSEGV分段冲突信号处理程序,该处理程序已向sigaction注册

当我的应用程序访问空指针时,我的SIGSEGV处理程序将获得一个控件,打印到控制台并记录出错线程的堆栈跟踪,并调用默认信号处理程序,从而生成核心转储。因此,当测试人员报告崩溃时,我会在日志中快速看到有问题的线程堆栈跟踪,而不分析核心转储

但是,在堆栈溢出的情况下,我的信号处理程序没有启动,应用程序会崩溃,并显示静默日志。在分析核心转储时,我或我的同事看到崩溃发生在正确代码的中间。要理解堆栈溢出是崩溃的原因,需要花费大量的时间。因此,我希望日志中至少有一个消息堆栈溢出,以防堆栈溢出

在阅读手册页注释部分时,我意识到我的信号处理程序是在出错线程的堆栈上调用的,这就是为什么在堆栈溢出的情况下,无法调用信号处理程序,因为没有堆栈来调用信号处理程序。 但是,可以在备用堆栈上运行信号处理程序。这将使我的信号处理程序记录消息堆栈溢出

但是手册页让我想到,如果我将我的SIGSEGV处理程序切换为使用备用堆栈,那么该处理程序将始终在备用堆栈上执行,并且将无法记录NULL指针访问情况下出现问题的线程堆栈跟踪

因此,问题是:如何使SIGSEGV处理程序仅在堆栈溢出情况下的备用堆栈上启动,而在所有其他情况下的当前活动堆栈上启动


要获取堆栈跟踪,我使用以下调用:,。

而不是重置处理程序并在空指针取消引用时重新引发SIGSEGV,检查您是否在alt堆栈上运行,如果是,则使用sigaction关闭备用堆栈,然后重新引发信号并返回。然后,您将在主堆栈上处理新信号


当然,最好是确保不会发生堆栈溢出。不要创建非平凡大小的基于堆栈的缓冲区,也不要使用递归。

在正常sigsegv的情况下,如何获取堆栈跟踪?@user58697,我已经更新了问题,请参见底线。