GNI/MI: added custom inspector view for viewing GDB/MI comminicatication trace
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 09 Mar 2018 11:01:06 +0000
changeset 113 c4f07d0e7b7a
parent 112 a8138ced2f5e
child 114 be5bdaecb9b3
GNI/MI: added custom inspector view for viewing GDB/MI comminicatication trace ...to ease debugging/exploring GDB.MI. `GDBSessionRecord*` classes have been renamed to `GDBMITrace*` to avoid (future) naming confusion with event recording feature in GDB itself (reverse debugging).
GDBConnection.st
GDBDebugger.st
GDBMITrace.st
GDBMITraceViewer.st
GDBMITracer.st
GDBSessionRecord.st
GDBSessionRecorder.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
--- a/GDBConnection.st	Fri Feb 09 10:16:01 2018 +0000
+++ b/GDBConnection.st	Fri Mar 09 11:01:06 2018 +0000
@@ -100,6 +100,14 @@
 
 recorder:aGDBSessionRecorder
     recorder := aGDBSessionRecorder.
+!
+
+trace
+    "Returns a GDB.MI record (trrace). Used for debugging GDB/MI communication."
+    
+    ^ self recorder trace
+
+    "Created: / 09-03-2018 / 09:49:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection methodsFor:'commands'!
@@ -336,7 +344,7 @@
 
 !GDBConnection methodsFor:'initialize & release'!
 
