c - setjmp/signal 崩溃异常处理

标签 c multithreading macos exception crash

我正在尝试为 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等。使用宏和(目前仅限 x86)程序集看起来有点乱,但它确实有效。

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

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

相关文章:

java - 如何在Android中的另一个线程中运行一个方法?

java - ServerEndpointConfig.Configurator 实例应该是线程安全的吗?

java - token "Invalid Character"语法错误,删除此 token

java - Canvas 上的 KeyListener : keyReleased triggering, 但没有 keyPressed 或 keyTyped

objective-c - 禁用 NSDocument 的 "Revert To"和 "Duplicate"菜单项

c++ - C/C++ : How should preprocessor directive work on macros argument list?

c - 多维数组和指针

ruby - 当你不加入你的线程时会发生什么?

c - 为什么信号处理程序进入无限循环? - SIGSEGV

c - 声明字符时char和int的区别