Add `VDBStartupA` into `jv:vdb/application`
This class is just a placeholder, all logic is in its superclass,
`VDBStatup`. The reason for this is the way the initial package
path is computed (see `AbstractOpratingSystem >> defaultPackagePath`)
The code there assumes that startup class is from the same package
as the application itself.
This way, we have a startup class in the application package but still
have `VDBStartup` available when only `jv:vdb` is loaded (like when
developing and.or using VDB from Smalltalk/X IDE.
"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany
This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'
You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
"{ Package: 'jv:vdb' }"
"{ NameSpace: Smalltalk }"
VDBAbstractApplication subclass:#VDBDebuggerApplication
instanceVariableNames:'layoutSpecHolder selectedThreadGroupHolder selectedThreadHolder
selectedFrameHolder canExecRestartHolder canExecResumeHolder
canExecRunHolder canExecStepIntoHolder canExecStepOverHolder
canExecStepReturnHolder canExecSuspendHolder
canExecTerminateHolder canExecBackIntoHolder
canExecBackOverHolder canExecBackReturnHolder
canExecReverseHolder targetIsRR'
classVariableNames:''
poolDictionaries:'GDBStopReasons'
category:'VDB-UI'
!
!VDBDebuggerApplication class methodsFor:'documentation'!
copyright
"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany
This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'
You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
! !
!VDBDebuggerApplication class methodsFor:'initialization'!
initializeDefaultKeyboardMap
defaultKeyboardMap := DebugView defaultKeyboardMap copy.
defaultKeyboardMap bindValue: #DebuggerRestart to: ('Ctrl', (defaultKeyboardMap bindingForLogical: #DebuggerContinue)) asSymbol.
"Created: / 05-06-2017 / 23:01:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 11-06-2017 / 20:08:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication class methodsFor:'accessing - defaults'!
gdbUserInitFile
"Return path to user-specific GDB init file (as Filename)."
| gdbinit |
gdbinit := Filename homeDirectory / '.gdbinit'.
(gdbinit exists not and:[ (Filename homeDirectory / 'gdb.ini') exists ]) ifTrue:[
gdbinit := Filename homeDirectory / 'gdb.ini'
].
^ gdbinit
"
VDBDebuggerApplication gdbUserInitFile
"
"Created: / 20-06-2019 / 11:46:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
vdbDefaultInitFile
"Return path to default system VDB init file (as Filename).
This one is used when user init file is not found, see
#gdbUserInitFile"
| pkgdir |
pkgdir := Smalltalk getPackageDirectoryForPackage: self package.
^ pkgdir / 'vdbinit.st'
"
VDBDebuggerApplication vdbDefaultInitFile
"
"Created: / 20-06-2019 / 11:52:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
vdbUserInitFile
"Return path to user-specific VDB init file (as Filename).
Use this to customize VDB upon startup.
"
^ Filename homeDirectory / '.vdbinit.st'.
"
VDBDebuggerApplication vdbUserInitFile
"
"Created: / 31-08-2018 / 07:03:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (comment): / 20-06-2019 / 12:05:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication class methodsFor:'interface opening'!
open
^ self openFor: GDBDebugger new.
"Created: / 23-09-2014 / 16:39:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication class methodsFor:'interface specs'!
windowSpec
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this!! If it is corrupted,
the UIPainter may not be able to read the specification."
"
UIPainter new openOnClass:VDBDebuggerApplication andSelector:#windowSpec
VDBDebuggerApplication new openInterface:#windowSpec
VDBDebuggerApplication open
"
<resource: #canvas>
^
#(FullSpec
name: windowSpec
uuid: '5f867d40-3168-11e9-8b55-606720e43e2c'
window:
(WindowSpec
label: 'Visual/VM Debugger'
name: 'Visual/VM Debugger'
uuid: '03126dd1-3168-11e9-8b55-606720e43e2c'
min: (Point 10 10)
bounds: (Rectangle 0 0 800 600)
menu: mainMenu
)
component:
(SpecCollection
collection: (
(MenuPanelSpec
name: 'ToolBar'
layout: (LayoutFrame 0 0 0 0 0 1 25 0)
uuid: '03126dd2-3168-11e9-8b55-606720e43e2c'
menu: toolbarMenu
textDefault: true
)
(SubCanvasSpec
name: 'Layout'
layout: (LayoutFrame 0 0 25 0 0 1 -30 1)
uuid: '03126dd3-3168-11e9-8b55-606720e43e2c'
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
specHolder: layoutSpecHolder
createNewBuilder: false
)
(SubCanvasSpec
name: 'Status'
layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
uuid: '03126dd4-3168-11e9-8b55-606720e43e2c'
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBStatusApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
)
createNewApplication: true
createNewBuilder: false
)
)
)
)
! !
!VDBDebuggerApplication class methodsFor:'interface specs-layouts'!
layoutEclipseSpec
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this!! If it is corrupted,
the UIPainter may not be able to read the specification."
"
UIPainter new openOnClass:VDBDebuggerApplication andSelector:#layoutEclipseSpec
VDBDebuggerApplication new openInterface:#layoutEclipseSpec
"
<resource: #canvas>
^
#(FullSpec
name: layoutEclipseSpec
window:
(WindowSpec
label: 'Visual Debugger'
name: 'Visual Debugger'
min: (Point 10 10)
bounds: (Rectangle 0 0 718 390)
menu: mainMenu
)
component:
(SpecCollection
collection: (
(VariableVerticalPanelSpec
name: 'VariableVerticalPanel'
layout: (LayoutFrame 0 0 0 0 0 1 0 1)
showHandle: true
snapMode: both
component:
(SpecCollection
collection: (
(VariableHorizontalPanelSpec
name: 'StackAndFrameCanvas'
snapMode: both
component:
(SpecCollection
collection: (
(SubCanvasSpec
name: 'StackCanvas'
level: 0
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBStackApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: selectedFrameHolder
aspect: selectedFrameHolder
)
(SubChannelInfoSpec
subAspect: selectedThreadGroupHolder
aspect: selectedThreadGroupHolder
)
(SubChannelInfoSpec
subAspect: selectedThreadHolder
aspect: selectedThreadHolder
)
)
createNewApplication: true
createNewBuilder: true
)
(SubCanvasSpec
name: 'FrameCanvas'
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
majorKey: VDBFrameApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
(SubChannelInfoSpec
subAspect: frameHolder
aspect: selectedFrameHolder
)
)
createNewApplication: true
createNewBuilder: true
)
)
)
handles: (Any 0.5 1.0)
)
(SubCanvasSpec
name: 'SourcePane'
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBSourceAndDisassemblyApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: frameHolder
aspect: selectedFrameHolder
)
)
createNewApplication: true
createNewBuilder: true
)
(SubCanvasSpec
name: 'ConsolePane'
level: 0
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
clientHolder: consolePane
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
)
createNewApplication: true
createNewBuilder: true
)
)
)
handles: (Any 0.33333333333333337 0.66666666666666674 1.0)
)
)
)
)
"Modified: / 04-10-2018 / 11:08:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
layoutIDAProSpec
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this!! If it is corrupted,
the UIPainter may not be able to read the specification."
"
UIPainter new openOnClass:VDBDebuggerApplication andSelector:#layoutIDASpec
VDBDebuggerApplication new openInterface:#layoutIDASpec
"
<resource: #canvas>
^
#(FullSpec
name: 'layoutIDASpec'
uuid: 'a436edc0-c61b-11e8-8890-0021ccd5e3d3'
window:
(WindowSpec
label: 'Visual Debugger'
name: 'Visual Debugger'
uuid: 'a43714d0-c61b-11e8-8890-0021ccd5e3d3'
min: (Point 10 10)
bounds: (Rectangle 0 0 718 390)
menu: mainMenu
)
component:
(SpecCollection
collection: (
(VariableHorizontalPanelSpec
name: 'Contents'
layout: (LayoutFrame 0 0 0 0 0 1 0 1)
uuid: 'a43714d1-c61b-11e8-8890-0021ccd5e3d3'
snapMode: both
component:
(SpecCollection
collection: (
(VariableVerticalPanelSpec
name: 'SourceAndConsole'
uuid: 'a43714d2-c61b-11e8-8890-0021ccd5e3d3'
snapMode: both
component:
(SpecCollection
collection: (
(SubCanvasSpec
name: 'Source'
uuid: 'a43714d3-c61b-11e8-8890-0021ccd5e3d3'
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBSourceAndDisassemblyApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: frameHolder
aspect: selectedFrameHolder
)
)
createNewApplication: true
createNewBuilder: true
)
(SubCanvasSpec
name: 'ConsolePane'
uuid: 'a43714d4-c61b-11e8-8890-0021ccd5e3d3'
level: 0
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
clientHolder: consolePane
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
)
createNewApplication: true
createNewBuilder: true
)
)
)
handles: (Any 0.75 1.0)
)
(VariableVerticalPanelSpec
name: 'FrameAndThreads'
uuid: 'a43714d5-c61b-11e8-8890-0021ccd5e3d3'
snapMode: both
component:
(SpecCollection
collection: (
(SubCanvasSpec
name: 'Frame'
uuid: 'a43714d6-c61b-11e8-8890-0021ccd5e3d3'
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBFrameApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
(SubChannelInfoSpec
subAspect: frameHolder
aspect: selectedFrameHolder
)
)
createNewApplication: true
createNewBuilder: true
)
(SubCanvasSpec
name: 'StackCanvas'
uuid: 'a43714d7-c61b-11e8-8890-0021ccd5e3d3'
level: 0
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
majorKey: VDBStackApplication
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: selectedFrameHolder
aspect: selectedFrameHolder
)
(SubChannelInfoSpec
subAspect: selectedThreadGroupHolder
aspect: selectedThreadGroupHolder
)
(SubChannelInfoSpec
subAspect: selectedThreadHolder
aspect: selectedThreadHolder
)
)
createNewApplication: true
createNewBuilder: true
)
)
)
handles: (Any 0.5 1.0)
)
)
)
handles: (Any 0.7 1.0)
)
)
)
)
"Created: / 05-10-2018 / 09:13:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
layoutSingleSpec
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this!! If it is corrupted,
the UIPainter may not be able to read the specification."
"
UIPainter new openOnClass:VDBDebuggerApplication andSelector:#layoutSingleSpec
VDBDebuggerApplication new openInterface:#layoutSingleSpec
"
<resource: #canvas>
^
#(FullSpec
name: layoutSingleSpec
uuid: '6229e7e0-c7bd-11e8-8f9c-0021ccd5e3d3'
window:
(WindowSpec
label: 'Visual Debugger'
name: 'Visual Debugger'
uuid: '6229e7e1-c7bd-11e8-8f9c-0021ccd5e3d3'
min: (Point 10 10)
bounds: (Rectangle 0 0 718 390)
menu: mainMenu
)
component:
(SpecCollection
collection: (
(SubCanvasSpec
name: 'ConsolePane'
layout: (LayoutFrame 0 0 0 0 0 1 0 1)
uuid: '6229e7e2-c7bd-11e8-8f9c-0021ccd5e3d3'
level: 0
hasHorizontalScrollBar: false
hasVerticalScrollBar: false
clientHolder: consolePane
subAspectHolders:
(Array
(SubChannelInfoSpec
subAspect: debuggerHolder
aspect: debuggerHolder
)
)
createNewApplication: true
createNewBuilder: true
)
)
)
)
! !
!VDBDebuggerApplication class methodsFor:'menu specs'!
execMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:VDBDebuggerApplication andSelector:#execMenu
(Menu new fromLiteralArrayEncoding:(VDBDebuggerApplication execMenu)) startUp
"
<resource: #menu>
^
#(Menu
(
(MenuItem
enabled: canExecRunHolder
label: 'Run'
itemValue: doExecRun
isVisible: true
labelImage: (ResourceRetriever VDBIconLibrary actionRun16x16 'Run')
)
(MenuItem
enabled: canExecResumeHolder
label: 'Resume'
itemValue: doExecResume
isVisible: true
shortcutKey: DebuggerContinue
labelImage: (ResourceRetriever VDBIconLibrary actionContinue16x16 'Resume')
)
(MenuItem
enabled: canExecSuspendHolder
label: 'Suspend'
itemValue: doExecSuspend
isVisible: true
labelImage: (ResourceRetriever VDBIconLibrary actionStop16x16 'Suspend')
)
(MenuItem
enabled: canExecTerminateHolder
label: 'Terminate'
itemValue: doExecTerminate
isVisible: true
labelImage: (ResourceRetriever VDBIconLibrary actionTerminate6x16 'Terminate')
)
(MenuItem
enabled: canExecRestartHolder
label: 'Restart'
itemValue: doExecRestart
isVisible: true
shortcutKey: DebuggerRestart
labelImage: (ResourceRetriever VDBIconLibrary actionTerminateAndRun6x16 'Restart')
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canExecStepOverHolder
label: 'Step Over'
itemValue: doExecStepOver
isVisible: true
shortcutKey: DebuggerNext
labelImage: (ResourceRetriever VDBIconLibrary actionStepOver6x16 'Step Over')
)
(MenuItem
enabled: canExecStepIntoHolder
label: 'Step Into'
itemValue: doExecStepInto
isVisible: true
shortcutKey: DebuggerSend
labelImage: (ResourceRetriever VDBIconLibrary actionStepInto6x16 'Step Into')
)
(MenuItem
enabled: canExecStepReturnHolder
label: 'Step Return'
itemValue: doExecStepReturn
isVisible: true
shortcutKey: DebuggerReturn
labelImage: (ResourceRetriever VDBIconLibrary actionStepReturn6x16 'Step Return')
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canExecBackOverHolder
label: 'Back Over'
itemValue: doExecBackOver
isVisible: true
shortcutKey: DebuggerBackOver
)
(MenuItem
enabled: canExecBackIntoHolder
label: 'Back Into'
itemValue: doExecBackInto
isVisible: true
shortcutKey: DebuggerBackInto
)
(MenuItem
enabled: canExecBackReturnHolder
label: 'Back Return'
itemValue: doExecBackReturn
isVisible: true
shortcutKey: DebuggerBackReturn
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canExecReverseHolder
label: 'Reverse'
itemValue: doExecReverse
isVisible: true
shortcutKey: DebuggerBackReturn
)
(MenuItem
label: '-'
)
(MenuItem
label: 'Pin Menu'
itemValue: doPinMenuAs:item:
isVisible: true
labelImage: (ResourceRetriever VDBIconLibrary pin 'Pin Menu')
argument: 'Execute'
)
)
nil
nil
)
!
mainMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:VDBDebuggerApplication andSelector:#mainMenu
(Menu new fromLiteralArrayEncoding:(VDBDebuggerApplication mainMenu)) startUp
"
<resource: #menu>
^
#(Menu
(
(MenuItem
label: 'File'
isVisible: true
submenu:
(Menu
(
(MenuItem
label: 'Open Executable'
itemValue: doOpenExecutable
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canAttachToRR
label: 'Attach to Replay Server'
itemValue: doAttachToRR
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
label: 'Preferences'
itemValue: doOpenPreferences
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
label: 'Quit'
itemValue: doQuit
isVisible: true
)
)
nil
nil
)
)
(MenuItem
label: 'Run'
isVisible: true
submenuChannel: execMenu
)
(MenuItem
label: 'View'
isVisible: true
submenu:
(Menu
(
(MenuItem
label: 'Eclipse Layout'
isVisible: true
choice: layoutSpecHolder
choiceValue: layoutEclipseSpec
)
(MenuItem
label: 'IDA Pro Layout'
isVisible: true
choice: layoutSpecHolder
choiceValue: layoutIDAProSpec
)
(MenuItem
label: 'Console-Only Layout'
isVisible: true
choice: layoutSpecHolder
choiceValue: layoutSingleSpec
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canViewEnableFrameFilters
label: 'Enable Frame Filters'
itemValue: doViewEnableFrameFilters
isVisible: true
)
(MenuItem
enabled: canViewEnablePrettyPrinting
label: 'Enable Pretty Printing'
itemValue: doViewEnablePrettyPrinting
isVisible: true
)
)
nil
nil
)
)
(MenuItem
label: 'Window'
isVisible: true
submenu:
(Menu
(
(MenuItem
label: 'Scratch Pad'
itemValue: doOpenScatchPad
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
label: 'Callstack'
itemValue: doOpenToolApplicationClass:
isVisible: true
argument: VDBStackApplication
)
(MenuItem
label: 'Variables'
itemValue: doOpenToolVariables
isVisible: true
)
(MenuItem
label: 'Registers'
itemValue: doOpenToolRegisters
isVisible: true
)
(MenuItem
label: 'Disassembly'
itemValue: doOpenToolDIsassembly
isVisible: true
)
(MenuItem
label: 'Breakpoints'
itemValue: doOpenToolApplicationClass:
isVisible: true
argument: VDBBreakpointListApplication
)
(MenuItem
label: 'Memory'
itemValue: doOpenToolApplicationClass:
isVisible: true
argument: VDBMemoryApplication
)
)
nil
nil
)
)
(MenuItem
label: 'Debug'
startGroup: right
isVisible: true
submenu:
(Menu
(
(MenuItem
label: 'Inspect Debugger'
itemValue: doInspectDebugger
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
label: 'Reopen'
itemValue: doDebugReopenDebugger
isVisible: true
)
(MenuItem
label: 'Launcher'
itemValue: doDebugReopenLauncher
isVisible: true
)
(MenuItem
label: '-'
isVisible: true
)
(MenuItem
enabled: canDebugOpenAndAttachToGDB
label: 'Open & Attach to GDB Process'
itemValue: doDebugOpenAndAttachToGDB
isVisible: true
)
)
nil
nil
)
)
)
nil
nil
)
!
toolbarMenu
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:VDBDebuggerApplication andSelector:#toolbarMenu
(Menu new fromLiteralArrayEncoding:(VDBDebuggerApplication toolbarMenu)) startUp
"
<resource: #menu>
^
#(Menu
(
(MenuItem
label: 'Exec Slice'
submenuChannel: toolbarMenuExecSlice
isMenuSlice: true
)
)
nil
nil
)
!
toolbarMenuExecSlice
"This resource specification was automatically generated
by the MenuEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the MenuEditor may not be able to read the specification."
"
MenuEditor new openOnClass:VDBDebuggerApplication andSelector:#toolbarMenuExecSlice
(Menu new fromLiteralArrayEncoding:(VDBDebuggerApplication toolbarMenuExecSlice)) startUp
"
<resource: #menu>
^
#(Menu
(
(MenuItem
enabled: canExecRunHolder
label: 'Run'
itemValue: doExecRun
labelImage: (ResourceRetriever VDBIconLibrary actionRun16x16)
)
(MenuItem
enabled: canExecResumeHolder
label: 'Resume'
itemValue: doExecResume
labelImage: (ResourceRetriever VDBIconLibrary actionContinue16x16)
)
(MenuItem
enabled: canExecSuspendHolder
label: 'Suspend'
itemValue: doExecSuspend
labelImage: (ResourceRetriever VDBIconLibrary actionStop16x16)
)
(MenuItem
enabled: canExecTerminateHolder
label: 'Terminate'
itemValue: doExecTerminate
labelImage: (ResourceRetriever VDBIconLibrary actionTerminate6x16)
)
(MenuItem
label: '-'
)
(MenuItem
enabled: canExecStepOverHolder
label: 'Step Over'
itemValue: doExecStepOver
labelImage: (ResourceRetriever VDBIconLibrary actionStepOver6x16)
)
(MenuItem
enabled: canExecStepIntoHolder
label: 'Step Into'
itemValue: doExecStepInto
labelImage: (ResourceRetriever VDBIconLibrary actionStepInto6x16)
)
(MenuItem
enabled: canExecStepReturnHolder
label: 'Step Return'
itemValue: doExecStepReturn
labelImage: (ResourceRetriever VDBIconLibrary actionStepReturn6x16)
)
)
nil
nil
)
! !
!VDBDebuggerApplication class methodsFor:'plugIn spec'!
aspectSelectors
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this. If it is corrupted,
the UIPainter may not be able to read the specification."
"Return a description of exported aspects;
these can be connected to aspects of an embedding application
(if this app is embedded in a subCanvas)."
^ #(
#debuggerHolder
#selectedFrameHolder
#selectedThreadGroupHolder
#selectedThreadHolder
).
! !
!VDBDebuggerApplication methodsFor:'accessing'!
currentThreadGroup
"Return 'current' thread group (inferior) or nil. 'Current' thread group is
either the selected one or, if none's selected or the only one thread group
(if there's only one)"
| tg |
tg := self selectedThreadGroup.
tg isNil ifTrue:[
| tgs |
tgs := debugger inferiors.
tgs size == 1 ifTrue:[
tg := tgs anyOne.
].
].
^ tg.
"Created: / 03-07-2017 / 06:58:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
layout: layoutSpecSymbol
"Set the desired debugger window layout. For list of
available layouts, see class protocol 'insterface specs - layouts'
"
| layoutSpec |
"/ Validate `layoutSpecSymbol`
(self class respondsTo: layoutSpecSymbol) ifFalse:[
self error: ('Unsupported layout: %1' bindWith: layoutSpecSymbol).
^ self.
].
layoutSpec := self class perform: layoutSpecSymbol.
(layoutSpec isCollection not or:[ layoutSpec first ~~ #FullSpec ]) ifTrue:[
self error: ('Invalid layout (not an UI spec) %1' bindWith: layoutSpecSymbol).
^ self.
].
self layoutSpecHolder value: layoutSpecSymbol
"Created: / 20-06-2019 / 13:08:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
selectedThreadGroup
^ self selectedThreadGroupHolder value
"Created: / 03-07-2017 / 06:51:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'aspects'!
layoutSpecHolder
"return/create the 'layoutSpecHolder' value holder (automatically generated)"
layoutSpecHolder isNil ifTrue:[
layoutSpecHolder := ValueHolder with: #layoutEclipseSpec
].
^ layoutSpecHolder
"Modified: / 18-06-2019 / 11:06:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
selectedFrameHolder
"return/create the 'selectionHolder' value holder (automatically generated)"
selectedFrameHolder isNil ifTrue:[
selectedFrameHolder := ValueHolder new.
selectedFrameHolder addDependent:self.
].
^ selectedFrameHolder
"Created: / 21-09-2014 / 23:51:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
selectedFrameHolder:aValueModel
"set the 'selectionHolder' value holder (automatically generated)"
|oldValue newValue|
selectedFrameHolder notNil ifTrue:[
oldValue := selectedFrameHolder value.
selectedFrameHolder removeDependent:self.
].
selectedFrameHolder := aValueModel.
selectedFrameHolder notNil ifTrue:[
selectedFrameHolder addDependent:self.
].
newValue := selectedFrameHolder value.
oldValue ~~ newValue ifTrue:[
self update:#value with:newValue from:selectedFrameHolder.
].
"Created: / 21-09-2014 / 23:50:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
selectedThreadGroupHolder
"return/create the 'selectedThreadGroupHolder' value holder (automatically generated)"
selectedThreadGroupHolder isNil ifTrue:[
selectedThreadGroupHolder := ValueHolder new.
selectedThreadGroupHolder addDependent:self.
].
^ selectedThreadGroupHolder
!
selectedThreadGroupHolder:something
"set the 'selectedThreadGroupHolder' value holder (automatically generated)"
|oldValue newValue|
selectedThreadGroupHolder notNil ifTrue:[
oldValue := selectedThreadGroupHolder value.
selectedThreadGroupHolder removeDependent:self.
].
selectedThreadGroupHolder := something.
selectedThreadGroupHolder notNil ifTrue:[
selectedThreadGroupHolder addDependent:self.
].
newValue := selectedThreadGroupHolder value.
oldValue ~~ newValue ifTrue:[
self update:#value with:newValue from:selectedThreadGroupHolder.
].
!
selectedThreadHolder
"return/create the 'selectedThreadHolder' value holder (automatically generated)"
selectedThreadHolder isNil ifTrue:[
selectedThreadHolder := ValueHolder new.
selectedThreadHolder addDependent:self.
].
^ selectedThreadHolder
!
selectedThreadHolder:something
"set the 'selectedThreadHolder' value holder (automatically generated)"
|oldValue newValue|
selectedThreadHolder notNil ifTrue:[
oldValue := selectedThreadHolder value.
selectedThreadHolder removeDependent:self.
].
selectedThreadHolder := something.
selectedThreadHolder notNil ifTrue:[
selectedThreadHolder addDependent:self.
].
newValue := selectedThreadHolder value.
oldValue ~~ newValue ifTrue:[
self update:#value with:newValue from:selectedThreadHolder.
].
! !
!VDBDebuggerApplication methodsFor:'aspects-panes'!
consolePane
| pane useUnixConsole |
pane := VDBTabbingContainer new.
debugger notNil ifTrue:[
useUnixConsole := debugger consoleOutput notNil and:[ debugger consoleInput notNil ]
] ifFalse:[
useUnixConsole := OperatingSystem isUNIXlike.
].
useUnixConsole ifTrue:[
pane addApplication:VDBUnixDebuggerConsoleApplication new.
pane addApplication:VDBUnixInferiorConsoleApplication new.
] ifFalse:[
pane addApplication:VDBSimpleDebuggerConsoleApplication new.
].
pane addApplication:VDBEventLogApplication new.
^ pane
"Created: / 04-10-2018 / 11:08:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-12-2018 / 22:43:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'change & update'!
update:aspect with:parameter from:sender
"Invoked when an object that I depend upon sends a change notification."
"stub code automatically generated - please change as required"
sender == selectedThreadGroupHolder ifTrue:[
self updateAfterSelectedThreadGroupHolderChanged.
].
sender == selectedFrameHolder ifTrue:[
self updateAfterSelectedFrameHolderChanged.
].
super update:aspect with:parameter from:sender
"Modified: / 01-06-2017 / 23:34:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
updateAfterSelectedFrameHolderChanged
| frame |
frame := selectedFrameHolder value.
frame notNil ifTrue:[
debugger
send:(GDBMI_thread_select new arguments:(Array with:frame thread id))
andWait:false.
debugger
send:(GDBMI_stack_select_frame new arguments:(Array with:frame level))
andWait:false.
].
"Created: / 27-02-2015 / 13:24:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 19-06-2019 / 16:15:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 20-06-2019 / 10:07:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
updateAfterSelectedThreadGroupHolderChanged
self updateButtonEnablements
"Created: / 01-06-2017 / 23:34:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
updateButtonEnablements
| inferior inferiorIsStopped inferiorIsRunning canReverse hasAsync |
inferior := self currentThreadGroup.
inferiorIsStopped := inferior notNil and:[ inferior isStopped ].
inferiorIsRunning := inferior notNil and:[ inferior isRunning ].
canReverse := debugger hasFeature: 'reverse'.
hasAsync := debugger hasFeature: 'async'.
self canExecResumeHolder value: inferiorIsRunning & inferiorIsStopped .
self canExecStepIntoHolder value: inferiorIsRunning & inferiorIsStopped.
self canExecStepOverHolder value: inferiorIsRunning & inferiorIsStopped.
self canExecStepReturnHolder value: inferiorIsRunning & inferiorIsStopped.
self canExecSuspendHolder value: hasAsync & inferiorIsRunning & inferiorIsStopped not.
self canExecBackIntoHolder value: inferiorIsRunning & inferiorIsStopped & canReverse.
self canExecBackOverHolder value: inferiorIsRunning & inferiorIsStopped & canReverse.
self canExecBackReturnHolder value: inferiorIsRunning & inferiorIsStopped & canReverse.
self canExecReverseHolder value: inferiorIsRunning & inferiorIsStopped & canReverse.
self canExecTerminateHolder value: inferiorIsRunning & (hasAsync | inferiorIsStopped).
self canExecRestartHolder value: hasAsync.
self canExecRunHolder value: ( inferiorIsRunning not ).
"Created: / 01-06-2017 / 23:18:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 26-03-2018 / 21:31:41 / jv"
"Modified: / 30-07-2018 / 08:57:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'event handling'!
onCommandResultEvent: aGDBStoppedEvent
self updateButtonEnablements
"Created: / 01-06-2017 / 23:43:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onExitEvent: aGDBExitEvent
"/ Check if GDB terminateg gracefully, if not,
"/ show warning and allow user to inspect the
"/ record.
"/
"/ Yes, even GDB has bugs and crashes.
aGDBExitEvent status status == #signal ifTrue:[
(Dialog confirm:
(resources stringWithCRs: 'GDB terminated by signal %1 (%2)\Show MI trace?'
with: aGDBExitEvent status code
with:(OperatingSystem nameForSignal: aGDBExitEvent status code)))
ifTrue:[ aGDBExitEvent trace inspect ]
].
self closeDownViews
"Created: / 01-06-2017 / 13:42:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 28-05-2018 / 23:00:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onLogOutputEvent:aGDBLogOutputEvent
debugger notNil ifTrue:[
Transcript nextPutAll: aGDBLogOutputEvent value.
Transcript isView ifTrue:[
| flasher |
flasher := [
debugger announcer unsubscribe: flasher.
Transcript topView raise; flash.
].
debugger announcer when: GDBEventSetProcessingFinished do: flasher
].
]
"Created: / 02-02-2018 / 11:46:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 14-12-2018 / 09:26:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onRRExitEvent: anRRExitEvent
targetIsRR := false.
anRRExitEvent rr announcer unsubscribe: self.
"Created: / 03-08-2018 / 13:29:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 31-08-2018 / 22:50:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onRRStartEvent: anRRStartEvent
"Created: / 03-08-2018 / 13:38:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onRunningEvent: aGDBStoppedEvent
self updateButtonEnablements
"Created: / 21-09-2014 / 22:44:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-06-2017 / 23:18:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onStoppedEvent: aGDBStoppedEvent
self updateButtonEnablements
"Created: / 21-09-2014 / 22:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-06-2017 / 23:18:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onThreadGroupExitedEvent: aGDBStoppedEvent
self updateButtonEnablements
"Created: / 21-09-2014 / 22:45:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-06-2017 / 23:41:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
onThreadSelectedEvent: aGDBThreadSelectedEvent
| frame thread group |
frame := aGDBThreadSelectedEvent frame.
thread := aGDBThreadSelectedEvent thread.
group := aGDBThreadSelectedEvent threadGroup.
self selectedFrameHolder withoutUpdating: self do: [
self selectedFrameHolder value: frame.
].
self selectedThreadHolder withoutUpdating: self do: [
self selectedThreadHolder value: thread.
].
self selectedThreadGroupHolder withoutUpdating: self do: [
self selectedThreadGroupHolder value: group.
].
"Created: / 30-07-2018 / 07:33:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 19-06-2019 / 17:20:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'initialization'!
initializeKeyboardMap
| mapping |
super initializeKeyboardMap.
#(
DebuggerBackOver DebuggerNext
DebuggerBackInto DebuggerSend
DebuggerBackReturn DebuggerReturn
) pairWiseDo: [:backwardKey :forwardKey |
((keyboardMap hasMappingFor: backwardKey) not
and:[ (mapping := keyboardMap bindingForLogical: forwardKey) notNil
and:[ (mapping includesString:'Ctrl') not]]) ifTrue:[
keyboardMap bindValue: backwardKey to: ('Ctrl', mapping) asSymbol
].
]
"Created: / 14-03-2018 / 11:28:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'initialization & release'!
commonPostOpen
self updateButtonEnablements
"Created: / 05-06-2017 / 22:50:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
release
"remove all dependencies from the receiver"
super release.
self unsubscribe.
(debugger notNil and:[debugger isConnected]) ifTrue:[
debugger send: GDBMI_gdb_exit new andWait: false.
].
"Created: / 01-06-2017 / 13:41:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-06-2017 / 12:48:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
subscribe
"Register for debugger events. To be overrided by subclasses"
| init |
"/ Load VDB support
debugger pythonImportVDB.
"/ Read init file
init := self class vdbUserInitFile.
init exists ifFalse:[
init := self class vdbDefaultInitFile
].
init exists ifTrue:[
[
[
Workspace workspaceVariableAt: 'vdb' put: self.
init fileIn.
] ensure:[
Workspace workspaceVariables removeKey: 'vdb'.
].
] on: Error do:[:ex |
Transcript
showCR: ('Error while reading VGB init file (%1)' bindWith: init pathName);
showCR: ('Description: %1' bindWith: ex description);
showCR: ('Backtrace:');
cr.
ex suspendedContext fullPrintAllOn: Transcript.
Transcript showCR:'------'.
].
].
debugger announcer
when: GDBStoppedEvent send: #onStoppedEvent: to: self;
when: GDBRunningEvent send: #onRunningEvent: to: self;
when: GDBExitEvent send: #onExitEvent: to: self;
when: GDBCommandResultEvent send: #onCommandResultEvent: to: self;
when: GDBThreadGroupExitedEvent send: #onThreadGroupExitedEvent: to: self;
when: GDBThreadSelectedEvent send: #onThreadSelectedEvent: to: self.
"/ If debugger does provide separate CLI (console) channel, we should handle
"/ LogOutputEvent since these are not printed on CLI channel. This is - for
"/ example - when a python exception occurs when executing MI command.
"/
"/ However, when there's no separate CLI channel, VDB uses emulated (dumb)
"/ console and the console itself handles all log events and print then,
"/
"/ Therefore, only handle log events when there's a CLI channel.
"/ Sigh, this is a mess.
debugger consoleOutput notNil ifTrue:[
debugger announcer
when: GDBLogOutputEvent send: #onLogOutputEvent: to: self.
]
"Created: / 21-09-2014 / 22:43:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 08-07-2019 / 12:09:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'menu actions'!
doAttachToRR
self doAttachToRR: RR replay.
"Modified: / 03-08-2018 / 13:33:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doAttachToRR: rr
rr announcer
when: RRStartEvent send: #onRRStartEvent: to: self;
when: RRExitEvent send: #onRRExitEvent: to: self.
rr start.
(VDBUnixReplayServerConsoleApplication new)
debugger:debugger;
rr:rr;
open.
debugger targetConnectRR:rr.
targetIsRR := true.
"Created: / 03-08-2018 / 13:33:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 31-08-2018 / 22:51:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doDebugOpenAndAttachToGDB
| debuggerOnGDB |
debuggerOnGDB := debugger class newWithProcess: (debugger process class newWithCommand: debugger process command).
self class openFor: debuggerOnGDB.
debuggerOnGDB attach: debugger process id.
"Modified: / 28-03-2019 / 12:42:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doDebugReopenDebugger
| d |
d := debugger.
self unsubscribe.
debugger := nil.
debuggerHolder setValue: nil.
self closeDownViews.
(Smalltalk at: self class name) openFor: d.
"Created: / 20-06-2017 / 20:56:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doDebugReopenLauncher
NewLauncher open
"Created: / 20-06-2017 / 20:58:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doOpenExecutable
| file |
file := Dialog requestFileName:'Selected executable to debug' pattern:'*'.
file isNil ifTrue:[ ^ self ].
file := file asFilename.
debugger send:(GDBMI_file_exec_and_symbols arguments:{ file asString }) andWait:false.
"Modified: / 12-06-2014 / 01:12:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 08-03-2015 / 15:49:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doOpenPreferences
| pathAndClass |
pathAndClass := AbstractLauncherApplication allSettingsList
detect:[:pair | pair second = VDBSettingsApplication name ].
AbstractLauncherApplication openSettingsAndSelect: pathAndClass first
"Modified: / 04-10-2018 / 10:34:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doOpenScatchPad
| notepad |
notepad := VDBScatchPadApplication new.
notepad open.
notepad window label:(resources string:'Scatch Pad')
!
doOpenToolDIsassembly
| application |
application := VDBInstructionListApplication new
debuggerHolder: self debuggerHolder;
disassemblableHolder: self selectedFrameHolder;
frameHolder: self selectedFrameHolder;
yourself.
self doOpenToolApplication: application.
"Modified: / 10-06-2019 / 12:47:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doOpenToolRegisters
| registers application |
registers := (AspectAdaptor forAspect:#registers)
subjectChannel: self selectedFrameHolder.
application := VDBRegisterListApplication new
registerListHolder: registers.
self doOpenToolApplication: application.
"Created: / 27-09-2018 / 21:01:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doOpenToolVariables
| variables application |
variables := (AspectAdaptor forAspect:#variables)
subjectChannel: self selectedFrameHolder.
application := VDBVariableObjectListApplication new
variableObjectListHolder: variables.
self doOpenToolApplication: application.
"Modified: / 27-09-2018 / 20:56:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doQuit
self closeRequest.
"Modified: / 01-06-2017 / 13:46:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doViewEnableFrameFilters
debugger enableFrameFilters.
"Modified (format): / 12-06-2017 / 09:42:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doViewEnablePrettyPrinting
debugger enablePrettyPrinting
"Modified: / 12-06-2017 / 09:42:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'menu actions-exec'!
doExec: command
debugger send: command andWait: false.
"Created: / 21-09-2014 / 21:50:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 26-03-2018 / 17:57:15 / jv"
!
doExecBackInto
self doExec: (GDBMI_exec_step arguments: #('--reverse')).
"Modified: / 13-03-2018 / 10:22:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecBackOver
self doExec: (GDBMI_exec_next arguments: #('--reverse')).
"Modified: / 13-03-2018 / 10:22:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecBackReturn
self doExec: (GDBMI_exec_finish arguments: #('--reverse')).
"Modified: / 13-03-2018 / 10:39:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecRestart
<resource: #uiCallback>
self doExecTerminate; doExecRun.
"Modified: / 11-06-2017 / 20:12:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecResume
self doExec: GDBMI_exec_continue new.
"Modified: / 21-09-2014 / 21:50:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecReverse
| handler |
"/ It seems that RR (as of 2018-08-31) has a funny bug:
"/ when a program is stopped due to a signal, reverse-contine
"/ will stop at the same place (when signal is reveiver) and
"/ second reverse-contine does the job.
"/
"/ To somegow hide this from user, issue the second
"/ reverse-continue automagically.
"/
"/ This is horible hack and maybe not a great idea, but
"/ it looks beter when doing demos :-)
targetIsRR ifTrue:[
handler := [ :ev |
debugger announcer unsubscribe: handler.
ev reason = SignalReceived ifTrue:[
debugger send: (GDBMI_exec_continue arguments: #('--reverse')) andWait: false.
]
].
debugger announcer when: GDBStoppedEvent do: handler.
].
debugger send: (GDBMI_exec_continue arguments: #('--reverse')) andWait: false.
"Created: / 30-07-2018 / 08:58:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 31-08-2018 / 23:28:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecRun
self doExec: GDBMI_exec_run new.
"Modified: / 21-09-2014 / 21:51:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecStepInto
self doExec: GDBMI_exec_step new.
"Modified: / 21-09-2014 / 21:52:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecStepOver
self doExec: GDBMI_exec_next new.
"Modified: / 21-09-2014 / 21:52:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecStepReturn
self doExec: GDBMI_exec_finish new.
"Modified: / 13-03-2018 / 10:39:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecSuspend
self doExec: (GDBMI_exec_interrupt arguments: #('--all'))
"Modified: / 29-09-2014 / 23:50:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
doExecTerminate
self doExec: 'kill'
"Modified: / 05-06-2017 / 23:13:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'menu apects'!
canAttachToRR
^ RR available
"Modified: / 26-07-2018 / 22:00:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canDebugOpenAndAttachToGDB
<resource: #uiCallback>
^ [ debugger notNil and:[ debugger process isLocal ] ]
"Modified: / 27-03-2019 / 09:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canViewEnableFrameFilters
^ [ debugger isFrameFiltersEnabled not ]
"Modified: / 12-06-2017 / 09:54:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canViewEnablePrettyPrinting
^ [ debugger isPrettyPrintingEnabled not ].
"Modified: / 12-06-2017 / 09:54:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'menu aspects-exec'!
canExecBackIntoHolder
canExecBackIntoHolder isNil ifTrue:[
canExecBackIntoHolder := ValueHolder with: false.
].
^ canExecBackIntoHolder
"Modified: / 13-03-2018 / 10:23:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecBackOverHolder
canExecBackOverHolder isNil ifTrue:[
canExecBackOverHolder := ValueHolder with: false.
].
^ canExecBackOverHolder
"Modified: / 13-03-2018 / 10:24:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecBackReturnHolder
canExecBackReturnHolder isNil ifTrue:[
canExecBackReturnHolder := ValueHolder with: false.
].
^ canExecBackReturnHolder
"Modified: / 13-03-2018 / 10:24:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecRestartHolder
"return/create the 'canExecRestartHolder' value holder (automatically generated)"
canExecRestartHolder isNil ifTrue:[
canExecRestartHolder := ValueHolder with: false.
].
^ canExecRestartHolder
"Modified: / 01-06-2017 / 23:15:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecResumeHolder
"return/create the 'canExecResumeHolder' value holder (automatically generated)"
canExecResumeHolder isNil ifTrue:[
canExecResumeHolder := ValueHolder with: false.
].
^ canExecResumeHolder
"Modified: / 01-06-2017 / 23:15:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecReverseHolder
canExecReverseHolder isNil ifTrue:[
canExecReverseHolder := ValueHolder with: false.
].
^ canExecReverseHolder
"Created: / 30-07-2018 / 08:57:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecRunHolder
"return/create the 'canExecRunHolder' value holder (automatically generated)"
canExecRunHolder isNil ifTrue:[
canExecRunHolder := ValueHolder with: false.
].
^ canExecRunHolder
"Modified: / 01-06-2017 / 23:15:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecStepIntoHolder
"return/create the 'canExecStepIntoHolder' value holder (automatically generated)"
canExecStepIntoHolder isNil ifTrue:[
canExecStepIntoHolder := ValueHolder with: false.
].
^ canExecStepIntoHolder
"Modified: / 01-06-2017 / 23:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecStepOverHolder
"return/create the 'canExecStepOverHolder' value holder (automatically generated)"
canExecStepOverHolder isNil ifTrue:[
canExecStepOverHolder := ValueHolder with: false.
].
^ canExecStepOverHolder
"Modified: / 01-06-2017 / 23:15:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecStepReturnHolder
"return/create the 'canExecStepReturn' value holder (automatically generated)"
canExecStepReturnHolder isNil ifTrue:[
canExecStepReturnHolder := ValueHolder with: false.
].
^ canExecStepReturnHolder
"Created: / 05-06-2017 / 22:41:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecSuspendHolder
"return/create the 'canExecSuspendHolder' value holder (automatically generated)"
canExecSuspendHolder isNil ifTrue:[
canExecSuspendHolder := ValueHolder with: false.
].
^ canExecSuspendHolder
"Modified: / 01-06-2017 / 23:15:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
canExecTerminateHolder
"return/create the 'canExecTerminateHolder' value holder (automatically generated)"
canExecTerminateHolder isNil ifTrue:[
canExecTerminateHolder := ValueHolder with: false.
].
^ canExecTerminateHolder
"Modified: / 01-06-2017 / 23:16:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication methodsFor:'startup & release'!
closeRequestFor:aTopView
aTopView == self window ifTrue:[
super closeRequestFor:aTopView
] ifFalse:[
| app |
app := aTopView application.
app notNil ifTrue:[
app release
].
aTopView destroy.
].
"Created: / 29-07-2018 / 16:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 29-07-2018 / 17:44:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!VDBDebuggerApplication class methodsFor:'documentation'!
version_HG
^ '$Changeset: <not expanded> $'
! !