[squeak-dev] Re: MVC debugging

Florin Mateoc fmateoc at gmail.com
Wed Sep 8 06:49:21 UTC 2010


 On 9/8/2010 1:54 AM, Andreas Raab wrote:
> On 9/7/2010 7:57 PM, David T. Lewis wrote:
>> I can't reproduce this. Are you able to get a debugger to open under
>> MVC at this point?
>
> Yes. I would have posted this earlier but I had an unexpected dinner and don't feel quite capable of doing this now
> (hick!).
>
>> Specifically, I changed Debugger class>>openOn:context:label:contents:fullView:
>> to call #searchForActiveControllerNoTerminate, where #searchForActiveControllerNoTerminate
>> is a copy of #searchForActiveController with the #terminateActive removed.
>> I'm not seeing any difference in behavior, so I must be missing a step
>> in the recipe.
>
> All right, I'm attaching the changes I have so far unreviewed. With these changes I've been able to debug just fine
> except from the case of handling a user interrupt which doesn't quite work yet. If you want to try this out, give it a
> shot, if not, I'll try to make headway tomorrow night. Right now I need some sleep :-)
>
> Cheers,
>   - Andreas
>
>
>

I also did a little debugging, and I now think that the two main issues are:
1 the code to open the debugger is inside WorldState addDeferredUiMessage: [], even for MVC, which will probably never
get executed
2 MVCTooBuilder was supposed to openNoTerminate (not open, which terminates the previous UI process) when called from
the debugger code

With these two addressed, I get the debugger as well (but also not from the user interrupt) - these are as hacks only (I
named the openNoTerminate methods in the ToolBuilders 'open1'), but I post them as part of the conversation.
I am not sure if these changes are identical to Andreas', but I also have to go to bed now :)

Florin



'From Squeak4.1 of 17 April 2010 [latest update: #9957] on 8 September 2010 at 2:34:52 am'!

!Debugger methodsFor: 'initialize' stamp: 'fm 9/8/2010 01:42'!
openFullNoSuspendLabel: aString
    "Create and schedule a full debugger with the given label. Do not terminate the current active process."

    | oldContextStackIndex |
    oldContextStackIndex := contextStackIndex.
    self expandStack. "Sets contextStackIndex to zero."
    ToolBuilder open1: self label: aString.
    self toggleContextStackIndex: oldContextStackIndex.! !

!Debugger methodsFor: 'initialize' stamp: 'fm 9/8/2010 01:39'!
openNotifierContents: msgString label: label
    "Create and schedule a notifier view with the given label and message. A notifier view shows just the message or the
first several lines of the stack, with a menu that allows the user to open a full debugger if so desired."
    "NOTE: When this method returns, a new process has been scheduled to run the windows, and thus this notifier, but
the previous active porcess has not been suspended.  The sender will do this."
    | msg builder spec |
    Sensor flushKeyboard.
    savedCursor := Sensor currentCursor.
    Sensor currentCursor: Cursor normal.
    (label beginsWith: 'Space is low')
        ifTrue: [msg := self lowSpaceChoices, (msgString ifNil: [''])]
        ifFalse: [msg := msgString].
    builder := ToolBuilder default.
    spec := self buildNotifierWith: builder label: label message: msg.
    self expandStack.
    builder open1: spec.
    errorWasInUIProcess := Project spawnNewProcessIfThisIsUI: interruptedProcess.
! !


!Debugger class methodsFor: 'opening' stamp: 'fm 9/8/2010 02:02'!
openOn: process context: context label: title contents: contentsStringOrNil fullView: bool
    "Open a notifier in response to an error, halt, or notify. A notifier view just shows a short view of the sender
