我正在尝试为C OSX Carbon 多线程应用程序安装“崩溃处理程序”。
在Windows上,我可以轻松使用简单有效的__try{} __except{} SEH of Windows,该方法非常有用。 (请注意,这些是与C++异常无关的无关,这些是较低级别的C构造!)

这与question I asked on SO previously非常相关:
还有一个older SO question

答案似乎是在每个代码区域之前使用setjmp(),然后在发生崩溃时使用信号处理程序将longjmp()返回。

但是,由于多线程,所以实现起来并不简单。 Windows中的__try {} __except {}惯用语是线程安全的,并且可以正常工作。但是显然setjmp不是线程安全的。

那么实现会是什么样子?
我一直认为我将必须实现一些线程本地存储。首先,我初始化setjmp,将环境状态存储在线程本地缓冲区中,然后信号处理程序将不得不通过查看线程本地区域来再次查找环境数据。但是,无论是Google还是SO都没有显示任何证据表明这是正确的策略,特别是因为setjmp()被记录为线程不安全的。
线程本地存储是否不需要每个线程来注册自己并分配内存(以保存该环境数据),并在线程破坏时释放它?

我希望我可以创建一个可以包装所有这些内容的宏,这样在OSX上,我的__try __except代码将可以正常工作。

那么,如何使用信号和setjmp制作OSX多线程安全的崩溃恢复处理程序?

最佳答案

ReactOS具有一个称为PSEH的SEH克隆。 ROS Newsletter #49对其进行了简要说明,您可以看到它如何在/include/crt/excpt.h/include/reactos/lib/pseh/pseh2.h等中实现。带有宏和一些宏的(看起来很杂乱的)hack和(目前仅用于x86)汇编,但是它可以工作。

话虽这么说,在UNIX上,信号+线程交互是众所周知的丑陋,所以如果您想要SEH的目的是处理信号...我建议您找到一个替代解决方案。

关于c - setjmp/信号崩溃异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/676461/

10-10 17:39