我正在寻找一种方法来捕获程序中的段错误和其他错误(使用多个线程,其中一些是由外部库创build的)。 我正在使用Visual Studio 2013与英特尔C ++编译器2015年。
有些外部DLL在某些情况下甚至可以用Windows驱动程序看到,可以包含超出我的控制的错误,而且我的软件全天候运行 – 我需要能够在某处logging崩溃并重新启动我的软件。
到目前为止,我发现你可以设置一个处理SIGSEGV和其他信号的信号处理程序。 根据我所读到的,在Linux下,这将完成我所需要的(为所有线程处理此信号),但在Windows下,您需要分别为每个线程设置信号处理程序。 由于我不是创build所有线程的人(如果我是,我可以使用__try / __ catch),这不是一个真正的select。 最重要的是,我看到当我在一个线程中设置一个信号处理程序,然后导致一个SIGSEGV它不会被处理程序处理,而完全相同的代码在主线程中工作正常 – 不知道发生了什么在那里(但即使是一个修复,这将无济于事,因为我不创build所有的线程,并循环所有现有的线程在我的过程中设置处理程序听起来像一个非常糟糕的主意)。
那么,有没有办法做到这一点? 谷歌search和search没有帮助 – 我发现有几个人有类似的问题,但没有答案可用于我的情况。
在内核空间中执行的进程如何知道意外(asynchronous)事件的发生?
在Windows应用程序中捕获CTRL + BREAK
在SIGILL处理程序中,如何跳过违规指令?
prctl(PR_SET_PDEATHSIG)竞争条件
在Linux / C ++中,发送给线程/进程的信号是否会激活?
注意:现在我已经有了,它可以在主线程中完美工作,但是如果我将同一代码块复制到任何线程,则完全没有问题:
SignalHandlerPointer prevIoUsHandlerSEGV = signal(SIGSEGV,SignalHandler); int *a; a = NULL; *a = 0;
在multithreading环境中阻止完整进程的信号
Python在os.system(“sleep …”)时如何阻塞信号?
如何杀死Haskell中的一个线程
XOPEN_SOURCE和信号处理
将Python SIGINT重置为默认信号处理程序
要获得有关进程中所有未处理的异常的通知,您可以调用SetUnhandledExceptionFilter 。 该功能记录为:
发出SetUnhandledExceptionFilter替换调用进程中现有的所有未来线程的现有顶级异常过滤器。
在异常过滤器中,建议触发对MiniDumpWriteDump (在外部进程中)的调用,以产生用于离线分析的小型转储。 您可以控制写入小型转储(例如线程,模块,调用栈,内存)的信息量。 最重要的是,在引发异常时,可以转储引发未捕获异常的线程的调用堆栈。
作为替代方案,我相信可以通过注册应用程序恢复和重新启动来自动完成一些/大部分/全部。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。