stack and provides a menu that lets the user open a full debugger."

    | controller errorWasInUIProcess debugger |
    Smalltalk isMorphic
        ifTrue: [errorWasInUIProcess := Project spawnNewProcessIfThisIsUI: process]
        ifFalse: [controller := ScheduledControllers activeControllerProcess == process
                ifTrue: [ScheduledControllers activeController].
                debugger := self new process: process controller: controller context: context.
                bool
                        ifTrue: [debugger openFullNoSuspendLabel: title]
                        ifFalse: [debugger openNotifierContents: contentsStringOrNil label: title]].
    WorldState addDeferredUIMessage: [
        [
            debugger := self new process: process controller: controller context: context.
            Smalltalk isMorphic
                ifTrue: ["schedule debugger in deferred UI message to address redraw
                        problems after opening a debugger e.g. from the testrunner."
                    "WorldState addDeferredUIMessage: "
                    bool
                        ifTrue: [debugger openFullNoSuspendLabel: title]
                        ifFalse: [debugger openNotifierContents: contentsStringOrNil label: title]]
                ifFalse: ["deferred UI message would require special controller in MVC"
                    bool
                        ifTrue: [debugger openFullNoSuspendLabel: title]
                        ifFalse: [debugger openNotifierContents: contentsStringOrNil label: title]].
            debugger errorWasInUIProcess: errorWasInUIProcess.
            Preferences logDebuggerStackToFile ifTrue: [
                Smalltalk logError: title inContext: context to: 'SqueakDebug.log'].
            Smalltalk isMorphic
                ifFalse: [ScheduledControllers searchForActiveController "needed since openNoTerminate (see debugger
#open...) does not set up activeControllerProcess if activeProcess (this fork) is not the current
activeControllerProcess (see #scheduled:from:)"].
        ] on: Error do: [:ex |
            self primitiveError:
                'Orginal error: ',
                title asString, '.
    Debugger error: ',
                ([ex description] on: Error do: ['a ', ex class printString]), ':'
        ]
    ].
    process suspend.
! !


!MVCToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:39'!
open1: anObject
    "Build and open the object. Answer the widget opened."
    | window |
    window := self build: anObject.
    window controller openNoTerminate.
    ^window! !

!MVCToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:41'!
open1: anObject label: aString
    "Build an open the object, labeling it appropriately.  Answer the widget opened."
    | window |
    window := self build: anObject.
    window label: aString.
    window controller openNoTerminate.
    ^window! !

!MVCToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:22'!
open: anObject
    "Build and open the object. Answer the widget opened."
    | window |
    window := self build: anObject.
    window controller open.
    ^window! !

!MVCToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:23'!
open: anObject label: aString
    "Build an open the object, labeling it appropriately.  Answer the widget opened."
    | window |
    window := self build: anObject.
    window label: aString.
    window controller open.
    ^window! !


!MorphicToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:39'!
open1: anObject
    "Build and open the object. Answer the widget opened."
    | morph |
    anObject isMorph
        ifTrue:[morph := anObject]
        ifFalse:[morph := self build: anObject].
    (morph isKindOf: MenuMorph)
        ifTrue:[morph popUpInWorld: World].
    (morph isKindOf: SystemWindow)
        ifTrue:[morph openInWorldExtent: morph extent]
        ifFalse:[morph openInWorld].
    ^morph! !

!MorphicToolBuilder methodsFor: 'opening' stamp: 'fm 9/8/2010 01:41'!
open1: anObject label: aString
    "Build an open the object, labeling it appropriately.  Answer the widget opened."
    | window |
    window := self open: anObject.
    window setLabel: aString.
    ^window! !


!ToolBuilder class methodsFor: 'accessing' stamp: 'fm 9/8/2010 02:28'!
default: aToolBuilder
    "Set a new default tool builder"
    aToolBuilder isNil ifTrue: [Processor activeProcess debug].
    Default := aToolBuilder.! !

!ToolBuilder class methodsFor: 'instance creation' stamp: 'fm 9/8/2010 02:10'!
open1: aClass label: aString
    ^self default open1: aClass label: aString! !


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20100908/93268027/attachment.htm


More information about the Squeak-dev mailing list