discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem with exception handling: WAS: no thread-safe +initialize in


From: Robert Slover
Subject: Re: Problem with exception handling: WAS: no thread-safe +initialize in old gnustep runtime?
Date: Mon, 13 Jun 2011 08:12:51 -0400

Sebastian,

I think you're misreading the BSD prototype to signal().  It is easy to do; the 
typedef in the Linux one just makes it easier to comprehend at first glance, 
but is functionally equivalent.

The signal() prototype declares that it returns a pointer to a function 
returning void which takes a single integer argument.  If you scroll down in 
the BSD manpage and read the 'RETURN VALUES' section, you will see that it 
specifically declares that it returns the previous signal handler.  The Solaris 
manpage says "previous disposition".  At any rate, I think the original code 
there was correct, and your substitute for it, incorrect (well, return value 
also allows for SIG_ERR to be returned and errno to be set).

Best regards,

--Robert

On Jun 13, 2011, at 7:34 AM, Sebastian Reitenbach wrote:

> 
> On Monday, June 13, 2011 10:41 CEST, Richard Frith-Macdonald <rfm@gnu.org> 
> wrote: 
> 
>> 
>> On 12 Jun 2011, at 12:56, Sebastian Reitenbach wrote:
>> 
>>> 
>>> commenting out the line below in -[NSException raise], allows Sudoku to 
>>> work as expected, also Burn seems to behave fine.
>>> I've seen other programs hanging in NSCountFrames() before, but that were 
>>> on error cases, so making sure not running into an error, fixed the 
>>> problem...
>>> While I was testing for the release of the latest stable versions of 
>>> gnustep, I ran the test suite. The -base testsuite did hang in a couple of 
>>> places, where Richard already suspected a problem with the Exception 
>>> handling. I had to kill the processes, to make the testuite go on. With the 
>>> line commented out, the testuite also runs successfully to the end.
>>> 
>>> 1609 Passed tests
>>> 13 Dashed hopes
>>>  1 Skipped set
>>> 
>>> All OK!
>>> 
>>> 
>>> - (void) raise
>>> {
>>> if (_reserved == 0)
>>>   {
>>>     _reserved = NSZoneCalloc([self zone], 2, sizeof(id));
>>>   }
>>> //_e_stack = [GSStackTrace new];
>>> 
>>> #if     defined(_NATIVE_OBJC_EXCEPTIONS)
>>> @throw self;
>>> #else
>>> 
>>> I don't think that just commenting out this line is the right/best solution 
>>> to the problem, but I hope its enough information for someone with more 
>>> insight to have a better idea how to fix it. Fixing it the right way would 
>>> be great step forward for GNUstep on OpenBSD (:
>> 
>> OK ... what's happening here is we are generating a stack trace by using 
>> methods to work back up the stack ...
>> On some architectures (and in any system where the stack is messed up (eg by 
>> the ffcall library) this procedure can get to a point where it causes a 
>> signal (such as segmentation fault) ... this is normal/expected.  The fact 
>> that gdb stops at this point is NOT normally an indication of any 
>> error/problem.
> Ah, OK. When I continue Sudoku in gdb, it also goes on after the SIGSEV, 
> afterwards, it starts to hang again. When I then when it "hangs", press 
> Ctrl-C, and then look at the backtrace, it hangs again, at more or less the 
> same place in NSCountFrames();
> 
> 
>> The stack trace code therefore uses a signal handler to trap the signal and 
>> deal with it gracefully by stopping the construction of the stack trace at 
>> the point where it's hit a problem in the stack.  It seems this may not be 
>> working properly for you.
>> 
>> Now, this ties in with your problem with NSTask ... since the NSTask code 
>> also uses a signal handler to detect when a child process has terminated.  
>> So a failure to detect child termination may well be due to some problem 
>> with signal handling.
>> 
>> So, my guess is that your BSD system is handling signals oddly ... the 
>> signal handler code in gnustep uses very old and well tested posix signal 
>> semantics but there are lots of newer or system dependent tweaks on signal 
>> handling.  Maybe theres something we need to be doing special on your system 
>> to get signal handling to work as expected?  Or maybe there's some subtle 
>> bug in the signal handling which just doesn't show uyp on other systems.  
>> Either way, it might be worth looking at that and seeing if writing/using 
>> some alternative BSD signal handling code would solve the issues.
> 
> I think I'm getting closer now, I added a lot of NSLogs(), and found that in 
> the jbuf_type struct bus and segv are always null, and I was wondering about 
> it. So started to compare manual pages of OpenBSD signal(3) and Linux 
> signal(2), and found, that they are indeed different:
> http://www.openbsd.org/cgi-bin/man.cgi?query=signal&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
> http://linux.die.net/man/2/signal
> 
> signal(3) on OpenBSD is a void function, but on Linux it returns 
> sighandler_t, so I changed it the code from:
>      env->segv = signal(SIGSEGV, recover);
>      env->bus = signal(SIGBUS, recover);
> to:
>      signal(SIGSEGV, recover);
>      signal(SIGBUS, recover);
>      env->segv = recover;
>      env->bus = recover;
> 
> Now, I see that those values are set, but it still hangs, see below the 
> output, where I added a couple of NSLog statements in NSDebug and NSException:
> 
> 2011-06-13 13:16:03.099 Sudoku[16840] NSException raise was called,_reserved 
> was 0
> 2011-06-13 13:16:03.100 Sudoku[16840] GSStacktrace init!, but I don't have 
> backtrace!
> 2011-06-13 13:16:03.100 Sudoku[16840] GSPrivateStackAddresses was called
> 2011-06-13 13:16:03.100 Sudoku[16840] jbuf: dict: {GSjbuf = <00000000 
> 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
> 00000000 00000000 00000000 00000000 00000000>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <00000000 00000000 00000000 
> 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
> 00000000 00000000 00000000>
> 2011-06-13 13:16:03.101 Sudoku[16840] NSCountFrames before if:  env->segv: 
> (null), env->bus: (null)
> 2011-06-13 13:16:03.106 Sudoku[16840] NSCountFrames in if:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.106 Sudoku[16840] NSCountFrames in done:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.106 Sudoku[16840] jbuf: dict: {GSjbuf = <9e04fd01 
> 00210222 8c4dbdcf b84dbdcf 88d88b89 7402487f 00000000 01000000 00000000 
> 00000000 00000000 64000000 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <9e04fd01 00210222 8c4dbdcf 
> b84dbdcf 88d88b89 7402487f 00000000 01000000 00000000 00000000 00000000 
> 64000000 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.374 Sudoku[16840] NSException raise was called,_reserved 
> was 0
> 2011-06-13 13:16:03.375 Sudoku[16840] GSStacktrace init!, but I don't have 
> backtrace!
> 2011-06-13 13:16:03.375 Sudoku[16840] GSPrivateStackAddresses was called
> 2011-06-13 13:16:03.376 Sudoku[16840] jbuf: dict: {GSjbuf = <e497fd01 
> 00210222 bc4dbdcf 984fbdcf e0b6f921 7402487f 00000000 01000000 00000000 
> 00000000 00000000 c0ba001c 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <e497fd01 00210222 bc4dbdcf 
> 984fbdcf e0b6f921 7402487f 00000000 01000000 00000000 00000000 00000000 
> c0ba001c 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.377 Sudoku[16840] NSCountFrames before if:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.381 Sudoku[16840] NSCountFrames in if:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.382 Sudoku[16840] jbuf: dict: {GSjbuf = <9e04fd01 
> 00210222 8c87bdcf b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 
> 00000000 00000000 48000000 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <9e04fd01 00210222 8c87bdcf 
> b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 00000000 00000000 
> 48000000 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.382 Sudoku[16840] recover: I got called, jumping to: 
> 0x87a97980
> 2011-06-13 13:16:03.382 Sudoku[16840] jbuf: dict: {GSjbuf = <9e04fd01 
> 00210222 8c87bdcf b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 
> 00000000 00000000 48000000 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <9e04fd01 00210222 8c87bdcf 
> b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 00000000 00000000 
> 48000000 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.390 Sudoku[16840] NSCountFrames in else:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.390 Sudoku[16840] jbuf: dict: {GSjbuf = <9e04fd01 
> 00210222 8c87bdcf b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 
> 00000000 00000000 48000000 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <9e04fd01 00210222 8c87bdcf 
> b887bdcf 4858c085 c4435d85 00000000 01000000 00000000 00000000 00000000 
> 48000000 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.458 Sudoku[16840] 0 tries, picked 
> 000000000000000000000000000000111111111111111111111111111111111111111111111112300
>  over (null)
> 2011-06-13 13:16:03.593 Sudoku[16840] NSException raise was called,_reserved 
> was 0
> 2011-06-13 13:16:03.593 Sudoku[16840] GSStacktrace init!, but I don't have 
> backtrace!
> 2011-06-13 13:16:03.594 Sudoku[16840] GSPrivateStackAddresses was called
> 2011-06-13 13:16:03.594 Sudoku[16840] jbuf: dict: {GSjbuf = <e497fd01 
> 00210222 bc87bdcf 9889bdcf e0b6f921 c4435d85 00000000 01000000 00000000 
> 00000000 00000000 e4ecbdcf 84d4fc01 84d4fc01>; NSConnectionThreadKey = 
> "<NSConnection: 0x8a651258> local: '',<NSMessagePort 0x7f051328 file name 
> /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0> remote '',<NSMessagePort 
> 0x7f051328 file name /tmp/GNUstepSecure1000/NSMessagePort/ports/16840.0>"; 
> NSCurrentServerThreadKey = "<XGServer: 0x80040608>"; 
> NSGraphicsContextStackKey = (); NotificationQueueListThreadKey = 
> "<NotificationQueueList: 0x85543568>"; NotificationQueueThreadKey = 
> "<NSNotificationQueue: 0x80bf6ce8>"; sharedHorizontalTypesetter = 
> "<GSHorizontalTypesetter: 0x7ccac088>"; }, d: <e497fd01 00210222 bc87bdcf 
> 9889bdcf e0b6f921 c4435d85 00000000 01000000 00000000 00000000 00000000 
> e4ecbdcf 84d4fc01 84d4fc01>
> 2011-06-13 13:16:03.598 Sudoku[16840] NSCountFrames before if:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 2011-06-13 13:16:03.600 Sudoku[16840] NSCountFrames in if:  env->segv: 
> 0x1fcd484, env->bus: 0x1fcd484
> 
> 
>> 
> 
> 
> 
> 
> 
> _______________________________________________
> Discuss-gnustep mailing list
> Discuss-gnustep@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnustep




reply via email to

[Prev in Thread] Current Thread [Next in Thread]