Bob,
thank you!! morphicOpenOn:context:label:contents:fullView: is indeed the method in question. So if one moves the ErrorRecursion := false outside of the addDeferredUIMessage: block everything works. i.e. now the code reads:
Project current addDeferredUIMessage: [ debugger := self new process: process controller: nil context: context. full ifTrue: [ debugger openFullNoSuspendLabel: title ] ifFalse: [ debugger openNotifierContents: contentsStringOrNil label: title ]. debugger errorWasInUIProcess: errorWasInUIProcess. "Try drawing the debugger tool at least once to avoid freeze." Project current world displayWorldSafely]. ErrorRecursion := false ].
and the old code doesn't work:
Project current addDeferredUIMessage: [ debugger := self new process: process controller: nil context: context. full ifTrue: [ debugger openFullNoSuspendLabel: title ] ifFalse: [ debugger openNotifierContents: contentsStringOrNil label: title ]. debugger errorWasInUIProcess: errorWasInUIProcess. "Try drawing the debugger tool at least once to avoid freeze." Project current world displayWorldSafely. ErrorRecursion := false ]].
So there question is, what are the tests for the ErrorGuard and ErrorRecursion? I need to run these before committing the fix above.
Bob, way to go! Thank you.
On Wed, Jan 24, 2018 at 3:52 PM, Bob Arning arning315@comcast.net wrote:
I tried this in 5.1 and it worked
Debugger class>>
morphicOpenOn: process context: context label: title contents: contentsStringOrNil fullView: full "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."
| errorWasInUIProcess debugger | ErrorRecursion ifTrue: [ "self assert: process == Project current uiProcess --
DOCUMENTATION ONLY" ErrorRecursion := false. "^ Project current handleFatalDrawingError: title"]. <============commented this out ...
On 1/24/18 6:31 PM, Eliot Miranda wrote:
Hi All,
I'm comparing two close copies of a class in attempting a complex
refactoring, comparing the original code with the close copy. In doing this I need to open up two debuggers to step through the two computations simultaneously. If I try it this way, where the two JITs break at a particular bytecode:
[:m :opts| [StackToRegisterMappingCogit cog: m options: opts] fork. Processor yield. AltStackToRegisterMappingCogit cog: m options: opts] value: TabbedPalette class>>#unload value: #(ObjectMemory Spur64BitCoMemoryManager debugBytecodePointers #(59) compilationTrace 0).
I get an emergency evaluator :-(, and if I type restart I only ever get one debugger. What's the right way to do this?
To boil down the example I need this to work:
[1 halt] fork. Processor yield. 2 halt
i.e. I want to be able to get two debuggers, one open on 1 halt, and the other on 2 halt. _,,,^..^,,,_ best, Eliot