UI: Show disassembly along with source code
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 01 Oct 2018 20:56:03 +0100
changeset 113 1a40f33af921
parent 112 d293d117e978
child 114 8a0643c344a9
UI: Show disassembly along with source code
Make.proto
Make.spec
RRStartEvent.st
VDBAbstractApplication.st
VDBAbstractListApplication.st
VDBDebuggerApplication.st
VDBFramePresenter.st
VDBInstructionListApplication.st
VDBSourceAndDisassemblyApplication.st
VDBStackApplication.st
abbrev.stc
bc.mak
jv_vdb.st
libInit.cc
tests/VDBInstructionListApplicationTests.st
--- a/Make.proto	Mon Oct 01 12:11:59 2018 +0100
+++ b/Make.proto	Mon Oct 01 20:56:03 2018 +0100
@@ -156,7 +156,6 @@
 $(OUTDIR)VDBBreakpointPresenter.$(O) VDBBreakpointPresenter.$(C) VDBBreakpointPresenter.$(H): VDBBreakpointPresenter.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractPresenter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBDebuggerApplication.$(O) VDBDebuggerApplication.$(C) VDBDebuggerApplication.$(H): VDBDebuggerApplication.st $(INCLUDE_TOP)/jv/libgdbs/GDBStopReasons.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBEventLogApplication.$(O) VDBEventLogApplication.$(C) VDBEventLogApplication.$(H): VDBEventLogApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
-$(OUTDIR)VDBFrameApplication.$(O) VDBFrameApplication.$(C) VDBFrameApplication.$(H): VDBFrameApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBFramePresenter.$(O) VDBFramePresenter.$(C) VDBFramePresenter.$(H): VDBFramePresenter.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractPresenter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionPresenter.$(O) VDBInstructionPresenter.$(C) VDBInstructionPresenter.$(H): VDBInstructionPresenter.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractPresenter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionsAndSourcePresenter.$(O) VDBInstructionsAndSourcePresenter.$(C) VDBInstructionsAndSourcePresenter.$(H): VDBInstructionsAndSourcePresenter.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractPresenter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libwidg2/AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)/stx/libwidg2/HierarchicalItem.$(H) $(STCHDR)
@@ -173,8 +172,10 @@
 $(OUTDIR)VDBUnixDebuggerConsoleApplication.$(O) VDBUnixDebuggerConsoleApplication.$(C) VDBUnixDebuggerConsoleApplication.$(H): VDBUnixDebuggerConsoleApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBUnixInferiorConsoleApplication.$(O) VDBUnixInferiorConsoleApplication.$(C) VDBUnixInferiorConsoleApplication.$(H): VDBUnixInferiorConsoleApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBUnixReplayServerConsoleApplication.$(O) VDBUnixReplayServerConsoleApplication.$(C) VDBUnixReplayServerConsoleApplication.$(H): VDBUnixReplayServerConsoleApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
+$(OUTDIR)VDBFrameApplication.$(O) VDBFrameApplication.$(C) VDBFrameApplication.$(H): VDBFrameApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractContainer.$(H) $(INCLUDE_TOP)/jv/vdb/VDBTabbingContainer.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionListApplication.$(O) VDBInstructionListApplication.$(C) VDBInstructionListApplication.$(H): VDBInstructionListApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractListApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBRegisterListApplication.$(O) VDBRegisterListApplication.$(C) VDBRegisterListApplication.$(H): VDBRegisterListApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractListApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
+$(OUTDIR)VDBSourceAndDisassemblyApplication.$(O) VDBSourceAndDisassemblyApplication.$(C) VDBSourceAndDisassemblyApplication.$(H): VDBSourceAndDisassemblyApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractContainer.$(H) $(INCLUDE_TOP)/jv/vdb/VDBTabbingContainer.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBStackApplication.$(O) VDBStackApplication.$(C) VDBStackApplication.$(H): VDBStackApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractListApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)VDBVariableObjectListApplication.$(O) VDBVariableObjectListApplication.$(C) VDBVariableObjectListApplication.$(H): VDBVariableObjectListApplication.st $(INCLUDE_TOP)/jv/vdb/VDBAbstractApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractListApplication.$(H) $(INCLUDE_TOP)/jv/vdb/VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugger.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBVariableObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Dictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/IdentityDictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/Set.$(H) $(INCLUDE_TOP)/stx/libbasic/UserPreferences.$(H) $(STCHDR)
--- a/Make.spec	Mon Oct 01 12:11:59 2018 +0100
+++ b/Make.spec	Mon Oct 01 20:56:03 2018 +0100
@@ -73,7 +73,6 @@
 	VDBBreakpointPresenter \
 	VDBDebuggerApplication \
 	VDBEventLogApplication \
