This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
[Note: I attempted to submit this bug to http://gcc.gnu.org/cgi-bin/gnatsweb.pl, but was unable to attach more than one file to the bug report. Since the bug involves two source files--one for main() and the other for a shared library--you're getting email with MIME attachments instead. Hope this isn't too inconvenient.] Reporter's email: jc@roguewave.com Category: c++ - C++ front end Synopsis: unable to catch exceptions thrown from subthreads during destruction of global objects in shared libraries Confidential: no Severity: critical Priority: high Class: sw-bug Release: The complete output of g++ -v is: Reading specs from /package/1/compilers/g++/3.0.2/bin/../lib/gcc-lib/sparc-sun-solaris2.8/3.0.2 /specs Configured with: ../gcc-3.0.2/configure --prefix=/nfs/packages/mdx/Solaris/compilers/g++/3.0.2 Thread model: posix gcc version 3.0.2 Environment: Solaris 8 (SunOS 5.8) Description: With gcc 3.0.2 or 3.0.1 (but not 2.96 or 2.95), under very particular circumstances, some exceptions will not be caught. Specifically, if an exception is thrown from a subthread after main() has returned but before the main thread has terminated (that is, during the destruction of a global object), then the exception cannot be caught if the global object resides within a shared library. Instead, abort() is called and the program terminates on SIGKILL. The stack trace is as follows: #0 0xff059bf0 in __sigprocmask () from /usr/lib/libthread.so.1 #1 0xff04e628 in _resetsig () from /usr/lib/libthread.so.1 #2 0xff04dd18 in _sigon () from /usr/lib/libthread.so.1 #3 0xff050e8c in _thrp_kill () from /usr/lib/libthread.so.1 #4 0xff0c9b10 in raise () from /usr/lib/libc.so.1 #5 0xff0b512c in abort () from /usr/lib/libc.so.1 #6 0xff251528 in ?? () at ../../../../gcc-3.0.2/libstdc++-v3/libsupc++/vec.cc:52 from /package/1/compilers/g++/3.0.2/lib/libstdc++.so.3 #7 0xff251574 in ?? () at ../../../../gcc-3.0.2/libstdc++-v3/libsupc++/vec.cc:52 from /package/1/compilers/g++/3.0.2/lib/libstdc++.so.3 #8 0xff2516e0 in ?? () at ../../../../gcc-3.0.2/libstdc++-v3/libsupc++/vec.cc:52 from /package/1/compilers/g++/3.0.2/lib/libstdc++.so.3 #9 0x13e5c in spew (arg=0x0) at thr.cpp:18 If any of the conditions are not met--if the exception is thrown before main() returns, if the exception is thrown from the main thread rather than a subthread, or if the global object resides in a static library--then the exception can be caught, and the program can terminate normally. File attachments: global.ii.gz is a gzipped, preprocessed source file. global.output is the output produced when creating global.ii via: g++ -v -save-temps -Wall -pthreads -g -c global.cpp -fPIC -mimpure-text -shared <<global.ii.gz>> <<global.output>> Likewise, thr.ii.gz is a gzipped, preprocessed source file, and thr.output is the output produced when creating thr.ii via: g++ -v -save-temps -Wall -pthreads -g -c thr.cpp <<thr.ii.gz>> <<thr.output>> How to repeat: Compile global.ii into a shared library with: gunzip global.ii.gz g++ -pthreads global.ii -fPIC -mimpure-text -shared -o libglobal.so Compile thr.ii into a test case with: gunzip thr.ii.gz g++ -pthreads thr.ii -L. -o thr -lglobal -lposix4 -lpthread -lnsl Run the test case with: export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ./thr The test case begins by creating a subthread. The main thread and the subthread then begin to periodically print diagnostics to cout. After main() finishes with these diagnostics, it sets a flag to indicate that the shutdown process has begun. After main() returns, the destructor for a Global object in libglobal.so begins to print statements to cout; this prevents the main thread from terminating, and allows the subthread to continue running. Before printing its next diagnostic statement, the subthread notices the shutdown flag and throws an exception. Its attempt to catch this exception fails with gcc 3.0.1 and 3.0.2, but succeeds with other compilers and earlier versions of gcc. -JC jc@roguewave.com http://www.roguewave.com (541)754-4094
Attachment:
global.ii.gz
Description: Binary data
Attachment:
global.output
Description: Binary data
Attachment:
thr.ii.gz
Description: Binary data
Attachment:
thr.output
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |