[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
|