-	VDBFrameApplication \
 	VDBFramePresenter \
 	VDBInstructionPresenter \
 	VDBInstructionsAndSourcePresenter \
@@ -90,8 +89,10 @@
 	VDBUnixDebuggerConsoleApplication \
 	VDBUnixInferiorConsoleApplication \
 	VDBUnixReplayServerConsoleApplication \
+	VDBFrameApplication \
 	VDBInstructionListApplication \
 	VDBRegisterListApplication \
+	VDBSourceAndDisassemblyApplication \
 	VDBStackApplication \
 	VDBVariableObjectListApplication \
 
@@ -121,7 +122,6 @@
     $(OUTDIR)VDBBreakpointPresenter.$(O) \
     $(OUTDIR)VDBDebuggerApplication.$(O) \
     $(OUTDIR)VDBEventLogApplication.$(O) \
-    $(OUTDIR)VDBFrameApplication.$(O) \
     $(OUTDIR)VDBFramePresenter.$(O) \
     $(OUTDIR)VDBInstructionPresenter.$(O) \
     $(OUTDIR)VDBInstructionsAndSourcePresenter.$(O) \
@@ -138,8 +138,10 @@
     $(OUTDIR)VDBUnixDebuggerConsoleApplication.$(O) \
     $(OUTDIR)VDBUnixInferiorConsoleApplication.$(O) \
     $(OUTDIR)VDBUnixReplayServerConsoleApplication.$(O) \
+    $(OUTDIR)VDBFrameApplication.$(O) \
     $(OUTDIR)VDBInstructionListApplication.$(O) \
     $(OUTDIR)VDBRegisterListApplication.$(O) \
+    $(OUTDIR)VDBSourceAndDisassemblyApplication.$(O) \
     $(OUTDIR)VDBStackApplication.$(O) \
     $(OUTDIR)VDBVariableObjectListApplication.$(O) \
     $(OUTDIR)extensions.$(O) \
--- a/RRStartEvent.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/RRStartEvent.st	Mon Oct 01 20:56:03 2018 +0100
@@ -30,3 +30,10 @@
 "
 ! !
 
+!RRStartEvent class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/VDBAbstractApplication.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBAbstractApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -256,17 +256,51 @@
 !VDBAbstractApplication methodsFor:'change & update'!
 
 enqueueDelayedUpdate: selector
-    | w |
+    "Arrange for and update to be processed 'later' some time.
+     There's no time guarantee on when it'd be processed but
+     if if more updates are delayed, they're guaranteed to 
+     process in order."
+
+    | w wg |
 
+    
+    "/ Technicallly, this is done by pushing an user event onto
+    "/ and event queue and leting window's event dispatcher to 
+    "/ trigger the update. 
+    "/ 
+    "/ However, the complication comes when updated is enqueued 
+    "/ for application which is is not fully initialized or it is
+    "/ not shown (such as in tab which is not visible). In that
+    "/ case there's no sensor (event queue) associated with 
+    "/ application's (sub) window. 
+    "/ 
+    "/ Since these updates re often equeued from an GDB event handler
+    "/ and since they often involve sending more commands to GDB, we
+    "/ really need them to be processed within an window event queue -
+    "/ sending commands from GDB event dispatch process is not permitted
+    "/ by GDB API. 
+    "/ 
+    "/ Hence, if there's no sensor already set up for the window, use
+    "/ `WindowGroup activeGroup sensor`. In most cases that'd be the 
+    "/ "right" one. If it's not, it should not harm. 
+    "/ 
+    "/ If there's no active window group, then process the
+    "/ udate in special separate thread. This should be rare. 
     w := self window.
