Windows:处理所有线程中的段错误

我正在寻找一种方法来捕获程序中的段错误和其他错误(使用多个线程,其中一些是由外部库创build的)。 我正在使用Visual Studio 2013与英特尔C ++编译器2015年。

有些外部DLL在某些情况下甚至可以用Windows驱动程序看到,可以包含超出我的控制的错误,而且我的软件全天候运行 – 我需要能够在某处logging崩溃并重新启动我的软件。

到目前为止,我发现你可以设置一个处理SIGSEGV和其他信号的信号处理程序。 根据我所读到的,在Linux下,这将完成我所需要的(为所有线程处理此信号),但在Windows下,您需要分别为每个线程设置信号处理程序。 由于我不是创build所有线程的人(如果我是,我可以使用__try / __ catch),这不是一个真正的select。 最重要的是,我看到当我在一个线程中设置一个信号处理程序,然后导致一个SIGSEGV它不会被处理程序处理,而完全相同的代码在主线程中工作正常 – 不知道发生了什么在那里(但即使是一个修复,这将无济于事,因为我不创build所有的线程,并循环所有现有的线程在我的过程中设置处理程序听起来像一个非常糟糕的主意)。

那么,有没有办法做到这一点? 谷歌search和search没有帮助 – 我发现有几个人有类似的问题,但没有答案可用于我的情况。

注意:现在我已经有了,它可以在主线程中完美工作,但是如果我将同一代码块复制到任何线程,则完全没有问题:

SignalHandlerPointer previousHandlerSEGV = signal(SIGSEGV, SignalHandler); int *a; a = NULL; *a = 0; 

要获得有关进程中所有未处理的异常的通知,您可以调用SetUnhandledExceptionFilter 。 该功能记录为:

发出SetUnhandledExceptionFilter替换调用进程中现有的所有未来线程的现有顶级异常过滤器。

在异常过滤器中,建议触发对MiniDumpWriteDump (在外部进程中)的调用,以产生用于离线分析的小型转储。 您可以控制写入小型转储(例如线程,模块,调用栈,内存)的信息量。 最重要的是,在引发异常时,可以转储引发未捕获异常的线程的调用堆栈。

作为替代方案,我相信可以通过注册应用程序恢复和重新启动来自动完成一些/大部分/全部。