-initializeWithProcess: aGDBProcess
+initializeWithProcess:aGDBProcess 
     process := aGDBProcess.
     OperatingSystem isUNIXlike ifTrue:[
         inferiorPTY := GDBPTY new.
@@ -345,12 +353,12 @@
     eventQueueLock := RecursionLock new.
     eventQueueNotifier := Semaphore new.
     eventAnnouncer := Announcer new.
-    eventAnnouncer subscriptionRegistry subscriptionClass: GDBEventSubscription.
-    eventAnnouncerInternal := Announcer new.    
+    eventAnnouncer subscriptionRegistry 
+        subscriptionClass:GDBEventSubscription.
+    eventAnnouncerInternal := Announcer new.
     outstandingCommands := Set new.
-    recorder := GDBSessionRecorder new.
-
-    aGDBProcess connection: self.
+    recorder := GDBMITracer new.
+    aGDBProcess connection:self.
 
     "Created: / 20-06-2014 / 21:40:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 18-09-2014 / 00:11:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
--- a/GDBDebugger.st	Fri Feb 09 10:16:01 2018 +0000
+++ b/GDBDebugger.st	Fri Mar 09 11:01:06 2018 +0000
@@ -183,6 +183,12 @@
 
 !GDBDebugger methodsFor:'accessing-private'!
 
+connectionTrace
+    ^ connection trace
+
+    "Created: / 09-03-2018 / 10:04:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 currentInferiorStateSequnceNumber
     ^ inferiorStateSequenceNumber
 
@@ -865,6 +871,19 @@
     "Created: / 20-06-2014 / 22:07:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBDebugger methodsFor:'inspecting'!
+
+inspector2TabGDBMITrace
+    <inspector2Tab>
+    ^ (self newInspector2Tab)
+        label:'GDB/MI Trace';
+        priority:50;
+        application:[ GDBMITraceViewer new debugger:self ];
+        yourself
+
+    "Modified (format): / 09-03-2018 / 10:09:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBDebugger methodsFor:'queries'!
 
 hasFeature: feature
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMITrace.st	Fri Mar 09 11:01:06 2018 +0000
@@ -0,0 +1,285 @@
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'jv:libgdbs' }"
+
+"{ NameSpace: Smalltalk }"
+
+OrderedCollection subclass:#GDBMITrace
+	instanceVariableNames:'lock'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private-MI Trace'
+!
+
+Object subclass:#Command
+	instanceVariableNames:'string'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:GDBMITrace
+!
+
+Object subclass:#Response
+	instanceVariableNames:'string'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:GDBMITrace
+!
+
+!GDBMITrace class methodsFor:'documentation'!
+
+copyright
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!GDBMITrace class methodsFor:'instance creation'!
+
+new
+    ^ super new initialize.
+
+    "Created: / 24-06-2014 / 00:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+new: size
+    "return an initialized instance"
+
+    ^ (super new: size) initialize.
+
+    "Created: / 24-06-2014 / 00:06:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace methodsFor:'adding & removing'!
+
+add:anObject
+    "add the argument, anObject to the end of the collection
+     Return the argument, anObject."
+
+    ^ lock critical:[ 
+        super add:anObject
+    ].
+
+    "Modified: / 29-01-1998 / 10:52:32 / cg"
+    "Modified: / 23-06-2014 / 23:55:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+add:anObject beforeIndex:index
+    "add the argument, anObject to the end of the collection.
+     Return the receiver (sigh - ST-80 compatibility)."
+
+    ^ lock critical:[ 
+        super add:anObject beforeIndex:index
+    ].
+
+    "Modified: / 23-06-2014 / 23:55:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addAll:aCollection beforeIndex:index
+    "insert all elements of the argument
+     Return the receiver."
+
+    ^ lock critical:[ 
+        super addAll:aCollection beforeIndex:index      
+    ].
+
+    "Modified: / 23-06-2014 / 23:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addAllLast:aCollection
+    "add all elements of the argument, aCollection to the end of the collection.
+     Return the argument, aCollection."
+
+    ^ lock critical:[ 
+        super addAllLast:aCollection       
+    ].
+
+    "Modified: / 23-06-2014 / 23:56:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addFirst:anObject
+    "add the argument, anObject to the beginning of the collection.
+     Return the argument, anObject."
+
+     ^ lock critical:[ 
+        super addFirst:anObject
+    ].
+
+    "Modified: / 29-01-1998 / 10:53:09 / cg"
+    "Modified: / 23-06-2014 / 23:56:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    "/ please change as required (and remove this comment)
+    super initialize.
+    lock := RecursionLock new.
+
+    "/ super initialize.   -- commented since inherited method does nothing
+
+    "Modified: / 24-06-2014 / 00:05:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace methodsFor:'printing & storing'!
+
+printOn:aStream
+    self do:[:each | each printOn: aStream ]
+
+    "Modified: / 23-06-2014 / 23:51:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace methodsFor:'recording'!
+
+<<< aString
+    self add: (Response new string: aString)
+
+    "Created: / 24-06-2014 / 00:35:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+>>> aString
+    self add: (Command new string: aString)
+
+    "Created: / 24-06-2014 / 00:35:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace methodsFor:'saving & restoring'!
+
+saveInClass: class selector: selector
+    "Save recorded session in given class under given selector"
+
+    | source |
+
+    source := String new writeStream.
+    source nextPutAll: selector; cr; cr.
+    source nextPutAll:' ^ (GDBSessionRecord new: '.
+    self size printOn: source.
+    source nextPutAll: ')'; cr; cr.
+
+    self do:[:each | 
+        each isCommand ifTrue:[ 
+            source nextPutLine: '>>>'.
+        ] ifFalse:[
+            source nextPutLine: '<<<'.
+        ].
+        each string storeOn: source.
+        source nextPut: $;; cr; cr.  
+    ].
+    source nextPutAll: 'yourself'.
+
+    class compile: source contents classified: 'recorded sessions'
+
+    "Created: / 23-06-2014 / 23:14:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:44:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+saveInSimulatorResourceAs: selector
+    ^ self saveInClass: GDBSimulatorResource selector: selector
+
+    "Created: / 23-06-2014 / 23:17:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace::Command methodsFor:'accessing'!
+
+string
+    ^ string
+!
+
+string:something
+    string := something.
+! !
+
+!GDBMITrace::Command methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation if the receiver to the argument, aStream"
+
+    aStream nextPutLine: '>>>'.
+    string printOn: aStream.
+    aStream cr.
+
+    "Modified: / 24-06-2014 / 00:09:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace::Command methodsFor:'testing'!
+
+isCommand
+    ^ true
+
+    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isResponse
+    ^ false
+
+    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace::Response methodsFor:'accessing'!
+
+string
+    ^ string
+!
+
+string:something
+    string := something.
+! !
+
+!GDBMITrace::Response methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation if the receiver to the argument, aStream"
+
+    aStream nextPutLine: '<<<'.
+    string printOn: aStream.
+    aStream cr.
+
+    "Modified: / 24-06-2014 / 00:08:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITrace::Response methodsFor:'testing'!
+
+isCommand
+    ^ false
+
+    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isResponse
+    ^ true
+
+    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMITraceViewer.st	Fri Mar 09 11:01:06 2018 +0000
@@ -0,0 +1,268 @@
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'jv:libgdbs' }"
+
+"{ NameSpace: Smalltalk }"
+
+ApplicationModel subclass:#GDBMITraceViewer
+	instanceVariableNames:'debugger traceView commandHolder traceLastIndex'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private-MI Trace'
+!
+
+!GDBMITraceViewer class methodsFor:'documentation'!
+
+copyright
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!GDBMITraceViewer 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:VDBMITracerApplication andSelector:#windowSpec
+     VDBMITracerApplication new openInterface:#windowSpec
+     VDBMITracerApplication open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+    #(FullSpec
+       name: windowSpec
+       uuid: 'fc41ab90-2378-11e8-b45a-0021ccd5e3d3'
+       window: 
+      (WindowSpec
+         label: 'GDB/MI Tracer'
+         name: 'GDB/MI Tracer'
+         uuid: 'fc41ab91-2378-11e8-b45a-0021ccd5e3d3'
+         min: (Point 10 10)
+         bounds: (Rectangle 0 0 870 497)
+       )
+       component: 
+      (SpecCollection
+         collection: (
+          (TextEditorSpec
+             name: 'RecordView'
+             layout: (LayoutFrame 0 0 0 0 0 1 -30 1)
+             uuid: 'fc41ab92-2378-11e8-b45a-0021ccd5e3d3'
+             hasHorizontalScrollBar: true
+             hasVerticalScrollBar: true
+             hasKeyboardFocusInitially: false
+             postBuildCallback: postBuildTraceView:
+             viewClassName: 'TextCollector'
+           )
+          (InputFieldSpec
+             name: 'CommandView'
+             layout: (LayoutFrame 0 0 -25 1 0 1 0 1)
+             uuid: 'fc41ab93-2378-11e8-b45a-0021ccd5e3d3'
+             model: commandHolder
+             acceptOnLeave: false
+             acceptOnReturn: true
+             acceptOnTab: false
+             acceptOnLostFocus: false
+             acceptOnPointerLeave: false
+             acceptIfUnchanged: true
+             emptyFieldReplacementText: 'Command to send...'
+           )
+          )
+        
+       )
+     )
+
+    "Modified: / 09-03-2018 / 10:12:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer 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
+      ).
+
+! !
+
+!GDBMITraceViewer methodsFor:'accessing'!
+
+debugger
+    ^ debugger
+!
+
+debugger:aGDBDebugger
+    debugger notNil ifTrue:[ 
+        self unsubscribe.
+    ].
+    debugger := aGDBDebugger.
+    debugger notNil ifTrue:[ 
+        self subscribe.
+    ].
+
+    "Modified: / 09-03-2018 / 10:47:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'aspects'!
+
+commandHolder
+    <resource: #uiAspect>
+
+    commandHolder isNil ifTrue:[
+        commandHolder := ValueHolder new.
+        commandHolder addDependent:self.
+    ].
+    ^ commandHolder.
+
+    "Modified (comment): / 09-03-2018 / 09:05:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'change & update'!
+
+update: aspect with: param from: sender
+    sender == commandHolder ifTrue:[ 
+        self updateAfterCommandAccepted.
+    ].
+    super update: aspect with: param from: sender
+
+    "Created: / 09-03-2018 / 10:33:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+updateAfterCommandAccepted
+    | command |
+
+    command := commandHolder value.
+    command notEmptyOrNil ifTrue:[ 
+        debugger send: command andWait: false.
+        commandHolder value: nil.
+    ].
+
+    "Created: / 09-03-2018 / 10:39:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+updateTrace
+    | trace |
+
+    trace := debugger connectionTrace.
+    traceLastIndex + 1 to: trace size do:[:i | 
+        traceView nextPutAll: (trace at: i) printString.
+        traceLastIndex := i.
+    ].   
+
+    "Created: / 09-03-2018 / 10:10:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'dependents access'!
+
+release
+    "remove all dependencies from the receiver"
+
+    super release.
+    self unsubscribe
+
+    "Created: / 06-06-2014 / 22:13:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'hooks'!
+
+commonPostOpen
+    debugger notNil ifTrue:[ 
+        self updateTrace.
+    ].
+
+    "Created: / 09-03-2018 / 09:45:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+postBuildTraceView:aView 
+    traceView := aView scrolledView.
+    traceView readOnly:true.
+
+    "Created: / 09-03-2018 / 09:42:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'initialization'!
+
+initialize
+    "nothing done here;
+     but can be redefined in concrete applications"
+
+    traceLastIndex := 0.
+
+    "Created: / 09-03-2018 / 09:38:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer methodsFor:'initialization & release'!
+
+subscribe   
+    "Register for debugger events. To be overrided by subclasses"
+
+    debugger announcer when: GDBEvent send: #updateTrace to: self
+
+    "Created: / 09-03-2018 / 09:06:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 09-03-2018 / 10:11:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+unsubscribe
+    "Unsubscribe myself fo debugger events"
+    (debugger notNil and:[debugger isConnected]) ifTrue:[ 
+        debugger announcer unsubscribe: self.
+    ].
+
+    "Created: / 06-06-2014 / 21:26:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-06-2017 / 13:43:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITraceViewer class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMITracer.st	Fri Mar 09 11:01:06 2018 +0000
@@ -0,0 +1,118 @@
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'jv:libgdbs' }"
+
+"{ NameSpace: Smalltalk }"
+
+Object subclass:#GDBMITracer
+	instanceVariableNames:'record buffer'
+	classVariableNames:''
+	poolDictionaries:'GDBDebugFlags'
+	category:'GDB-Private-MI Trace'
+!
+
+!GDBMITracer class methodsFor:'documentation'!
+
+copyright
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!GDBMITracer class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
+!GDBMITracer methodsFor:'accessing'!
+
+trace
+    ^ record
+! !
+
+!GDBMITracer methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+    
+    record := GDBMITrace new.
+    buffer := (String new:100) writeStream.
+
+    "/ responseBuffer := nil.
+    "/ super initialize.   -- commented since inherited method does nothing
+    "Modified: / 24-06-2014 / 00:10:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 09-03-2018 / 08:53:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITracer methodsFor:'recording'!
+
+recordCommand: command
+    record >>> command
+
+    "Created: / 22-06-2014 / 21:39:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:36:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+recordResponse: aString
+    buffer nextPutAll: aString
+
+    "Created: / 22-06-2014 / 21:56:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:10:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+recordResponseChar: aCharacter
+    buffer nextPut: aCharacter
+
+    "Created: / 22-06-2014 / 21:42:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:10:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+recordResponseEnd
+    record <<< buffer contents.
+    buffer reset.
+
+    "Created: / 22-06-2014 / 21:54:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMITracer class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/GDBSessionRecord.st	Fri Feb 09 10:16:01 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,285 +0,0 @@
-"
-jv:libgdbs - GNU Debugger Interface Library
-Copyright (C) 2015-now Jan Vrany
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License. 
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-"
-"{ Package: 'jv:libgdbs' }"
-
-"{ NameSpace: Smalltalk }"
-
-OrderedCollection subclass:#GDBSessionRecord
-	instanceVariableNames:'lock'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Private-Simulator'
-!
-
-Object subclass:#Command
-	instanceVariableNames:'string'
-	classVariableNames:''
-	poolDictionaries:''
-	privateIn:GDBSessionRecord
-!
-
-Object subclass:#Response
-	instanceVariableNames:'string'
-	classVariableNames:''
-	poolDictionaries:''
-	privateIn:GDBSessionRecord
-!
-
-!GDBSessionRecord class methodsFor:'documentation'!
-
-copyright
-"
-jv:libgdbs - GNU Debugger Interface Library
-Copyright (C) 2015-now Jan Vrany
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License. 
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-"
-! !
-
-!GDBSessionRecord class methodsFor:'instance creation'!
-
-new
-    ^ super new initialize.
-
-    "Created: / 24-06-2014 / 00:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-new: size
-    "return an initialized instance"
-
-    ^ (super new: size) initialize.
-
-    "Created: / 24-06-2014 / 00:06:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord methodsFor:'adding & removing'!
-
-add:anObject
-    "add the argument, anObject to the end of the collection
-     Return the argument, anObject."
-
-    ^ lock critical:[ 
-        super add:anObject
-    ].
-
-    "Modified: / 29-01-1998 / 10:52:32 / cg"
-    "Modified: / 23-06-2014 / 23:55:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-add:anObject beforeIndex:index
-    "add the argument, anObject to the end of the collection.
-     Return the receiver (sigh - ST-80 compatibility)."
-
-    ^ lock critical:[ 
-        super add:anObject beforeIndex:index
-    ].
-
-    "Modified: / 23-06-2014 / 23:55:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-addAll:aCollection beforeIndex:index
-    "insert all elements of the argument
-     Return the receiver."
-
-    ^ lock critical:[ 
-        super addAll:aCollection beforeIndex:index      
-    ].
-
-    "Modified: / 23-06-2014 / 23:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-addAllLast:aCollection
-    "add all elements of the argument, aCollection to the end of the collection.
-     Return the argument, aCollection."
-
-    ^ lock critical:[ 
-        super addAllLast:aCollection       
-    ].
-
-    "Modified: / 23-06-2014 / 23:56:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-addFirst:anObject
-    "add the argument, anObject to the beginning of the collection.
-     Return the argument, anObject."
-
-     ^ lock critical:[ 
-        super addFirst:anObject
-    ].
-
-    "Modified: / 29-01-1998 / 10:53:09 / cg"
-    "Modified: / 23-06-2014 / 23:56:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord methodsFor:'initialization'!
-
-initialize
-    "Invoked when a new instance is created."
-
-    "/ please change as required (and remove this comment)
-    super initialize.
-    lock := RecursionLock new.
-
-    "/ super initialize.   -- commented since inherited method does nothing
-
-    "Modified: / 24-06-2014 / 00:05:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord methodsFor:'printing & storing'!
-
-printOn:aStream
-    self do:[:each | each printOn: aStream ]
-
-    "Modified: / 23-06-2014 / 23:51:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord methodsFor:'recording'!
-
-<<< aString
-    self add: (Response new string: aString)
-
-    "Created: / 24-06-2014 / 00:35:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
->>> aString
-    self add: (Command new string: aString)
-
-    "Created: / 24-06-2014 / 00:35:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord methodsFor:'saving & restoring'!
-
-saveInClass: class selector: selector
-    "Save recorded session in given class under given selector"
-
-    | source |
-
-    source := String new writeStream.
-    source nextPutAll: selector; cr; cr.
-    source nextPutAll:' ^ (GDBSessionRecord new: '.
-    self size printOn: source.
-    source nextPutAll: ')'; cr; cr.
-
-    self do:[:each | 
-        each isCommand ifTrue:[ 
-            source nextPutLine: '>>>'.
-        ] ifFalse:[
-            source nextPutLine: '<<<'.
-        ].
-        each string storeOn: source.
-        source nextPut: $;; cr; cr.  
-    ].
-    source nextPutAll: 'yourself'.
-
-    class compile: source contents classified: 'recorded sessions'
-
-    "Created: / 23-06-2014 / 23:14:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 24-06-2014 / 00:44:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-saveInSimulatorResourceAs: selector
-    ^ self saveInClass: GDBSimulatorResource selector: selector
-
-    "Created: / 23-06-2014 / 23:17:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord::Command methodsFor:'accessing'!
-
-string
-    ^ string
-!
-
-string:something
-    string := something.
-! !
-
-!GDBSessionRecord::Command methodsFor:'printing & storing'!
-
-printOn:aStream
-    "append a printed representation if the receiver to the argument, aStream"
-
-    aStream nextPutLine: '>>>'.
-    string printOn: aStream.
-    aStream cr.
-
-    "Modified: / 24-06-2014 / 00:09:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord::Command methodsFor:'testing'!
-
-isCommand
-    ^ true
-
-    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-isResponse
-    ^ false
-
-    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord::Response methodsFor:'accessing'!
-
-string
-    ^ string
-!
-
-string:something
-    string := something.
-! !
-
-!GDBSessionRecord::Response methodsFor:'printing & storing'!
-
-printOn:aStream
-    "append a printed representation if the receiver to the argument, aStream"
-
-    aStream nextPutLine: '<<<'.
-    string printOn: aStream.
-    aStream cr.
-
-    "Modified: / 24-06-2014 / 00:08:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecord::Response methodsFor:'testing'!
-
-isCommand
-    ^ false
-
-    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-isResponse
-    ^ true
-
-    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
--- a/GDBSessionRecorder.st	Fri Feb 09 10:16:01 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-"
-jv:libgdbs - GNU Debugger Interface Library
-Copyright (C) 2015-now Jan Vrany
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License. 
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-"
-"{ Package: 'jv:libgdbs' }"
-
-"{ NameSpace: Smalltalk }"
-
-Object subclass:#GDBSessionRecorder
-	instanceVariableNames:'record buffer'
-	classVariableNames:''
-	poolDictionaries:'GDBDebugFlags'
-	category:'GDB-Private-Simulator'
-!
-
-!GDBSessionRecorder class methodsFor:'documentation'!
-
-copyright
-"
-jv:libgdbs - GNU Debugger Interface Library
-Copyright (C) 2015-now Jan Vrany
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License. 
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-"
-! !
-
-!GDBSessionRecorder class methodsFor:'instance creation'!
-
-new
-    "return an initialized instance"
-
-    ^ self basicNew initialize.
-! !
-
-!GDBSessionRecorder methodsFor:'initialization'!
-
-initialize
-    "Invoked when a new instance is created."
-
-    "/ please change as required (and remove this comment)
-    record := GDBSessionRecord new.
-    buffer := (String new: 100) writeStream.
-    "/ responseBuffer := nil.
-
-    "/ super initialize.   -- commented since inherited method does nothing
-
-    "Modified: / 24-06-2014 / 00:10:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecorder methodsFor:'recording'!
-
-recordCommand: command
-    record >>> command
-
-    "Created: / 22-06-2014 / 21:39:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 24-06-2014 / 00:36:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-recordResponse: aString
-    buffer nextPutAll: aString
-
-    "Created: / 22-06-2014 / 21:56:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 24-06-2014 / 00:10:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-recordResponseChar: aCharacter
-    buffer nextPut: aCharacter
-
-    "Created: / 22-06-2014 / 21:42:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 24-06-2014 / 00:10:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-recordResponseEnd
-    record <<< buffer contents.
-    buffer reset.
-
-    "Created: / 22-06-2014 / 21:54:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 24-06-2014 / 00:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBSessionRecorder class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/Make.proto	Fri Feb 09 10:16:01 2018 +0000
+++ b/Make.proto	Fri Mar 09 11:01:06 2018 +0000
@@ -139,12 +139,13 @@
 $(OUTDIR)GDBMAContainer.$(O) GDBMAContainer.$(C) GDBMAContainer.$(H): GDBMAContainer.st $(INCLUDE_TOP)/stx/goodies/magritte/Magritte__MAContainer.$(H) $(INCLUDE_TOP)/stx/goodies/magritte/Magritte__MADescription.$(H) $(INCLUDE_TOP)/stx/goodies/magritte/Magritte__MAObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMAPropertyAccessor.$(O) GDBMAPropertyAccessor.$(C) GDBMAPropertyAccessor.$(H): GDBMAPropertyAccessor.st $(INCLUDE_TOP)/stx/goodies/magritte/Magritte__MAAccessor.$(H) $(INCLUDE_TOP)/stx/goodies/magritte/Magritte__MAObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMIPrinter.$(O) GDBMIPrinter.$(C) GDBMIPrinter.$(H): GDBMIPrinter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMITrace.$(O) GDBMITrace.$(C) GDBMITrace.$(H): GDBMITrace.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)GDBMITraceViewer.$(O) GDBMITraceViewer.$(C) GDBMITraceViewer.$(H): GDBMITraceViewer.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(STCHDR)
 $(OUTDIR)GDBObject.$(O) GDBObject.$(C) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBOutputFormat.$(O) GDBOutputFormat.$(C) GDBOutputFormat.$(H): GDBOutputFormat.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBOutputFormats.$(O) GDBOutputFormats.$(C) GDBOutputFormats.$(H): GDBOutputFormats.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(C) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/TTYConstants.$(H) $(STCHDR)
 $(OUTDIR)GDBProcess.$(O) GDBProcess.$(C) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBSessionRecord.$(O) GDBSessionRecord.$(C) GDBSessionRecord.$(H): GDBSessionRecord.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadGroupType.$(O) GDBThreadGroupType.$(C) GDBThreadGroupType.$(H): GDBThreadGroupType.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadState.$(O) GDBThreadState.$(C) GDBThreadState.$(H): GDBThreadState.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTransientDataHolder.$(O) GDBTransientDataHolder.$(C) GDBTransientDataHolder.$(H): GDBTransientDataHolder.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -156,15 +157,15 @@
 $(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(C) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResultEvent.$(O) GDBCommandResultEvent.$(C) GDBCommandResultEvent.$(H): GDBCommandResultEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(C) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBFeatures.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(C) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) GDBInternalEvent.$(C) GDBInternalEvent.$(H): GDBInternalEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInvalidObjectError.$(O) GDBInvalidObjectError.$(C) GDBInvalidObjectError.$(H): GDBInvalidObjectError.st $(INCLUDE_TOP)/jv/libgdbs/GDBError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMICommand.$(O) GDBMICommand.$(C) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommand.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(C) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMITracer.$(O) GDBMITracer.$(C) GDBMITracer.$(H): GDBMITracer.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMemoryDump.$(O) GDBMemoryDump.$(C) GDBMemoryDump.$(H): GDBMemoryDump.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMemoryDumpRow.$(O) GDBMemoryDumpRow.$(C) GDBMemoryDumpRow.$(H): GDBMemoryDumpRow.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBSessionRecorder.$(O) GDBSessionRecorder.$(C) GDBSessionRecorder.$(H): GDBSessionRecorder.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) GDBStreamOutputEvent.$(C) GDBStreamOutputEvent.$(H): GDBStreamOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadGroupTypeProcess.$(O) GDBThreadGroupTypeProcess.$(C) GDBThreadGroupTypeProcess.$(H): GDBThreadGroupTypeProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadGroupType.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadInfo.$(O) GDBThreadInfo.$(C) GDBThreadInfo.$(H): GDBThreadInfo.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -299,7 +300,7 @@
 $(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(C) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTransientObject.$(O) GDBTransientObject.$(C) GDBTransientObject.$(H): GDBTransientObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariable.$(O) GDBVariable.$(C) GDBVariable.$(H): GDBVariable.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(C) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBOutputFormats.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(C) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariableObjectChange.$(O) GDBVariableObjectChange.$(C) GDBVariableObjectChange.$(H): GDBVariableObjectChange.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariableObjectExecutor.$(O) GDBVariableObjectExecutor.$(C) GDBVariableObjectExecutor.$(H): GDBVariableObjectExecutor.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointDeletedEvent.$(O) GDBBreakpointDeletedEvent.$(C) GDBBreakpointDeletedEvent.$(H): GDBBreakpointDeletedEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBNotificationEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Fri Feb 09 10:16:01 2018 +0000
+++ b/Make.spec	Fri Mar 09 11:01:06 2018 +0000
@@ -63,12 +63,13 @@
 	GDBMAContainer \
 	GDBMAPropertyAccessor \
 	GDBMIPrinter \
+	GDBMITrace \
+	GDBMITraceViewer \
 	GDBObject \
 	GDBOutputFormat \
 	GDBOutputFormats \
 	GDBPTY \
 	GDBProcess \
-	GDBSessionRecord \
 	GDBThreadGroupType \
 	GDBThreadState \
 	GDBTransientDataHolder \
@@ -86,9 +87,9 @@
 	GDBInvalidObjectError \
 	GDBMICommand \
 	GDBMIParser \
+	GDBMITracer \
 	GDBMemoryDump \
 	GDBMemoryDumpRow \
-	GDBSessionRecorder \
 	GDBStreamOutputEvent \
 	GDBThreadGroupTypeProcess \
 	GDBThreadInfo \
@@ -262,12 +263,13 @@
     $(OUTDIR)GDBMAContainer.$(O) \
     $(OUTDIR)GDBMAPropertyAccessor.$(O) \
     $(OUTDIR)GDBMIPrinter.$(O) \
+    $(OUTDIR)GDBMITrace.$(O) \
+    $(OUTDIR)GDBMITraceViewer.$(O) \
     $(OUTDIR)GDBObject.$(O) \
     $(OUTDIR)GDBOutputFormat.$(O) \
     $(OUTDIR)GDBOutputFormats.$(O) \
     $(OUTDIR)GDBPTY.$(O) \
     $(OUTDIR)GDBProcess.$(O) \
-    $(OUTDIR)GDBSessionRecord.$(O) \
     $(OUTDIR)GDBThreadGroupType.$(O) \
     $(OUTDIR)GDBThreadState.$(O) \
     $(OUTDIR)GDBTransientDataHolder.$(O) \
@@ -285,9 +287,9 @@
     $(OUTDIR)GDBInvalidObjectError.$(O) \
     $(OUTDIR)GDBMICommand.$(O) \
     $(OUTDIR)GDBMIParser.$(O) \
+    $(OUTDIR)GDBMITracer.$(O) \
     $(OUTDIR)GDBMemoryDump.$(O) \
     $(OUTDIR)GDBMemoryDumpRow.$(O) \
-    $(OUTDIR)GDBSessionRecorder.$(O) \
     $(OUTDIR)GDBStreamOutputEvent.$(O) \
     $(OUTDIR)GDBThreadGroupTypeProcess.$(O) \
     $(OUTDIR)GDBThreadInfo.$(O) \
--- a/abbrev.stc	Fri Feb 09 10:16:01 2018 +0000
+++ b/abbrev.stc	Fri Mar 09 11:01:06 2018 +0000
@@ -13,12 +13,13 @@
 GDBMAContainer GDBMAContainer jv:libgdbs 'GDB-Support' 0
 GDBMAPropertyAccessor GDBMAPropertyAccessor jv:libgdbs 'GDB-Support' 0
 GDBMIPrinter GDBMIPrinter jv:libgdbs 'GDB-Private' 0
+GDBMITrace GDBMITrace jv:libgdbs 'GDB-Private-MI Trace' 0
+GDBMITraceViewer GDBMITraceViewer jv:libgdbs 'GDB-Private-MI Trace' 2
 GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 GDBOutputFormat GDBOutputFormat jv:libgdbs 'GDB-Private' 0
 GDBOutputFormats GDBOutputFormats jv:libgdbs 'GDB-Core' 0
 GDBPTY GDBPTY jv:libgdbs 'GDB-Private' 0
 GDBProcess GDBProcess jv:libgdbs 'GDB-Private' 0
-GDBSessionRecord GDBSessionRecord jv:libgdbs 'GDB-Private-Simulator' 0
 GDBThreadGroupType GDBThreadGroupType jv:libgdbs 'GDB-Core' 1
 GDBThreadState GDBThreadState jv:libgdbs 'GDB-Core' 1
 GDBTransientDataHolder GDBTransientDataHolder jv:libgdbs 'GDB-Private' 0
@@ -36,9 +37,9 @@
 GDBInvalidObjectError GDBInvalidObjectError jv:libgdbs 'GDB-Core-Exeptions' 1
 GDBMICommand GDBMICommand jv:libgdbs 'GDB-Core-Commands' 0
 GDBMIParser GDBMIParser jv:libgdbs 'GDB-Private' 0
+GDBMITracer GDBMITracer jv:libgdbs 'GDB-Private-MI Trace' 0
 GDBMemoryDump GDBMemoryDump jv:libgdbs 'GDB-Core' 0
 GDBMemoryDumpRow GDBMemoryDumpRow jv:libgdbs 'GDB-Core' 0
-GDBSessionRecorder GDBSessionRecorder jv:libgdbs 'GDB-Private-Simulator' 0
 GDBStreamOutputEvent GDBStreamOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadGroupTypeProcess GDBThreadGroupTypeProcess jv:libgdbs 'GDB-Core' 1
 GDBThreadInfo GDBThreadInfo jv:libgdbs 'GDB-Private' 0
@@ -196,3 +197,4 @@
 GDBThreadGroupExitedEvent GDBThreadGroupExitedEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadGroupStartedEvent GDBThreadGroupStartedEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBSimulatorResource GDBSimulatorResource jv:libgdbs 'GDB-Resources' 1
+GDBMITraceViewer GDBMITraceViewer jv:libgdbs 'GDB-Private-MI Trace' 2
--- a/bc.mak	Fri Feb 09 10:16:01 2018 +0000
+++ b/bc.mak	Fri Mar 09 11:01:06 2018 +0000
@@ -86,12 +86,13 @@
 $(OUTDIR)GDBMAContainer.$(O) GDBMAContainer.$(C) GDBMAContainer.$(H): GDBMAContainer.st $(INCLUDE_TOP)\stx\goodies\magritte\Magritte__MAContainer.$(H) $(INCLUDE_TOP)\stx\goodies\magritte\Magritte__MADescription.$(H) $(INCLUDE_TOP)\stx\goodies\magritte\Magritte__MAObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMAPropertyAccessor.$(O) GDBMAPropertyAccessor.$(C) GDBMAPropertyAccessor.$(H): GDBMAPropertyAccessor.st $(INCLUDE_TOP)\stx\goodies\magritte\Magritte__MAAccessor.$(H) $(INCLUDE_TOP)\stx\goodies\magritte\Magritte__MAObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMIPrinter.$(O) GDBMIPrinter.$(C) GDBMIPrinter.$(H): GDBMIPrinter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMITrace.$(O) GDBMITrace.$(C) GDBMITrace.$(H): GDBMITrace.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)GDBMITraceViewer.$(O) GDBMITraceViewer.$(C) GDBMITraceViewer.$(H): GDBMITraceViewer.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(STCHDR)
 $(OUTDIR)GDBObject.$(O) GDBObject.$(C) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBOutputFormat.$(O) GDBOutputFormat.$(C) GDBOutputFormat.$(H): GDBOutputFormat.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBOutputFormats.$(O) GDBOutputFormats.$(C) GDBOutputFormats.$(H): GDBOutputFormats.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(C) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\TTYConstants.$(H) $(STCHDR)
 $(OUTDIR)GDBProcess.$(O) GDBProcess.$(C) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBSessionRecord.$(O) GDBSessionRecord.$(C) GDBSessionRecord.$(H): GDBSessionRecord.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadGroupType.$(O) GDBThreadGroupType.$(C) GDBThreadGroupType.$(H): GDBThreadGroupType.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadState.$(O) GDBThreadState.$(C) GDBThreadState.$(H): GDBThreadState.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTransientDataHolder.$(O) GDBTransientDataHolder.$(C) GDBTransientDataHolder.$(H): GDBTransientDataHolder.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -103,15 +104,15 @@
 $(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(C) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResultEvent.$(O) GDBCommandResultEvent.$(C) GDBCommandResultEvent.$(H): GDBCommandResultEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(C) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBFeatures.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(C) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) GDBInternalEvent.$(C) GDBInternalEvent.$(H): GDBInternalEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInvalidObjectError.$(O) GDBInvalidObjectError.$(C) GDBInvalidObjectError.$(H): GDBInvalidObjectError.st $(INCLUDE_TOP)\jv\libgdbs\GDBError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMICommand.$(O) GDBMICommand.$(C) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommand.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(C) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMITracer.$(O) GDBMITracer.$(C) GDBMITracer.$(H): GDBMITracer.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMemoryDump.$(O) GDBMemoryDump.$(C) GDBMemoryDump.$(H): GDBMemoryDump.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBMemoryDumpRow.$(O) GDBMemoryDumpRow.$(C) GDBMemoryDumpRow.$(H): GDBMemoryDumpRow.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBSessionRecorder.$(O) GDBSessionRecorder.$(C) GDBSessionRecorder.$(H): GDBSessionRecorder.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) GDBStreamOutputEvent.$(C) GDBStreamOutputEvent.$(H): GDBStreamOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadGroupTypeProcess.$(O) GDBThreadGroupTypeProcess.$(C) GDBThreadGroupTypeProcess.$(H): GDBThreadGroupTypeProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadGroupType.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadInfo.$(O) GDBThreadInfo.$(C) GDBThreadInfo.$(H): GDBThreadInfo.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -246,7 +247,7 @@
 $(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(C) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTransientObject.$(O) GDBTransientObject.$(C) GDBTransientObject.$(H): GDBTransientObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariable.$(O) GDBVariable.$(C) GDBVariable.$(H): GDBVariable.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(C) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBOutputFormats.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(C) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariableObjectChange.$(O) GDBVariableObjectChange.$(C) GDBVariableObjectChange.$(H): GDBVariableObjectChange.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBVariableObjectExecutor.$(O) GDBVariableObjectExecutor.$(C) GDBVariableObjectExecutor.$(H): GDBVariableObjectExecutor.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointDeletedEvent.$(O) GDBBreakpointDeletedEvent.$(C) GDBBreakpointDeletedEvent.$(H): GDBBreakpointDeletedEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBNotificationEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Fri Feb 09 10:16:01 2018 +0000
+++ b/jv_libgdbs.st	Fri Mar 09 11:01:06 2018 +0000
@@ -129,12 +129,13 @@
         GDBMAContainer
         GDBMAPropertyAccessor
         GDBMIPrinter
+        GDBMITrace
+        GDBMITraceViewer
         GDBObject
         GDBOutputFormat
         GDBOutputFormats
         GDBPTY
         GDBProcess
-        GDBSessionRecord
         GDBThreadGroupType
         GDBThreadState
         GDBTransientDataHolder
@@ -152,9 +153,9 @@
         GDBInvalidObjectError
         GDBMICommand
         GDBMIParser
+        GDBMITracer
         GDBMemoryDump
         GDBMemoryDumpRow
-        GDBSessionRecorder
         GDBStreamOutputEvent
         GDBThreadGroupTypeProcess
         GDBThreadInfo
@@ -312,6 +313,7 @@
         GDBThreadGroupExitedEvent
         GDBThreadGroupStartedEvent
         (GDBSimulatorResource autoload)
+        (GDBMITraceViewer autoload)
     )
 !
 
--- a/libInit.cc	Fri Feb 09 10:16:01 2018 +0000
+++ b/libInit.cc	Fri Mar 09 11:01:06 2018 +0000
@@ -28,12 +28,13 @@
 extern void _GDBMAContainer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMAPropertyAccessor_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMIPrinter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBMITrace_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBMITraceViewer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBObject_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBOutputFormat_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBOutputFormats_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBPTY_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _GDBSessionRecord_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadGroupType_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadState_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBTransientDataHolder_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -51,9 +52,9 @@
 extern void _GDBInvalidObjectError_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMICommand_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMIParser_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBMITracer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMemoryDump_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBMemoryDumpRow_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _GDBSessionRecorder_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBStreamOutputEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadGroupTypeProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadInfo_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -236,12 +237,13 @@
     _GDBMAContainer_Init(pass,__pRT__,snd);
     _GDBMAPropertyAccessor_Init(pass,__pRT__,snd);
     _GDBMIPrinter_Init(pass,__pRT__,snd);
+    _GDBMITrace_Init(pass,__pRT__,snd);
+    _GDBMITraceViewer_Init(pass,__pRT__,snd);
     _GDBObject_Init(pass,__pRT__,snd);
     _GDBOutputFormat_Init(pass,__pRT__,snd);
     _GDBOutputFormats_Init(pass,__pRT__,snd);
     _GDBPTY_Init(pass,__pRT__,snd);
     _GDBProcess_Init(pass,__pRT__,snd);
-    _GDBSessionRecord_Init(pass,__pRT__,snd);
     _GDBThreadGroupType_Init(pass,__pRT__,snd);
     _GDBThreadState_Init(pass,__pRT__,snd);
     _GDBTransientDataHolder_Init(pass,__pRT__,snd);
@@ -259,9 +261,9 @@
     _GDBInvalidObjectError_Init(pass,__pRT__,snd);
     _GDBMICommand_Init(pass,__pRT__,snd);
     _GDBMIParser_Init(pass,__pRT__,snd);
+    _GDBMITracer_Init(pass,__pRT__,snd);
     _GDBMemoryDump_Init(pass,__pRT__,snd);
     _GDBMemoryDumpRow_Init(pass,__pRT__,snd);
-    _GDBSessionRecorder_Init(pass,__pRT__,snd);
     _GDBStreamOutputEvent_Init(pass,__pRT__,snd);
     _GDBThreadGroupTypeProcess_Init(pass,__pRT__,snd);
     _GDBThreadInfo_Init(pass,__pRT__,snd);