-    w notNil ifTrue:[
-        self window sensor pushUserEvent: selector for:self
-    ] ifFalse:[ 
-        self perform: selector
+    w notNil ifTrue:[           
+        wg := w windowGroup.
+    ].        
+    wg isNil ifTrue:[ 
+        wg := WindowGroup activeGroup
     ].
+    wg notNil ifTrue:[ 
+        wg sensor pushUserEvent: selector for:self        
+    ] ifFalse:[
+        [ self perform: selector ] fork.
+    ]
 
     "Created: / 17-01-2018 / 06:50:29 / jv"
-    "Modified: / 03-02-2018 / 08:10:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 03-10-2018 / 15:22:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 enqueueDelayedUpdate: selector with: argument
--- a/VDBAbstractListApplication.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBAbstractListApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -366,12 +366,20 @@
 !VDBAbstractListApplication methodsFor:'change & update-delayed'!
 
 delayedInvalidateInternalList
-    internalListView notNil ifTrue:[ 
-        internalListView scrolledView invalidateRepairNow: true
+    | scrolledView |
+
+    "/ Since this is an delayed update, we should check whether
+    "/ the update still makes sense  The window may be already 
+    "/ closed or (worse) in the middle of closing. Sigh.
+    internalListView notNil ifTrue:[
+        scrolledView := internalListView scrolledView.
+        (scrolledView notNil and:[ scrolledView isVisible ]) ifTrue:[
+            scrolledView invalidateRepairNow: true
+        ]
     ].
 
     "Created: / 06-02-2018 / 12:43:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-09-2018 / 22:24:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 03-10-2018 / 15:25:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 delayedUpdateInternalList
@@ -560,10 +568,11 @@
 internalCanSelect: index
     | item |
 
-    item := internalListHolder value at: index.
+    item := internalListHolder value at: index ifAbsent:[ ^ false ].
     ^self canSelect: item
 
     "Created: / 09-04-2018 / 20:52:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 10:22:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 internalList
--- a/VDBDebuggerApplication.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBDebuggerApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -191,10 +191,10 @@
                    handles: (Any 0.5 1.0)
                  )
                 (SubCanvasSpec
-                   name: 'SourceCanvas'
+                   name: 'SourcePane'
                    hasHorizontalScrollBar: false
                    hasVerticalScrollBar: false
-                   majorKey: VDBSourceApplication
+                   majorKey: VDBSourceAndDisassemblyApplication
                    subAspectHolders: 
                   (Array
                      
@@ -233,7 +233,7 @@
        )
      )
 
-    "Modified: / 06-06-2017 / 08:12:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-10-2018 / 12:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 layoutSingleSpec
@@ -757,7 +757,6 @@
         #selectedThreadHolder
       ).
 
-    "Modified: / 01-06-2017 / 23:32:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !VDBDebuggerApplication methodsFor:'accessing'!
@@ -799,7 +798,7 @@
     ].
     ^ layoutSpecHolder
 
-    "Modified: / 18-09-2014 / 23:35:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 10:29:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 selectedFrameHolder
@@ -1224,10 +1223,11 @@
     | application |
 
     application := VDBInstructionListApplication new
+                    debuggerHolder: self debuggerHolder;  
                     frameHolder: self selectedFrameHolder.
     self doOpenToolApplication: application.
 
-    "Modified: / 28-09-2018 / 06:58:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 10:15:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doOpenToolRegisters
--- a/VDBFramePresenter.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBFramePresenter.st	Mon Oct 01 20:56:03 2018 +0100
@@ -116,10 +116,11 @@
 doDisassemble
     VDBInstructionListApplication new
         title: (self class classResources string: '%1 (disassembly)' with: frame func ? '?');
+        debugger: frame debugger;
         frame: frame;
         open.
 
-    "Modified: / 28-09-2018 / 06:55:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 10:14:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !VDBFramePresenter methodsFor:'menu-queries'!
@@ -152,3 +153,10 @@
     "Created: / 21-09-2014 / 23:54:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBFramePresenter class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/VDBInstructionListApplication.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBInstructionListApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -365,6 +365,18 @@
     "Created: / 26-06-2018 / 12:20:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+enqueueDelayedUpdateButtonEnablements
+    self enqueueDelayedUpdate: #delayedUpdateButtonEnablements
+
+    "Created: / 03-10-2018 / 12:12:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+enqueueDelayedUpdateInstructionList
+    self enqueueDelayedUpdate: #delayedUpdateInstructionList
+
+    "Created: / 01-10-2018 / 12:56:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 update:aspect with:param from:sender
     "Invoked when an object that I depend upon sends a change notification."
 
