Solaris 上的异常处理机制

Exception handling mechanism on Solaris

提问人:Luchian Grigore 提问时间:9/9/2011 更新时间:9/9/2011 访问量:287

问:

我正在为 C++ 应用程序构建错误处理机制。现在,我使用 VectoredExceptionHandling 完成了 Windows 部分,我想知道 Solaris 上是否有类似的概念。基本上,每当从程序中的任何位置抛出异常时,我都希望调用回调。在 Windows 下,您可以使用 注册回调。如何为 Solaris 执行此操作?AddVectoredExceptionHandler()

C++ 异常 Solaris

评论

0赞 PlasmaHH 9/9/2011
这些事情主要取决于你使用的编译器
0赞 MSalters 9/9/2011
我想知道您是否混合了 Windows 本机结构化异常处理 (SEH) 和 C++ 异常? 用于 SEH,而不是 C++ 例外。Solaris 没有 SEH 例外。VectoredExceptionHandling
0赞 Maxim Egorushkin 9/9/2011
@MSalters:C++例外不是在 Windows 上的 SEH 之上实现的吗?microsoft.com/msj/0197/exception/exception.aspx
0赞 MSalters 9/9/2011
@Maxim:MSVC++ 异常存在于 Win32 中,不确定 Win64 上的英特尔C++或 MSVC++。
0赞 Luchian Grigore 9/9/2011
我实际上不知道,我正在按照说明注册回调,并且在抛出异常时会调用它(通过抛出“..”;)。

答:

1赞 Anton Belov 9/9/2011 #1

如果这可行,不是 100%,但您可以尝试模仿 gdb 的 catchpoints 工作方式:请参阅 http://www.delorie.com/gnu/docs/gdb/gdb_31.html 关键信息是这样的:

“要在调用异常处理程序之前停止,您需要对实现有一些了解。对于 GNU C++,通过调用名为 __raise_exception 的库函数引发异常,该函数具有以下 ANSI C 接口:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

若要使调试器在发生任何堆栈展开之前捕获所有异常,请在 __raise_exception“ 上设置断点”

所以,我的猜测是,例如,您可以通过LD_PRELOAD技巧安装自己的__raise_exception。

评论

0赞 Anton Belov 9/17/2011
;-)谢谢。老实说,如果在 UNIX 世界中看到一个更“合适”的解决方案,我会留下非常深刻的印象——它只是一个奇怪的功能......我的意思是,人们编写他们的异常处理程序,以便他们可以处理异常情况,对吧?所以,除非你是一个调试器,否则你为什么要在上面安装一些东西?但是,MS 人有他们的想法,我相信他们在提供这种“向量异常处理”时已经考虑到了这一点。