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

时间:2016-12-20 13:47:14

标签: c++ windows visual-studio signals sigsegv

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

一些外部DLL - 在某些情况下我甚至用Windows驱动程序看到这个 - 可能包含我无法控制的错误,而且我的软件全天候运行 - 我需要能够在某处记录崩溃并重新启动我的软件。

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

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

注意:我现在拥有的,它在主线程中完美运行,但如果我将同一块代码复制到任何线程,则完全没有:

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

1 个答案:

答案 0 :(得分:1)

要了解流程中所有未处理的例外情况,您可以致电SetUnhandledExceptionFilter。功能记录为:

  

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

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

作为替代方案,我相信一些/大部分/全部可以通过注册application recovery and restart自动完成。