@@ -373,7 +385,7 @@
          ^ self.
     ].
     sender == frameHolder ifTrue:[ 
-         self updateAfterFrameChanged.
+         self enqueueDelayedUpdateInstructionList.
          ^ self.
     ].
     sender == selectedInstructionHolder ifTrue:[ 
@@ -381,24 +393,7 @@
     ].
     super update:aspect with:param from:sender
 
-    "Modified: / 06-08-2018 / 13:23:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-updateAfterFrameChanged
-    | frame |
-
-    frame := self frame.
-    frame notNil ifTrue:[
-        self debugger: self frame debugger.
-        self instructionList: self frame disassemble.
-    ] ifFalse:[ 
-        self debugger: nil.
-        self instructionList: #().
-    ].
-    self updateButtonEnablements.
-
-    "Created: / 06-08-2018 / 13:24:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-09-2018 / 07:03:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-10-2018 / 12:56:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateAfterSelectedInstructionChanged
@@ -450,6 +445,20 @@
 
 !VDBInstructionListApplication methodsFor:'change & update-delayed'!
 
+delayedInvalidateInternalList
+    | frame |
+
+    "/ First, force update of )cached) frames to get 
+    "/ updated PC.
+    frame := self frame.
+    (frame notNil and:[frame thread isStopped]) ifTrue:[
+        frame thread stack        
+    ].    
+    super delayedInvalidateInternalList
+
+    "Created: / 03-10-2018 / 12:10:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 delayedUpdateBasicBlocks
     | instructions |
 
@@ -462,6 +471,40 @@
     "Modified: / 16-08-2018 / 11:33:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+delayedUpdateButtonEnablements
+    | frame thread threadIsStopped canReverse |
+
+    frame := self frameHolder value.
+    frame notNil ifTrue:[ 
+        thread := frame thread.
+    ].
+    threadIsStopped := thread notNil and:[ thread isStopped ].
+    canReverse := debugger notNil and:[ debugger hasFeature: 'reverse' ].
+
+    self canExecStepIntoInstructionHolder value: threadIsStopped.
+    self canExecStepOverInstructionHolder value: threadIsStopped.
+
+    self canExecBackIntoInstructionHolder value: threadIsStopped & canReverse.
+    self canExecBackOverInstructionHolder value: threadIsStopped & canReverse.
+
+    "Created: / 03-10-2018 / 12:12:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+delayedUpdateInstructionList
+    | frame |
+
+    frame := self frame.
+    (frame notNil and:[ frame hasSymbol ]) ifTrue:[
+        self instructionList: frame disassemble.
+    ] ifFalse:[ 
+        self instructionList: #().
+    ].
+    self updateButtonEnablements.
+
+    "Created: / 01-10-2018 / 12:55:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 10:12:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 delayedUpdateInternalList
     | root |
 
@@ -514,21 +557,20 @@
 !
 
 onRunningEvent: aGDBStoppedEvent
-    self updateButtonEnablements
+    self enqueueDelayedUpdateButtonEnablements
 
     "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>"
+    "Modified: / 03-10-2018 / 12:12:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 onStoppedEvent: aGDBStoppedEvent
     self frame notNil ifTrue:[
-        self frame thread stack. "/ to force update of (cached) frames.
-        self enqueueDelayedInvalidateInternalList
+        self enqueueDelayedInvalidateInternalList.
+        self enqueueDelayedUpdateButtonEnablements.
     ].
-    self updateButtonEnablements
 
     "Created: / 06-08-2018 / 14:45:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-09-2018 / 22:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-10-2018 / 12:13:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !VDBInstructionListApplication methodsFor:'initialization & release'!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VDBSourceAndDisassemblyApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -0,0 +1,82 @@
