Re: C++ exception results in SIGABRT
Re: C++ exception results in SIGABRT
- Subject: Re: C++ exception results in SIGABRT
- From: Howard Hinnant <email@hidden>
- Date: Mon, 18 Feb 2008 14:11:07 -0500
On Feb 18, 2008, at 8:07 AM, Stefan Werner wrote:
Hi,
I'm in a situation where a C++ exception directly results in a
SIGABRT, even though an exception handler is in place. The exception
of type const char* is thrown and caught in the same dylib.
A little google magic pointed me to
http://www.dribin.org/dave/blog/archives/2006/02/10/gcc_exception_bug/
http://www.dribin.org/dave/blog/archives/2006/02/10/gcc_exception_bug_2/
and
http://gcc.gnu.org/wiki/Visibility
Following the advice of that page, I set GCC_SYMBOLS_PRIVATE_EXTERN
= NO in the project building the dylib but that didn't help either.
Finally, I tried building and linking it into my main app as a
static lib, but still the same result. GCC_SYMBOLS_PRIVATE_EXTERN =
NO is also set for the main application. Changing the code to throw
an exception of type int didn't help either.
GCC_ENABLE_CPP_EXCEPTIONS = YES is set too.
C++ exceptions in other parts of the same application work fine.
Here's the call stack of where the SIGABRT is received:
#0 0x941880ea in __kill
#1 0x941880dd in kill$UNIX2003
#2 0x941ff3f2 in raise
#3 0x9420e9af in abort
#4 0x912c0005 in __gnu_cxx::__verbose_terminate_handler
#5 0x912be10c in __gxx_personality_v0
#6 0x912be14b in std::terminate
#7 0x912be261 in __cxa_throw
#8 0x0296b261 in error_handler at PluginPNG.cpp:75
#9 0x029ee71d in png_error at Utilities.h:221
#10 0x029f5ad0 in png_read_end at pngread.c:1016
#11 0x0296c327 in Load at PluginPNG.cpp:582
#12 0x02958aa4 in FreeImage_LoadFromHandle at Plugin.cpp:362
#13 0x02958b3b in FreeImage_Load at Plugin.cpp:383
I am wondering if it has anything to do with pngread.c being
compiled as C and not C++?
Yes. To propagate a C++ exception through a C stack frame, that C
stack frame must be compiled with -fexceptions (which is defaulted off
for .c files). From the gcc docs:
However, you may need to enable this option when compiling C code
that needs to interoperate properly with exception handlers written
in C++.
-Howard
Try/catch work fine when I put them directly around the throw
statement in error_handler(), but when put in Load() (where they
belong) it results in a SIGABRT. Shouldn't GCC_ENABLE_CPP_EXCEPTIONS
= YES make sure that the exceptions nonetheless?
The source code for the dylib can be found at
freeimage.sourceforge.net, although you will need a broken png file
to see the error handling exception.
Thanks in advance for any help,
Stefan
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
@apple.com
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden