[squeak-dev] How do I debug synchronization problems?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[squeak-dev] How do I debug synchronization problems?

Johan Björk
Hi everyone,

First: sorry for the long email, I have no clue what is going on.

Some background information:
I'm running one client to a KomServices TcpService server in squeak
3.9 (MacOSX). I've been doing stresstesting on my server for a while,
but previously I never tried to use Squeak at the same time.
Today I started using the Process browser to debug another problem,
(thanks gokr!) , and noticed that if I opened the Process browser when
running a stresstest, I got the most obscure problems.

Now to the problems:
First off, I really have NO IDEA what is going on, nor how to debug
this. so I'll just plainly state what I see happening, and then
someone better then me might be able to explain this, and tell me what
more information you guys need:

Starting the process browser, MOST cases, instead of receiving a
process browser window, I get a "random" error.

"Random" a bit more specified:
Mostly I get Syntax error errors, such as:
------------------------------------------
grimReaperProcess
        "This is a process which waits for the death of a child OSProcess, and
        informs any dependents of the change. Use SIGCHLD events if possible,
        otherwise a Delay to poll for exiting child processes."

        | event processSynchronizationDelay |
        ^ self canAccessSystem
                ifTrue:
                        [event := (self canAccessSystem and: [self canForwardExternalSignals])
                                ifTrue: [self sigChldSemaphore]
                                ifFalse: [Delay forMilliseconds: 200].
                        processSynchronizationDelay := Delay forMilliseconds: 20.
                        grimReaper ifNil:
                                [grimReaper Period or right bracket expected ->
------------------------------------------
parse: sourceStream class: class noPattern: noPattern context: ctxt
notifying: req ifFail: aBlock
        Unmatched comment quote ->"Answer a MethodNode for the
argument, sourceStream, that is the root of
        a parse tree. Parsing is done with respect to the argument,
class, to find
        instance, class, and pool variables; and with respect to the argument,
        ctxt, to find temporary variables. Errors in parsing are r
--------------------------------------------------------

I also sometimes receive messageNotUnderstood errors, (but I don't
have any stacktrace for that, it seems the current image didn't have
the HTML exporter installed, and I got other exceptions afterwards)
for example:
Parser>>parseError

I guess I'm accessing some operation which I'm not allowed to concurrently.
Since I don't know where I'm to look, I'll state some things I do and
hopefully someone can point me in the right direction:
Everything in my application is "singlethreaded" ie, it's only one
concurrent connection.
I'm NOT using Morphic
I'm accessing the #Smalltalk to convert Symbols to classes.
I'm using perform: on my own object
I'm using instVarNames and classVarNames on about every object in the system
I request sub and superclasses for about every object in the system
I request sourcecode for both class and instance methods for about
every object in the system (sourceCodeAt: #method)
I'm never writing or changing anything, all my operations are "read only".

Thanks in advance
/Johan

Reply | Threaded
Open this post in threaded view
|

[squeak-dev] Re: How do I debug synchronization problems?

Johan Björk
Hi guys,

Managed to narrow this down to a testcase, it seems there is a
racecondition at RemoteString>>#Text

http://bugs.squeak.org/view.php?id=7032

Thanks a billion to RandalSchwartz who helped track it down on the
squeak IRC channel.

/Johan


On Mon, Apr 28, 2008 at 4:52 PM, Johan Björk <[hidden email]> wrote:

> Hi everyone,
>
>  First: sorry for the long email, I have no clue what is going on.
>
>  Some background information:
>  I'm running one client to a KomServices TcpService server in squeak
>  3.9 (MacOSX). I've been doing stresstesting on my server for a while,
>  but previously I never tried to use Squeak at the same time.
>  Today I started using the Process browser to debug another problem,
>  (thanks gokr!) , and noticed that if I opened the Process browser when
>  running a stresstest, I got the most obscure problems.
>
>  Now to the problems:
>  First off, I really have NO IDEA what is going on, nor how to debug
>  this. so I'll just plainly state what I see happening, and then
>  someone better then me might be able to explain this, and tell me what
>  more information you guys need:
>
>  Starting the process browser, MOST cases, instead of receiving a
>  process browser window, I get a "random" error.
>
>  "Random" a bit more specified:
>  Mostly I get Syntax error errors, such as:
>  ------------------------------------------
>  grimReaperProcess
>         "This is a process which waits for the death of a child OSProcess, and
>         informs any dependents of the change. Use SIGCHLD events if possible,
>         otherwise a Delay to poll for exiting child processes."
>
>         | event processSynchronizationDelay |
>         ^ self canAccessSystem
>                 ifTrue:
>                         [event := (self canAccessSystem and: [self canForwardExternalSignals])
>                                 ifTrue: [self sigChldSemaphore]
>                                 ifFalse: [Delay forMilliseconds: 200].
>                         processSynchronizationDelay := Delay forMilliseconds: 20.
>                         grimReaper ifNil:
>                                 [grimReaper Period or right bracket expected ->
>  ------------------------------------------
>  parse: sourceStream class: class noPattern: noPattern context: ctxt
>  notifying: req ifFail: aBlock
>         Unmatched comment quote ->"Answer a MethodNode for the
>  argument, sourceStream, that is the root of
>         a parse tree. Parsing is done with respect to the argument,
>  class, to find
>         instance, class, and pool variables; and with respect to the argument,
>         ctxt, to find temporary variables. Errors in parsing are r
>  --------------------------------------------------------
>
>  I also sometimes receive messageNotUnderstood errors, (but I don't
>  have any stacktrace for that, it seems the current image didn't have
>  the HTML exporter installed, and I got other exceptions afterwards)
>  for example:
>  Parser>>parseError
>
>  I guess I'm accessing some operation which I'm not allowed to concurrently.
>  Since I don't know where I'm to look, I'll state some things I do and
>  hopefully someone can point me in the right direction:
>  Everything in my application is "singlethreaded" ie, it's only one
>  concurrent connection.
>  I'm NOT using Morphic
>  I'm accessing the #Smalltalk to convert Symbols to classes.
>  I'm using perform: on my own object
>  I'm using instVarNames and classVarNames on about every object in the system
>  I request sub and superclasses for about every object in the system
>  I request sourcecode for both class and instance methods for about
>  every object in the system (sourceCodeAt: #method)
>  I'm never writing or changing anything, all my operations are "read only".
>
>  Thanks in advance
>  /Johan
>

Hi guys,

I've managed to nail it down a bit more.