+"
+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 }"
+
+VDBTabbingContainer subclass:#VDBSourceAndDisassemblyApplication
+	instanceVariableNames:'frameHolder'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'VDB-UI-Source'
+!
+
+!VDBSourceAndDisassemblyApplication 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/
+"
+! !
+
+!VDBSourceAndDisassemblyApplication methodsFor:'aspects'!
+
+frameHolder
+    "return/create the 'frameHolder' value holder (automatically generated)"
+
+    frameHolder isNil ifTrue:[
+        frameHolder := ValueHolder new.
+        frameHolder addDependent:self.
+    ].
+    ^ frameHolder
+!
+
+frameHolder:aValueModel
+    "set the 'frameHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    frameHolder notNil ifTrue:[
+        oldValue := frameHolder value.
+        frameHolder removeDependent:self.
+    ].
+    frameHolder := aValueModel.
+    components do:[:each | each application perform: #frameHolder: with: frameHolder ].
+    frameHolder notNil ifTrue:[
+        frameHolder addDependent:self.
+    ].
+    newValue := frameHolder value.
+    oldValue ~~ newValue ifTrue:[
+        self update:#value with:newValue from:frameHolder.
+    ].
+
+    "Modified: / 01-10-2018 / 13:09:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!VDBSourceAndDisassemblyApplication methodsFor:'initialization'!
+
+initialize
+    super initialize.
+    self addApplication: (VDBSourceApplication new
+                            debuggerHolder: self debuggerHolder;
+                            frameHolder:  self frameHolder;
+                            yourself).
+    self addApplication: (VDBInstructionListApplication new
+                            debuggerHolder: self debuggerHolder;
+                            frameHolder:  self frameHolder;
+                            yourself)
+
+    "Created: / 01-10-2018 / 12:45:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/VDBStackApplication.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/VDBStackApplication.st	Mon Oct 01 20:56:03 2018 +0100
@@ -312,11 +312,11 @@
     self selectedFrameHolder value notNil ifTrue:[ 
         self internalSelectionHolder value: nil withoutNotifying: self.
     ].
-    self delayedInvalidateInternalList
+    self enqueueDelayedInvalidateInternalList
 
     "Created: / 30-09-2014 / 00:02:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 17-01-2018 / 06:59:11 / jv"
-    "Modified: / 27-09-2018 / 21:30:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-10-2018 / 12:59:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 onStoppedEvent: event
--- a/abbrev.stc	Mon Oct 01 12:11:59 2018 +0100
+++ b/abbrev.stc	Mon Oct 01 20:56:03 2018 +0100
@@ -23,7 +23,6 @@
 VDBBreakpointPresenter VDBBreakpointPresenter jv:vdb 'VDB-Presentation' 0
 VDBDebuggerApplication VDBDebuggerApplication jv:vdb 'VDB-UI' 2
 VDBEventLogApplication VDBEventLogApplication jv:vdb 'VDB-UI-Events' 2
-VDBFrameApplication VDBFrameApplication jv:vdb 'VDB-UI-Others' 2
 VDBFramePresenter VDBFramePresenter jv:vdb 'VDB-Presentation' 0
 VDBInstructionPresenter VDBInstructionPresenter jv:vdb 'VDB-Presentation' 0
 VDBInstructionsAndSourcePresenter VDBInstructionsAndSourcePresenter jv:vdb 'VDB-Presentation' 0
@@ -40,7 +39,9 @@
 VDBUnixDebuggerConsoleApplication VDBUnixDebuggerConsoleApplication jv:vdb 'VDB-UI-Console-Unix' 2
 VDBUnixInferiorConsoleApplication VDBUnixInferiorConsoleApplication jv:vdb 'VDB-UI-Console-Unix' 2
 VDBUnixReplayServerConsoleApplication VDBUnixReplayServerConsoleApplication jv:vdb 'VDB-UI-Console-Unix' 2
+VDBFrameApplication VDBFrameApplication jv:vdb 'VDB-UI-Others' 2
 VDBInstructionListApplication VDBInstructionListApplication jv:vdb 'VDB-UI-Others' 2
 VDBRegisterListApplication VDBRegisterListApplication jv:vdb 'VDB-UI-Others' 2
+VDBSourceAndDisassemblyApplication VDBSourceAndDisassemblyApplication jv:vdb 'VDB-UI-Source' 2
 VDBStackApplication VDBStackApplication jv:vdb 'VDB-UI-Others' 2
 VDBVariableObjectListApplication VDBVariableObjectListApplication jv:vdb 'VDB-UI-Others' 2
--- a/bc.mak	Mon Oct 01 12:11:59 2018 +0100
+++ b/bc.mak	Mon Oct 01 20:56:03 2018 +0100
@@ -103,7 +103,6 @@
 $(OUTDIR)VDBBreakpointPresenter.$(O) VDBBreakpointPresenter.$(C) VDBBreakpointPresenter.$(H): VDBBreakpointPresenter.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractPresenter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBDebuggerApplication.$(O) VDBDebuggerApplication.$(C) VDBDebuggerApplication.$(H): VDBDebuggerApplication.st $(INCLUDE_TOP)\jv\libgdbs\GDBStopReasons.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBEventLogApplication.$(O) VDBEventLogApplication.$(C) VDBEventLogApplication.$(H): VDBEventLogApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
-$(OUTDIR)VDBFrameApplication.$(O) VDBFrameApplication.$(C) VDBFrameApplication.$(H): VDBFrameApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBFramePresenter.$(O) VDBFramePresenter.$(C) VDBFramePresenter.$(H): VDBFramePresenter.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractPresenter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionPresenter.$(O) VDBInstructionPresenter.$(C) VDBInstructionPresenter.$(H): VDBInstructionPresenter.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractPresenter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionsAndSourcePresenter.$(O) VDBInstructionsAndSourcePresenter.$(C) VDBInstructionsAndSourcePresenter.$(H): VDBInstructionsAndSourcePresenter.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractPresenter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libwidg2\AbstractHierarchicalItem.$(H) $(INCLUDE_TOP)\stx\libwidg2\HierarchicalItem.$(H) $(STCHDR)
@@ -120,8 +119,10 @@
 $(OUTDIR)VDBUnixDebuggerConsoleApplication.$(O) VDBUnixDebuggerConsoleApplication.$(C) VDBUnixDebuggerConsoleApplication.$(H): VDBUnixDebuggerConsoleApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBUnixInferiorConsoleApplication.$(O) VDBUnixInferiorConsoleApplication.$(C) VDBUnixInferiorConsoleApplication.$(H): VDBUnixInferiorConsoleApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBUnixReplayServerConsoleApplication.$(O) VDBUnixReplayServerConsoleApplication.$(C) VDBUnixReplayServerConsoleApplication.$(H): VDBUnixReplayServerConsoleApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractUnixConsoleApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
+$(OUTDIR)VDBFrameApplication.$(O) VDBFrameApplication.$(C) VDBFrameApplication.$(H): VDBFrameApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractContainer.$(H) $(INCLUDE_TOP)\jv\vdb\VDBTabbingContainer.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBInstructionListApplication.$(O) VDBInstructionListApplication.$(C) VDBInstructionListApplication.$(H): VDBInstructionListApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractListApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBRegisterListApplication.$(O) VDBRegisterListApplication.$(C) VDBRegisterListApplication.$(H): VDBRegisterListApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractListApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
+$(OUTDIR)VDBSourceAndDisassemblyApplication.$(O) VDBSourceAndDisassemblyApplication.$(C) VDBSourceAndDisassemblyApplication.$(H): VDBSourceAndDisassemblyApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractContainer.$(H) $(INCLUDE_TOP)\jv\vdb\VDBTabbingContainer.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBStackApplication.$(O) VDBStackApplication.$(C) VDBStackApplication.$(H): VDBStackApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractListApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)VDBVariableObjectListApplication.$(O) VDBVariableObjectListApplication.$(C) VDBVariableObjectListApplication.$(H): VDBVariableObjectListApplication.st $(INCLUDE_TOP)\jv\vdb\VDBAbstractApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractListApplication.$(H) $(INCLUDE_TOP)\jv\vdb\VDBAbstractTreeApplication.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugger.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBVariableObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Dictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\IdentityDictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\Set.$(H) $(INCLUDE_TOP)\stx\libbasic\UserPreferences.$(H) $(STCHDR)
--- a/jv_vdb.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/jv_vdb.st	Mon Oct 01 20:56:03 2018 +0100
@@ -122,7 +122,6 @@
         VDBBreakpointPresenter
         VDBDebuggerApplication
         VDBEventLogApplication
-        VDBFrameApplication
         VDBFramePresenter
         VDBInstructionPresenter
         VDBInstructionsAndSourcePresenter
@@ -139,8 +138,10 @@
         VDBUnixDebuggerConsoleApplication
         VDBUnixInferiorConsoleApplication
         VDBUnixReplayServerConsoleApplication
+        VDBFrameApplication
         VDBInstructionListApplication
         VDBRegisterListApplication
+        VDBSourceAndDisassemblyApplication
         VDBStackApplication
         VDBVariableObjectListApplication
     )
--- a/libInit.cc	Mon Oct 01 12:11:59 2018 +0100
+++ b/libInit.cc	Mon Oct 01 20:56:03 2018 +0100
@@ -38,7 +38,6 @@
 extern void _VDBBreakpointPresenter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBDebuggerApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBEventLogApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _VDBFrameApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBFramePresenter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBInstructionPresenter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBInstructionsAndSourcePresenter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -55,8 +54,10 @@
 extern void _VDBUnixDebuggerConsoleApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBUnixInferiorConsoleApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBUnixReplayServerConsoleApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _VDBFrameApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBInstructionListApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBRegisterListApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _VDBSourceAndDisassemblyApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBStackApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VDBVariableObjectListApplication_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 
@@ -95,7 +96,6 @@
     _VDBBreakpointPresenter_Init(pass,__pRT__,snd);
     _VDBDebuggerApplication_Init(pass,__pRT__,snd);
     _VDBEventLogApplication_Init(pass,__pRT__,snd);
-    _VDBFrameApplication_Init(pass,__pRT__,snd);
     _VDBFramePresenter_Init(pass,__pRT__,snd);
     _VDBInstructionPresenter_Init(pass,__pRT__,snd);
     _VDBInstructionsAndSourcePresenter_Init(pass,__pRT__,snd);
@@ -112,8 +112,10 @@
     _VDBUnixDebuggerConsoleApplication_Init(pass,__pRT__,snd);
     _VDBUnixInferiorConsoleApplication_Init(pass,__pRT__,snd);
     _VDBUnixReplayServerConsoleApplication_Init(pass,__pRT__,snd);
+    _VDBFrameApplication_Init(pass,__pRT__,snd);
     _VDBInstructionListApplication_Init(pass,__pRT__,snd);
     _VDBRegisterListApplication_Init(pass,__pRT__,snd);
+    _VDBSourceAndDisassemblyApplication_Init(pass,__pRT__,snd);
     _VDBStackApplication_Init(pass,__pRT__,snd);
     _VDBVariableObjectListApplication_Init(pass,__pRT__,snd);
 
--- a/tests/VDBInstructionListApplicationTests.st	Mon Oct 01 12:11:59 2018 +0100
+++ b/tests/VDBInstructionListApplicationTests.st	Mon Oct 01 20:56:03 2018 +0100
@@ -32,12 +32,19 @@
 
 !VDBInstructionListApplicationTests methodsFor:'tests'!
 
-test_01
+test_01a
     | stack frameHolder |
 
     debugger := GDBDebugger new.
     self assert: debugger isConnected.
 
+    frameHolder := ValueHolder new.
+    application := VDBInstructionListApplication new.
+    application debuggerHolder: (ValueHolder with: debugger).
+    application frameHolder: frameHolder.  
+    application open.
+
+
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -46,12 +53,56 @@
     stack := debugger selectedInferior threads first stack.
     self assert: stack size = 3.
 
-    frameHolder := stack first asValue.
+    frameHolder value: stack first.
+
+    debugger send: 'stepi' andWaitFor: GDBStoppedEvent.
+    debugger send: 'next' andWaitFor: GDBStoppedEvent.
+    debugger send: 'd'.
+
+    frameHolder value: nil.
+    
+    debugger send: 'c' andWaitFor: GDBThreadGroupExitedEvent.
+
+    "Created: / 03-10-2018 / 12:27:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-10-2018 / 15:19:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_01b
+    | stack frameHolder |
+
+    debugger := GDBDebugger new.
+    self assert: debugger isConnected.
+
+    frameHolder := ValueHolder new.
     application := VDBInstructionListApplication new.
+    application debuggerHolder: (ValueHolder with: debugger).
     application frameHolder: frameHolder.  
-    application open.
+    application allButOpen.
+
+
+    debugger executable: GDBDebuggeesResource current binaryFactorial1.
+    debugger send: 'b factorial'.
+    debugger send: 'r' andWaitFor: GDBStoppedEvent.
+    debugger send: 'c' andWaitFor: GDBStoppedEvent.
 
-    "Created: / 28-09-2018 / 08:33:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-09-2018 / 10:05:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    stack := debugger selectedInferior threads first stack.
+    self assert: stack size = 3.
+
+    frameHolder value: stack first.
+
+    debugger send: 'stepi' andWaitFor: GDBStoppedEvent.
+    debugger send: 'next' andWaitFor: GDBStoppedEvent.
+    debugger send: 'd'.
+    debugger send: 'c' andWaitFor: GDBThreadGroupExitedEvent.
+
+    "Created: / 03-10-2018 / 12:27:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-10-2018 / 15:14:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBInstructionListApplicationTests class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+