gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:33:20 26 4
gpt4 key购买 nike

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

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

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

那么,有没有办法做到这一点?在此处进行谷歌搜索和搜索没有帮助 - 我发现有几个人有类似的问题,但没有适合我的情况的答案。

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

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

最佳答案

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

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

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

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

关于c++ - Windows:处理所有线程中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com