Refactor `GDBProcess` hierarchy to improve portability
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 20 Oct 2018 07:48:11 +0100
changeset 152 fab425b52c21
parent 151 7a2a98fe63e2
child 153 dd55019f1d86
Refactor `GDBProcess` hierarchy to improve portability Spawning and managing an OS process is tightly bound to the underlaying platform (both, smalltalk-wise and OS-wise). To improve portability and clarity of the code, rename `GDBUnixProcess` and `GDBWindowsProcess` to `GDBStXUnixProcess` and `GDBStxWindowsProcess`. This commit also includes a new abstract superclass (a `GDBLocalProcess`) for all specialisation spawning and managing a GDB process running on the same host as `jv:libgdbs` code.
GDBConnection.st
GDBLocalProcess.st
GDBProcess.st
GDBRemoteProcess.st
GDBStXUnixProcess.st
GDBStXWindowsProcess.st
GDBTargetConnectedEvent.st
GDBTargetDisonnectedEvent.st
GDBUnixProcess.st
GDBWindowsProcess.st
Make.proto
Make.spec
README.md
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
tests/GDBDebuggerTestCase.st
tests/GDBDebuggerTestsR.st
tests/Make.proto
tests/bc.mak
--- a/GDBConnection.st	Thu Oct 11 09:55:43 2018 +0200
+++ b/GDBConnection.st	Sat Oct 20 07:48:11 2018 +0100
@@ -194,7 +194,7 @@
                 ].
                 self eventDispatchLoop.
             ] newProcess.
-        eventDispatchProcess name:('GDB Event dispatcher (%1)' bindWith:process pid).
+        eventDispatchProcess name:('GDB Event dispatcher (%1)' bindWith:process id).
         eventDispatchProcess priority:Processor userBackgroundPriority.
         eventDispatchProcess addExitAction:[ 
             eventDispatchProcess := nil. 
@@ -207,7 +207,7 @@
     ].
 
     "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 02-10-2018 / 13:34:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-10-2018 / 10:11:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventDispatchStop            
@@ -288,7 +288,7 @@
                 ].
                 self eventPumpLoop
             ] newProcess.
-        eventPumpProcess name:('GDB Event pump (%1)' bindWith:process pid).
+        eventPumpProcess name:('GDB Event pump (%1)' bindWith:process id).
         eventPumpProcess priority:Processor userBackgroundPriority.
         eventPumpProcess addExitAction:[ 
             TraceEvents ifTrue:[
@@ -300,7 +300,7 @@
     ].
 
     "Created: / 02-06-2014 / 22:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 20-06-2014 / 21:37:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-10-2018 / 10:07:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventPumpStop
@@ -365,15 +365,11 @@
 !
 
 release
-    | pid |
-    pid := process pid.
-    (pid notNil and:[pid > 1]) ifTrue:[
-        OperatingSystem sendSignal:(OperatingSystem sigTERM) to:process pid.       
-    ]
+    process release
 
     "Created: / 26-05-2014 / 21:30:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 05-07-2014 / 22:20:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 15:09:00 / jv"
+    "Modified: / 20-10-2018 / 07:10:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 released: status
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBLocalProcess.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,109 @@
+"
+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 }"
+
+GDBProcess subclass:#GDBLocalProcess
+	instanceVariableNames:'pid'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private'
+!
+
+!GDBLocalProcess 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
+"
+!
+
+documentation
+"
+    GDBLocalProcess is a specialization of GDBProcess that spawns a
+    local GDB process on a host machine. Spawning a running of GDB
+    process is ully managed by an (sub)instance of `GDBLocalProcess`
+    Due to platform differences, there are concrete variants for 
+    different platforms.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+        GDBStXUnixProcess
+        GDBStXWindowsProcess
+        GDBRemoteProcess
+
+"
+! !
+
+!GDBLocalProcess methodsFor:'accessing'!
+
+id
+    "Return a string identification of this GDBProcess. 
+     Used for debugging purposes only."
+
+    ^ pid
+
+    "Created: / 19-10-2018 / 10:09:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-10-2018 / 06:53:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBLocalProcess methodsFor:'initialization & release'!
+
+release
+    (pid notNil and:[pid > 1]) ifTrue:[
+        OperatingSystem sendSignal:(OperatingSystem sigTERM) to: pid.       
+    ].
+
+    "Created: / 20-10-2018 / 07:12:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBLocalProcess methodsFor:'private'!
+
+exited: status
+    "Called when spawn GDB process terminates for whatever reason"
+    pid := nil.
+    connection released: status
+
+    "Created: / 20-06-2014 / 21:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 12-01-2018 / 21:50:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:30:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBProcess.st	Thu Oct 11 09:55:43 2018 +0200
+++ b/GDBProcess.st	Sat Oct 20 07:48:11 2018 +0100
@@ -21,7 +21,7 @@
 "{ NameSpace: Smalltalk }"
 
 Object subclass:#GDBProcess
-	instanceVariableNames:'pid connection debuggerInput debuggerOutput'
+	instanceVariableNames:'connection debuggerInput debuggerOutput'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'GDB-Private'
@@ -48,21 +48,49 @@
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 "
+!
+
+documentation
+"
+    GDBProcess is represents a running GDB and provides access
+    to MI and CLI channels (see #debuggerIput / #debuggerOutput).
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+        GDBStXUnixProcess
+        GDBStXWindowsProcess
+
+"
 ! !
 
 !GDBProcess class methodsFor:'instance creation'!
 
 new
-    OperatingSystem isUNIXlike ifTrue:[ ^ GDBUnixProcess basicNew initialize].
-    OperatingSystem isMSWINDOWSlike ifTrue:[ ^ GDBWindowsProcess basicNew initialize].
-    GDBError raiseErrorString: 'Unssuported operating system'.
+    self == GDBProcess ifTrue:[
+        Smalltalk isSmalltalkX ifTrue:[
+            OperatingSystem isUNIXlike ifTrue:[
+                ^ GDBStXUnixProcess basicNew initialize
+            ].
+            OperatingSystem isMSWINDOWSlike ifTrue:[
+                ^ GDBStXWindowsProcess basicNew initialize
+            ]
+        ].
+        GDBError raiseErrorString:'Unsuported platform'.
+    ] ifFalse:[ 
+        ^ super new.
+    ].
 
     "
-    GDBProcess new release.
-    "
+     GDBProcess new release."
 
-    "Modified: / 16-12-2017 / 00:10:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (comment): / 11-01-2018 / 23:02:11 / jv"
+    "Modified: / 19-10-2018 / 10:03:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBProcess class methodsFor:'accessing'!
@@ -134,43 +162,76 @@
 !
 
 consoleInput
+    "Return a write stream on debugger's CLI channel. CLI commands
+     should be written here. If this process does not have a CLI
+     channel opened, `nil` is returned. In this case, CLI must be
+     emulated - if required. See `-interpreter-exec` MI command.
+
+     CLI channel is generally available only on Smalltalk/X and only
+     on UNIX platform where this stream points to TTY."
+
     ^ nil
 
     "Created: / 02-06-2017 / 23:35:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 15-12-2017 / 23:58:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:20:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 consoleOutput
+    "Return a read stream on debugger's CLI channel. CLI output
+     should be read from. If this process does not have a CLI
+     channel opened, `nil` is returned. In this case, CLI must be
+     emulated - if required.
+
+     CLI channel is generally available only on Smalltalk/X and only
+     on UNIX platform where this stream points to TTY."
+
     ^ nil
 
     "Created: / 02-06-2017 / 23:35:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 15-12-2017 / 23:58:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:21:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 debuggerInput
-    "raise an error: must be redefined in concrete subclass(es)"
+    "Return a write stream on debugger's MI channel. (MI) commands
+     should be written there."
 
     ^ debuggerInput
 
     "Modified: / 15-12-2017 / 23:58:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:14:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 debuggerOutput
-    "raise an error: must be redefined in concrete subclass(es)"
+    "Return read stream on debuugger's MI channel. Command responses
+     and events should be read from here"
 
     ^ debuggerOutput
 
     "Modified: / 15-12-2017 / 23:58:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:15:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-nativeTargetFeatures
+id
+    "Return a string identification of this GDBProcess. 
+     Used for debugging purposes only."
+
     ^ self subclassResponsibility
 
-    "Created: / 09-04-2018 / 15:40:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 19-10-2018 / 10:08:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-pid
-    ^ pid
+nativeTargetFeatures    
+    "Return default native target features. This is used when
+     used GDB does not support =target-connected and =target-disconnected
+     events."
+
+    "/ Be conservative and  report no features at all...
+    ^ #()
+
+    "Created: / 09-04-2018 / 15:40:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 17-10-2018 / 22:12:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBProcess methodsFor:'initialization & release'!
@@ -181,16 +242,6 @@
     ^ self subclassResponsibility
 ! !
 
-!GDBProcess methodsFor:'private'!
-
-exited: status
-    pid := nil.
-    connection released: status
-
-    "Created: / 20-06-2014 / 21:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-01-2018 / 21:50:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !GDBProcess class methodsFor:'documentation'!
 
 version_HG
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBRemoteProcess.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,124 @@
+"
+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 }"
+
+GDBProcess subclass:#GDBRemoteProcess
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private'
+!
+
+!GDBRemoteProcess 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
+"
+!
+
+documentation
+"
+    A GDBRemoteProcess represent a GDB process external to libgdbs. This means
+    the user us responsible for launching the actuall GDB and setting up
+    a connection to its MI channel:
+
+       | process debugger |
+
+       process := GDBRemoteProcess new.
+       process debuggerInput: miChannel writeStream.
+       process debuggerOutput: miChannel readStream.
+       debugger := GDBDebugger newWithProcess: process.
+
+    Onw way to use this might be to run GDB through
+    `socat` [1], exposing it's MI channel over TCP socket:
+
+        socat TCP4-LISTEN:1234 EXEC:'gdb -i mi2'
+
+    This is useful for example when host running libgdbs
+    does not have suitable GDB installed or on environments 
+    where no 'native' implementation of `GDBProcess` (such as
+    `GDBStXUnixProcess`) exists (such as Bee Smalltalk)
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+        GDBLocalProcess
+
+"
+! !
+
+!GDBRemoteProcess methodsFor:'accessing'!
+
+connection:aGDBConnection
+    self assert: debuggerInput notNil.
+    self assert: debuggerOutput notNil.
+
+    super connection:aGDBConnection
+
+    "Created: / 17-10-2018 / 22:37:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+debuggerInput:aWriteStream
+    "Set a write stream on debugger's MI channel. See #debuggerInput."
+
+    debuggerInput := aWriteStream.
+
+    "Modified (comment): / 17-10-2018 / 22:36:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+debuggerOutput:aReadStream
+    "Set a read stream on debugger's MI channel. See #debuggerOutput."
+
+    debuggerOutput := aReadStream.
+
+    "Modified (comment): / 17-10-2018 / 22:35:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+id
+    "Return a string identification of this GDBProcess. 
+     Used for debugging purposes only."
+
+    ^ 'remote'
+
+    "Created: / 19-10-2018 / 10:10:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBStXUnixProcess.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,163 @@
+"
+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 }"
+
+GDBLocalProcess subclass:#GDBStXUnixProcess
+	instanceVariableNames:'debuggerPTY consolePTY'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private'
+!
+
+!GDBStXUnixProcess 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
+"
+!
+
+documentation
+"
+
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!GDBStXUnixProcess methodsFor:'accessing'!
+
+consoleInput
+    ^ consolePTY master
+
+    "Created: / 02-06-2017 / 23:36:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+consoleOutput
+    ^ consolePTY master
+
+    "Created: / 02-06-2017 / 23:36:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nativeTargetFeatures
+    ^ #('async')
+
+    "Created: / 09-04-2018 / 15:40:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBStXUnixProcess methodsFor:'initialization & release'!
+
+initialize
+    | exe conpty dbgpty args |
+
+    exe := self class gdbExecutable.
+    (exe isNil or:[ exe asFilename isExecutable not ]) ifTrue:[ 
+        GDBError raiseErrorString: 'Could not find gdb, please set path to gdb using GDBProcess class >> gdbExecutable:'.
+        ^ self.
+    ].
+
+    conpty := GDBPTY new.
+    dbgpty := GDBPTY new.
+    dbgpty setLocalEcho: false.
+    dbgpty setOutputCRLF: false.
+
+    args := (Array new: 6)
+                at: 1 put: exe;
+                at: 2 put: '-q';
+                at: 3 put: '-ex';
+                at: 4 put: 'new-ui mi ', dbgpty name;
+                at: 5 put: '-ex';
+                at: 6 put: 'set pagination off';
+                yourself.
+    Processor
+        monitor:[
+            pid := OperatingSystem
+                    exec:args first
+                    withArguments:args
+                    environment:OperatingSystem getEnvironment
+                    fileDescriptors:{
+                            conpty slave fileDescriptor.
+                            conpty slave fileDescriptor.
+                            conpty slave fileDescriptor
+                        }
+                    fork:true
+                    newPgrp:false
+                    inDirectory:Filename currentDirectory
+                    showWindow: false.
+            consolePTY := conpty.
+            debuggerPTY := dbgpty.
+            debuggerInput := debuggerOutput := debuggerPTY master.
+            pid.
+        ]
+        action:[:stat | self exited:stat ].
+    pid isNil ifTrue:[
+        conpty close.
+        dbgpty close.
+        self error:'Failed to launch gdb'.
+    ].
+
+    "Modified: / 03-10-2018 / 22:22:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+release
+    debuggerPTY notNil ifTrue:[
+        debuggerPTY release.
+        debuggerInput := debuggerOutput := nil
+    ].
+    consolePTY notNil ifTrue:[
+        consolePTY release.
+    ].
+    super release
+
+    "Created: / 02-06-2017 / 23:33:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 15-12-2017 / 23:59:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBStXUnixProcess class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBStXWindowsProcess.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,202 @@
+"
+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 }"
+
+GDBLocalProcess subclass:#GDBStXWindowsProcess
+	instanceVariableNames:'debuggerError errorPumpProcess'
+	classVariableNames:''
+	poolDictionaries:'GDBDebugFlags'
+	category:'GDB-Private'
+!
+
+!GDBStXWindowsProcess 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
+"
+!
+
+documentation
+"
+    documentation to be added.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!GDBStXWindowsProcess methodsFor:'error pump'!
+
+errorPumpLoop
+    [ debuggerError atEnd ] whileFalse:[
+        debuggerError readWait.
+        debuggerError atEnd ifFalse:[
+            | line |
+
+            line := debuggerError nextLine.
+            line notNil ifTrue:[ 
+                Logger log: line severity: #error facility: 'GDB'
+            ].
+        ].
+    ]
+
+    "Created: / 15-01-2018 / 09:31:39 / jv"
+!
+
+errorPumpStart
+    errorPumpProcess isNil ifTrue:[
+        errorPumpProcess := [
+                TraceEvents ifTrue:[
+                    Logger log: 'error pump: starting' severity: #trace facility: 'GDB'
+                ].
+                self errorPumpLoop
+            ] newProcess.
+        errorPumpProcess name:('GDB Error pump (%1)' bindWith: self id).
+        errorPumpProcess priority:Processor userBackgroundPriority.
+        errorPumpProcess addExitAction:[ 
+            TraceEvents ifTrue:[
+                Logger log: 'error pump: terminated' severity: #trace facility: 'GDB'
+            ].
+            errorPumpProcess := nil. 
+        ].
+        errorPumpProcess resume.
+    ].
+
+    "Created: / 15-01-2018 / 09:28:06 / jv"
+    "Modified: / 20-10-2018 / 06:53:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+errortPumpStop
+    | t |
+
+    t := errorPumpProcess.
+    (t notNil and:[ t isDead not]) ifTrue:[ 
+        errorPumpProcess := nil.
+        t terminate.
+         "/ raise its prio to make it terminate quickly
+        t priority:(Processor userSchedulingPriority + 1)                       
+    ].
+
+    "Created: / 15-01-2018 / 09:29:49 / jv"
+! !
+
+!GDBStXWindowsProcess methodsFor:'initialization & release'!
+
+initialize
+    | exe inputPipe  input  outputPipe  output errorPipe error args |
+
+    exe := self class gdbExecutable.
+    (exe isNil or:[ exe asFilename isExecutable not ]) ifTrue:[ 
+        GDBError raiseErrorString: 'Could not find gdb, please set path to gdb using GDBProcess class >> gdbExecutable:'.
+        ^ self.
+    ].
+
+    inputPipe := NonPositionableExternalStream makePipe.
+    input := inputPipe second.
+    outputPipe := NonPositionableExternalStream makePipe.
+    output := outputPipe first.
+    errorPipe := NonPositionableExternalStream makePipe.
+    error := outputPipe first.
+    
+    args := (Array new: 7)
+             at: 1 put: exe;
+             at: 2 put: '-q';
+             at: 3 put: '-nx';
+             at: 4 put: '--interpreter';
+             at: 5 put: 'mi2';
+             at: 6 put: '-ex';
+             at: 7 put: 'set new-console on';
+             yourself.
+    Processor 
+        monitor:[
+            pid := OperatingSystem 
+                    exec:args first
+                    withArguments:args
+                    environment:OperatingSystem getEnvironment
+                    fileDescriptors: (Array
+                            with: inputPipe first fileDescriptor
+                            with: outputPipe second fileDescriptor
+                            with: errorPipe second fileDescriptor
+                        )
+                    fork:true
+                    newPgrp:false
+                    inDirectory:Filename currentDirectory
+                    showWindow: false.      
+            debuggerInput := input.
+            debuggerOutput := output.
+            debuggerError := error.
+            pid.
+        ]
+        action:[:stat | self exited:stat. ].
+    inputPipe first close.
+    outputPipe second close.
+    errorPipe second close.
+    pid isNil ifTrue:[
+        input close.
+        output close.
+        error close.
+        self error:'Failed to launch gdb'.
+    ].
+
+    "Created: / 12-12-2017 / 21:04:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 15-01-2018 / 09:35:03 / jv"
+    "Modified: / 03-10-2018 / 22:22:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+release
+    pid := connection := nil.
+    debuggerInput notNil ifTrue:[ debuggerInput close ].
+    debuggerOutput notNil ifTrue:[ debuggerOutput close ].
+
+    "Created: / 20-06-2014 / 21:35:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 15-12-2017 / 23:59:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBStXWindowsProcess class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBTargetConnectedEvent.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,58 @@
+"
+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 }"
+
+GDBNotificationEvent subclass:#GDBTargetConnectedEvent
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-Events'
+!
+
+!GDBTargetConnectedEvent 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
+"
+! !
+
+!GDBTargetConnectedEvent methodsFor:'accessing'!
+
+type
+	^  'target-connected'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBTargetDisonnectedEvent.st	Sat Oct 20 07:48:11 2018 +0100
@@ -0,0 +1,52 @@
+"
+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 }"
+
+GDBNotificationEvent subclass:#GDBTargetDisonnectedEvent
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-Events'
+!
+
+!GDBTargetDisonnectedEvent 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
+"
+! !
+
--- a/GDBUnixProcess.st	Thu Oct 11 09:55:43 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +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 }"
-
-GDBProcess subclass:#GDBUnixProcess
-	instanceVariableNames:'debuggerPTY consolePTY'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Private'
-!
-
-!GDBUnixProcess 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
-"
-! !
-
-!GDBUnixProcess methodsFor:'accessing'!
-
-consoleInput
-    ^ consolePTY master
-
-    "Created: / 02-06-2017 / 23:36:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-consoleOutput
-    ^ consolePTY master
-
-    "Created: / 02-06-2017 / 23:36:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-nativeTargetFeatures
-    ^ #('async')
-
-    "Created: / 09-04-2018 / 15:40:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBUnixProcess methodsFor:'initialization & release'!
-
-initialize
-    | exe conpty dbgpty args |
-
-    exe := self class gdbExecutable.
-    (exe isNil or:[ exe asFilename isExecutable not ]) ifTrue:[ 
-        GDBError raiseErrorString: 'Could not find gdb, please set path to gdb using GDBProcess class >> gdbExecutable:'.
-        ^ self.
-    ].
-
-    conpty := GDBPTY new.
-    dbgpty := GDBPTY new.
-    dbgpty setLocalEcho: false.
-    dbgpty setOutputCRLF: false.
-
-    args := (Array new: 6)
-                at: 1 put: exe;
-                at: 2 put: '-q';
-                at: 3 put: '-ex';
-                at: 4 put: 'new-ui mi ', dbgpty name;
-                at: 5 put: '-ex';
-                at: 6 put: 'set pagination off';
-                yourself.
-    Processor
-        monitor:[
-            pid := OperatingSystem
-                    exec:args first
-                    withArguments:args
-                    environment:OperatingSystem getEnvironment
-                    fileDescriptors:{
-                            conpty slave fileDescriptor.
-                            conpty slave fileDescriptor.
-                            conpty slave fileDescriptor
-                        }
-                    fork:true
-                    newPgrp:false
-                    inDirectory:Filename currentDirectory
-                    showWindow: false.
-            consolePTY := conpty.
-            debuggerPTY := dbgpty.
-            debuggerInput := debuggerOutput := debuggerPTY master.
-            pid.
-        ]
-        action:[:stat | self exited:stat ].
-    pid isNil ifTrue:[
-        conpty close.
-        dbgpty close.
-        self error:'Failed to launch gdb'.
-    ].
-
-    "Modified: / 03-10-2018 / 22:22:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-release
-    debuggerPTY notNil ifTrue:[
-        debuggerPTY release.
-        debuggerInput := debuggerOutput := nil
-    ].
-    consolePTY notNil ifTrue:[
-        consolePTY release.
-    ].
-    super release
-
-    "Created: / 02-06-2017 / 23:33:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-12-2017 / 23:59:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBUnixProcess class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/GDBWindowsProcess.st	Thu Oct 11 09:55:43 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +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 }"
-
-GDBProcess subclass:#GDBWindowsProcess
-	instanceVariableNames:'debuggerError errorPumpProcess'
-	classVariableNames:''
-	poolDictionaries:'GDBDebugFlags'
-	category:'GDB-Private'
-!
-
-!GDBWindowsProcess 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
-"
-! !
-
-!GDBWindowsProcess methodsFor:'accessing'!
-
-nativeTargetFeatures
-    ^ #()
-
-    "Created: / 09-04-2018 / 15:41:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBWindowsProcess methodsFor:'error pump'!
-
-errorPumpLoop
-    [ debuggerError atEnd ] whileFalse:[
-        debuggerError readWait.
-        debuggerError atEnd ifFalse:[
-            | line |
-
-            line := debuggerError nextLine.
-            line notNil ifTrue:[ 
-                Logger log: line severity: #error facility: 'GDB'
-            ].
-        ].
-    ]
-
-    "Created: / 15-01-2018 / 09:31:39 / jv"
-!
-
-errorPumpStart
-    errorPumpProcess isNil ifTrue:[
-        errorPumpProcess := [
-                TraceEvents ifTrue:[
-                    Logger log: 'error pump: starting' severity: #trace facility: 'GDB'
-                ].
-                self errorPumpLoop
-            ] newProcess.
-        errorPumpProcess name:('GDB Error pump (%1)' bindWith:pid pid).
-        errorPumpProcess priority:Processor userBackgroundPriority.
-        errorPumpProcess addExitAction:[ 
-            TraceEvents ifTrue:[
-                Logger log: 'error pump: terminated' severity: #trace facility: 'GDB'
-            ].
-            errorPumpProcess := nil. 
-        ].
-        errorPumpProcess resume.
-    ].
-
-    "Created: / 15-01-2018 / 09:28:06 / jv"
-!
-
-errortPumpStop
-    | t |
-
-    t := errorPumpProcess.
-    (t notNil and:[ t isDead not]) ifTrue:[ 
-        errorPumpProcess := nil.
-        t terminate.
-         "/ raise its prio to make it terminate quickly
-        t priority:(Processor userSchedulingPriority + 1)                       
-    ].
-
-    "Created: / 15-01-2018 / 09:29:49 / jv"
-! !
-
-!GDBWindowsProcess methodsFor:'initialization & release'!
-
-initialize
-    | exe inputPipe  input  outputPipe  output errorPipe error args |
-
-    exe := self class gdbExecutable.
-    (exe isNil or:[ exe asFilename isExecutable not ]) ifTrue:[ 
-        GDBError raiseErrorString: 'Could not find gdb, please set path to gdb using GDBProcess class >> gdbExecutable:'.
-        ^ self.
-    ].
-
-    inputPipe := NonPositionableExternalStream makePipe.
-    input := inputPipe second.
-    outputPipe := NonPositionableExternalStream makePipe.
-    output := outputPipe first.
-    errorPipe := NonPositionableExternalStream makePipe.
-    error := outputPipe first.
-    
-    args := (Array new: 7)
-             at: 1 put: exe;
-             at: 2 put: '-q';
-             at: 3 put: '-nx';
-             at: 4 put: '--interpreter';
-             at: 5 put: 'mi2';
-             at: 6 put: '-ex';
-             at: 7 put: 'set new-console on';
-             yourself.
-    Processor 
-        monitor:[
-            pid := OperatingSystem 
-                    exec:args first
-                    withArguments:args
-                    environment:OperatingSystem getEnvironment
-                    fileDescriptors: (Array
-                            with: inputPipe first fileDescriptor
-                            with: outputPipe second fileDescriptor
-                            with: errorPipe second fileDescriptor
-                        )
-                    fork:true
-                    newPgrp:false
-                    inDirectory:Filename currentDirectory
-                    showWindow: false.      
-            debuggerInput := input.
-            debuggerOutput := output.
-            debuggerError := error.
-            pid.
-        ]
-        action:[:stat | self exited:stat. ].
-    inputPipe first close.
-    outputPipe second close.
-    errorPipe second close.
-    pid isNil ifTrue:[
-        input close.
-        output close.
-        error close.
-        self error:'Failed to launch gdb'.
-    ].
-
-    "Created: / 12-12-2017 / 21:04:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-01-2018 / 09:35:03 / jv"
-    "Modified: / 03-10-2018 / 22:22:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-release
-    pid := connection := nil.
-    debuggerInput notNil ifTrue:[ debuggerInput close ].
-    debuggerOutput notNil ifTrue:[ debuggerOutput close ].
-
-    "Created: / 20-06-2014 / 21:35:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-12-2017 / 23:59:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBWindowsProcess class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/Make.proto	Thu Oct 11 09:55:43 2018 +0200
+++ b/Make.proto	Sat Oct 20 07:48:11 2018 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/announcements -I$(INCLUDE_TOP)/stx/goodies/magritte -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/announcements -I$(INCLUDE_TOP)/stx/goodies/magritte -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/lint -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg
 
 
 # if you need any additional defines for embedded C code,
@@ -103,10 +103,14 @@
 prereq:
 	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/helpers && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/parser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/browser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libwidg && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/lint && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/goodies/magritte && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
@@ -169,12 +173,14 @@
 $(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)GDBLocalProcess.$(O) GDBLocalProcess.$(C) GDBLocalProcess.$(H): GDBLocalProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(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)GDBRegister.$(O) GDBRegister.$(C) GDBRegister.$(H): GDBRegister.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBRemoteProcess.$(O) GDBRemoteProcess.$(C) GDBRemoteProcess.$(H): GDBRemoteProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(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)
@@ -182,9 +188,7 @@
 $(OUTDIR)GDBThreadStateStopped.$(O) GDBThreadStateStopped.$(C) GDBThreadStateStopped.$(H): GDBThreadStateStopped.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadState.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateTerminated.$(O) GDBThreadStateTerminated.$(C) GDBThreadStateTerminated.$(H): GDBThreadStateTerminated.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadState.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateUnknown.$(O) GDBThreadStateUnknown.$(C) GDBThreadStateUnknown.$(H): GDBThreadStateUnknown.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadState.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(C) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnsupportedFeatureError.$(O) GDBUnsupportedFeatureError.$(C) GDBUnsupportedFeatureError.$(H): GDBUnsupportedFeatureError.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)GDBWindowsProcess.$(O) GDBWindowsProcess.$(C) GDBWindowsProcess.$(H): GDBWindowsProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(C) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(C) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSetEvent.$(O) GDBEventSetEvent.$(C) GDBEventSetEvent.$(H): GDBEventSetEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBInternalEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -306,6 +310,8 @@
 $(OUTDIR)GDBNotificationEvent.$(O) GDBNotificationEvent.$(C) GDBNotificationEvent.$(H): GDBNotificationEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBRegisterWithValue.$(O) GDBRegisterWithValue.$(C) GDBRegisterWithValue.$(H): GDBRegisterWithValue.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSelectedFrameChangedEvent.$(O) GDBSelectedFrameChangedEvent.$(C) GDBSelectedFrameChangedEvent.$(H): GDBSelectedFrameChangedEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBInternalEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBStXUnixProcess.$(O) GDBStXUnixProcess.$(C) GDBStXUnixProcess.$(H): GDBStXUnixProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBLocalProcess.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBStXWindowsProcess.$(O) GDBStXWindowsProcess.$(C) GDBStXWindowsProcess.$(H): GDBStXWindowsProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBLocalProcess.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStatusEvent.$(O) GDBStatusEvent.$(C) GDBStatusEvent.$(H): GDBStatusEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTargetOutputEvent.$(O) GDBTargetOutputEvent.$(C) GDBTargetOutputEvent.$(H): GDBTargetOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThread.$(O) GDBThread.$(C) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -324,6 +330,8 @@
 $(OUTDIR)GDBLibraryUnloadedEvent.$(O) GDBLibraryUnloadedEvent.$(C) GDBLibraryUnloadedEvent.$(H): GDBLibraryUnloadedEvent.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)
 $(OUTDIR)GDBRunningEvent.$(O) GDBRunningEvent.$(C) GDBRunningEvent.$(H): GDBRunningEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBExecutionEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStoppedEvent.$(O) GDBStoppedEvent.$(C) GDBStoppedEvent.$(H): GDBStoppedEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBExecutionEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBTargetConnectedEvent.$(O) GDBTargetConnectedEvent.$(C) GDBTargetConnectedEvent.$(H): GDBTargetConnectedEvent.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)
+$(OUTDIR)GDBTargetDisonnectedEvent.$(O) GDBTargetDisonnectedEvent.$(C) GDBTargetDisonnectedEvent.$(H): GDBTargetDisonnectedEvent.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)
 $(OUTDIR)GDBThreadEvent.$(O) GDBThreadEvent.$(C) GDBThreadEvent.$(H): GDBThreadEvent.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)
 $(OUTDIR)GDBThreadGroupEvent.$(O) GDBThreadGroupEvent.$(C) GDBThreadGroupEvent.$(H): GDBThreadGroupEvent.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)
 $(OUTDIR)GDBThreadSelectedEvent.$(O) GDBThreadSelectedEvent.$(C) GDBThreadSelectedEvent.$(H): GDBThreadSelectedEvent.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	Thu Oct 11 09:55:43 2018 +0200
+++ b/Make.spec	Sat Oct 20 07:48:11 2018 +0100
@@ -93,12 +93,14 @@
 	GDBDebuggerObject \
 	GDBInternalEvent \
 	GDBInvalidObjectError \
+	GDBLocalProcess \
 	GDBMICommand \
 	GDBMIParser \
 	GDBMITracer \
 	GDBMemoryDump \
 	GDBMemoryDumpRow \
 	GDBRegister \
+	GDBRemoteProcess \
 	GDBStreamOutputEvent \
 	GDBThreadGroupTypeProcess \
 	GDBThreadInfo \
@@ -106,9 +108,7 @@
 	GDBThreadStateStopped \
 	GDBThreadStateTerminated \
 	GDBThreadStateUnknown \
-	GDBUnixProcess \
 	GDBUnsupportedFeatureError \
-	GDBWindowsProcess \
 	GDBBreakpoint \
 	GDBConsoleOutputEvent \
 	GDBEventSetEvent \
@@ -230,6 +230,8 @@
 	GDBNotificationEvent \
 	GDBRegisterWithValue \
 	GDBSelectedFrameChangedEvent \
+	GDBStXUnixProcess \
+	GDBStXWindowsProcess \
 	GDBStatusEvent \
 	GDBTargetOutputEvent \
 	GDBThread \
@@ -248,6 +250,8 @@
 	GDBLibraryUnloadedEvent \
 	GDBRunningEvent \
 	GDBStoppedEvent \
+	GDBTargetConnectedEvent \
+	GDBTargetDisonnectedEvent \
 	GDBThreadEvent \
 	GDBThreadGroupEvent \
 	GDBThreadSelectedEvent \
@@ -305,12 +309,14 @@
     $(OUTDIR)GDBDebuggerObject.$(O) \
     $(OUTDIR)GDBInternalEvent.$(O) \
     $(OUTDIR)GDBInvalidObjectError.$(O) \
+    $(OUTDIR)GDBLocalProcess.$(O) \
     $(OUTDIR)GDBMICommand.$(O) \
     $(OUTDIR)GDBMIParser.$(O) \
     $(OUTDIR)GDBMITracer.$(O) \
     $(OUTDIR)GDBMemoryDump.$(O) \
     $(OUTDIR)GDBMemoryDumpRow.$(O) \
     $(OUTDIR)GDBRegister.$(O) \
+    $(OUTDIR)GDBRemoteProcess.$(O) \
     $(OUTDIR)GDBStreamOutputEvent.$(O) \
     $(OUTDIR)GDBThreadGroupTypeProcess.$(O) \
     $(OUTDIR)GDBThreadInfo.$(O) \
@@ -318,9 +324,7 @@
     $(OUTDIR)GDBThreadStateStopped.$(O) \
     $(OUTDIR)GDBThreadStateTerminated.$(O) \
     $(OUTDIR)GDBThreadStateUnknown.$(O) \
-    $(OUTDIR)GDBUnixProcess.$(O) \
     $(OUTDIR)GDBUnsupportedFeatureError.$(O) \
-    $(OUTDIR)GDBWindowsProcess.$(O) \
     $(OUTDIR)GDBBreakpoint.$(O) \
     $(OUTDIR)GDBConsoleOutputEvent.$(O) \
     $(OUTDIR)GDBEventSetEvent.$(O) \
@@ -442,6 +446,8 @@
     $(OUTDIR)GDBNotificationEvent.$(O) \
     $(OUTDIR)GDBRegisterWithValue.$(O) \
     $(OUTDIR)GDBSelectedFrameChangedEvent.$(O) \
+    $(OUTDIR)GDBStXUnixProcess.$(O) \
+    $(OUTDIR)GDBStXWindowsProcess.$(O) \
     $(OUTDIR)GDBStatusEvent.$(O) \
     $(OUTDIR)GDBTargetOutputEvent.$(O) \
     $(OUTDIR)GDBThread.$(O) \
@@ -460,6 +466,8 @@
     $(OUTDIR)GDBLibraryUnloadedEvent.$(O) \
     $(OUTDIR)GDBRunningEvent.$(O) \
     $(OUTDIR)GDBStoppedEvent.$(O) \
+    $(OUTDIR)GDBTargetConnectedEvent.$(O) \
+    $(OUTDIR)GDBTargetDisonnectedEvent.$(O) \
     $(OUTDIR)GDBThreadEvent.$(O) \
     $(OUTDIR)GDBThreadGroupEvent.$(O) \
     $(OUTDIR)GDBThreadSelectedEvent.$(O) \
--- a/README.md	Thu Oct 11 09:55:43 2018 +0200
+++ b/README.md	Sat Oct 20 07:48:11 2018 +0100
@@ -1,24 +1,29 @@
 # libgdbs
 
-*libgdbs* is a library providing smalltalk interface for GDB. 
+*libgdbs* is a library providing smalltalk interface for GDB.
 
 ## Features
 
  * event-based interface
  * convenient API to inspect and query current state of a debugee
  * support for custom disassembler allowing for custom code analysis
-  
+
 ## Building from Source
 
-*libgsbs* is a part of [Smalltalk/X jv-branch][3] since version 8.0.0. To 
-build *libgsbs*, just follow instructions how to [build 
+*libgsbs* is a part of [Smalltalk/X jv-branch][3] since version 8.0.0. To
+build *libgsbs*, just follow instructions how to [build
 Smalltalk/X jv-branch][6]
 
+## Prerequisites
+
+As of today, *libgdbs* requires a very recent GDB. Likely you'd need to
+compile a GDB yourself - see [GDB.md][9]
+
 ## Reporting issues
 
 Use [Smalltalk/X jv-branch issue tracker][6] to [report issues][7] (you may need
 to login using your Google account in order to submit an issue). Alternatively,
-send a message to [Smalltalk/X mailing list][8]. 
+send a message to [Smalltalk/X mailing list][8].
 
 ## Author
 
@@ -26,10 +31,10 @@
 
 ## License
 
-This software is licensed under *GNU LESSER GENERAL PUBLIC LICENSE Version 2.1*. 
+This software is licensed under *GNU LESSER GENERAL PUBLIC LICENSE Version 2.1*.
 You may find a full license text in `LICENSE.txt`.
 
-For permissions beyond the scope of this license please contact author at 
+For permissions beyond the scope of this license please contact author at
 `<jan.vrany [at] fit.cvut.cz>`
 
 [2]: https://www.gnu.org/software/gdb/
@@ -38,4 +43,5 @@
 [5]: https://swing.fit.cvut.cz/jenkins/job/stx_jv/lastSuccessfulBuild/
 [6]: https://swing.fit.cvut.cz/projects/stx-jv/report/9
 [7]: https://swing.fit.cvut.cz/projects/stx-jv/newticket
-[8]: https://groups.google.com/forum/#!forum/stx-jv
\ No newline at end of file
+[8]: https://groups.google.com/forum/#!forum/stx-jv
+[9]: doc/GDB.md
--- a/abbrev.stc	Thu Oct 11 09:55:43 2018 +0200
+++ b/abbrev.stc	Sat Oct 20 07:48:11 2018 +0100
@@ -43,12 +43,14 @@
 GDBDebuggerObject GDBDebuggerObject jv:libgdbs 'GDB-Core' 0
 GDBInternalEvent GDBInternalEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBInvalidObjectError GDBInvalidObjectError jv:libgdbs 'GDB-Core-Exeptions' 1
+GDBLocalProcess GDBLocalProcess jv:libgdbs 'GDB-Private' 0
 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
 GDBRegister GDBRegister jv:libgdbs 'GDB-Core' 0
+GDBRemoteProcess GDBRemoteProcess jv:libgdbs 'GDB-Private' 0
 GDBStreamOutputEvent GDBStreamOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadGroupTypeProcess GDBThreadGroupTypeProcess jv:libgdbs 'GDB-Core' 1
 GDBThreadInfo GDBThreadInfo jv:libgdbs 'GDB-Private' 0
@@ -56,9 +58,7 @@
 GDBThreadStateStopped GDBThreadStateStopped jv:libgdbs 'GDB-Core' 1
 GDBThreadStateTerminated GDBThreadStateTerminated jv:libgdbs 'GDB-Core' 1
 GDBThreadStateUnknown GDBThreadStateUnknown jv:libgdbs 'GDB-Core' 1
-GDBUnixProcess GDBUnixProcess jv:libgdbs 'GDB-Private' 0
 GDBUnsupportedFeatureError GDBUnsupportedFeatureError jv:libgdbs 'GDB-Core-Exeptions' 1
-GDBWindowsProcess GDBWindowsProcess jv:libgdbs 'GDB-Private' 0
 GDBBreakpoint GDBBreakpoint jv:libgdbs 'GDB-Core' 0
 GDBConsoleOutputEvent GDBConsoleOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBEventSetEvent GDBEventSetEvent jv:libgdbs 'GDB-Core-Events' 0
@@ -180,6 +180,8 @@
 GDBNotificationEvent GDBNotificationEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBRegisterWithValue GDBRegisterWithValue jv:libgdbs 'GDB-Core' 0
 GDBSelectedFrameChangedEvent GDBSelectedFrameChangedEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBStXUnixProcess GDBStXUnixProcess jv:libgdbs 'GDB-Private' 0
+GDBStXWindowsProcess GDBStXWindowsProcess jv:libgdbs 'GDB-Private' 0
 GDBStatusEvent GDBStatusEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBTargetOutputEvent GDBTargetOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThread GDBThread jv:libgdbs 'GDB-Core' 0
@@ -198,6 +200,8 @@
 GDBLibraryUnloadedEvent GDBLibraryUnloadedEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBRunningEvent GDBRunningEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBStoppedEvent GDBStoppedEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBTargetConnectedEvent GDBTargetConnectedEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBTargetDisonnectedEvent GDBTargetDisonnectedEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadEvent GDBThreadEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadGroupEvent GDBThreadGroupEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBThreadSelectedEvent GDBThreadSelectedEvent jv:libgdbs 'GDB-Core-Events' 0
--- a/bc.mak	Thu Oct 11 09:55:43 2018 +0200
+++ b/bc.mak	Sat Oct 20 07:48:11 2018 +0100
@@ -35,7 +35,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\announcements -I$(INCLUDE_TOP)\stx\goodies\magritte -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\announcements -I$(INCLUDE_TOP)\stx\goodies\magritte -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\lint -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -53,10 +53,14 @@
 prereq:
 	pushd ..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\refactoryBrowser\helpers & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\refactoryBrowser\parser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\refactoryBrowser\browser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\libwidg & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\refactoryBrowser\lint & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\goodies\magritte & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
@@ -116,12 +120,14 @@
 $(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)GDBLocalProcess.$(O) GDBLocalProcess.$(C) GDBLocalProcess.$(H): GDBLocalProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(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)GDBRegister.$(O) GDBRegister.$(C) GDBRegister.$(H): GDBRegister.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBRemoteProcess.$(O) GDBRemoteProcess.$(C) GDBRemoteProcess.$(H): GDBRemoteProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(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)
@@ -129,9 +135,7 @@
 $(OUTDIR)GDBThreadStateStopped.$(O) GDBThreadStateStopped.$(C) GDBThreadStateStopped.$(H): GDBThreadStateStopped.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadState.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateTerminated.$(O) GDBThreadStateTerminated.$(C) GDBThreadStateTerminated.$(H): GDBThreadStateTerminated.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadState.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateUnknown.$(O) GDBThreadStateUnknown.$(C) GDBThreadStateUnknown.$(H): GDBThreadStateUnknown.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadState.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(C) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnsupportedFeatureError.$(O) GDBUnsupportedFeatureError.$(C) GDBUnsupportedFeatureError.$(H): GDBUnsupportedFeatureError.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)GDBWindowsProcess.$(O) GDBWindowsProcess.$(C) GDBWindowsProcess.$(H): GDBWindowsProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(C) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(C) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSetEvent.$(O) GDBEventSetEvent.$(C) GDBEventSetEvent.$(H): GDBEventSetEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBInternalEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -253,6 +257,8 @@
 $(OUTDIR)GDBNotificationEvent.$(O) GDBNotificationEvent.$(C) GDBNotificationEvent.$(H): GDBNotificationEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBRegisterWithValue.$(O) GDBRegisterWithValue.$(C) GDBRegisterWithValue.$(H): GDBRegisterWithValue.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSelectedFrameChangedEvent.$(O) GDBSelectedFrameChangedEvent.$(C) GDBSelectedFrameChangedEvent.$(H): GDBSelectedFrameChangedEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBInternalEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBStXUnixProcess.$(O) GDBStXUnixProcess.$(C) GDBStXUnixProcess.$(H): GDBStXUnixProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBLocalProcess.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBStXWindowsProcess.$(O) GDBStXWindowsProcess.$(C) GDBStXWindowsProcess.$(H): GDBStXWindowsProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBLocalProcess.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStatusEvent.$(O) GDBStatusEvent.$(C) GDBStatusEvent.$(H): GDBStatusEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTargetOutputEvent.$(O) GDBTargetOutputEvent.$(C) GDBTargetOutputEvent.$(H): GDBTargetOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThread.$(O) GDBThread.$(C) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -271,6 +277,8 @@
 $(OUTDIR)GDBLibraryUnloadedEvent.$(O) GDBLibraryUnloadedEvent.$(C) GDBLibraryUnloadedEvent.$(H): GDBLibraryUnloadedEvent.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)
 $(OUTDIR)GDBRunningEvent.$(O) GDBRunningEvent.$(C) GDBRunningEvent.$(H): GDBRunningEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBExecutionEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStoppedEvent.$(O) GDBStoppedEvent.$(C) GDBStoppedEvent.$(H): GDBStoppedEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBExecutionEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBTargetConnectedEvent.$(O) GDBTargetConnectedEvent.$(C) GDBTargetConnectedEvent.$(H): GDBTargetConnectedEvent.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)
+$(OUTDIR)GDBTargetDisonnectedEvent.$(O) GDBTargetDisonnectedEvent.$(C) GDBTargetDisonnectedEvent.$(H): GDBTargetDisonnectedEvent.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)
 $(OUTDIR)GDBThreadEvent.$(O) GDBThreadEvent.$(C) GDBThreadEvent.$(H): GDBThreadEvent.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)
 $(OUTDIR)GDBThreadGroupEvent.$(O) GDBThreadGroupEvent.$(C) GDBThreadGroupEvent.$(H): GDBThreadGroupEvent.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)
 $(OUTDIR)GDBThreadSelectedEvent.$(O) GDBThreadSelectedEvent.$(C) GDBThreadSelectedEvent.$(H): GDBThreadSelectedEvent.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	Thu Oct 11 09:55:43 2018 +0200
+++ b/jv_libgdbs.st	Sat Oct 20 07:48:11 2018 +0100
@@ -158,12 +158,14 @@
         GDBDebuggerObject
         GDBInternalEvent
         GDBInvalidObjectError
+        GDBLocalProcess
         GDBMICommand
         GDBMIParser
         GDBMITracer
         GDBMemoryDump
         GDBMemoryDumpRow
         GDBRegister
+        GDBRemoteProcess
         GDBStreamOutputEvent
         GDBThreadGroupTypeProcess
         GDBThreadInfo
@@ -171,9 +173,7 @@
         GDBThreadStateStopped
         GDBThreadStateTerminated
         GDBThreadStateUnknown
-        GDBUnixProcess
         GDBUnsupportedFeatureError
-        GDBWindowsProcess
         GDBBreakpoint
         GDBConsoleOutputEvent
         GDBEventSetEvent
@@ -295,6 +295,8 @@
         GDBNotificationEvent
         GDBRegisterWithValue
         GDBSelectedFrameChangedEvent
+        GDBStXUnixProcess
+        GDBStXWindowsProcess
         GDBStatusEvent
         GDBTargetOutputEvent
         GDBThread
@@ -313,6 +315,8 @@
         GDBLibraryUnloadedEvent
         GDBRunningEvent
         GDBStoppedEvent
+        GDBTargetConnectedEvent
+        GDBTargetDisonnectedEvent
         GDBThreadEvent
         GDBThreadGroupEvent
         GDBThreadSelectedEvent
--- a/libInit.cc	Thu Oct 11 09:55:43 2018 +0200
+++ b/libInit.cc	Sat Oct 20 07:48:11 2018 +0100
@@ -58,12 +58,14 @@
 extern void _GDBDebuggerObject_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBInternalEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBInvalidObjectError_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBLocalProcess_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 _GDBRegister_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBRemoteProcess_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);
@@ -71,9 +73,7 @@
 extern void _GDBThreadStateStopped_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadStateTerminated_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadStateUnknown_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _GDBUnixProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBUnsupportedFeatureError_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _GDBWindowsProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBBreakpoint_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBConsoleOutputEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBEventSetEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -195,6 +195,8 @@
 extern void _GDBNotificationEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBRegisterWithValue_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBSelectedFrameChangedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBStXUnixProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBStXWindowsProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBStatusEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBTargetOutputEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThread_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -213,6 +215,8 @@
 extern void _GDBLibraryUnloadedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBRunningEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBStoppedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBTargetConnectedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBTargetDisonnectedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadGroupEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBThreadSelectedEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -279,12 +283,14 @@
     _GDBDebuggerObject_Init(pass,__pRT__,snd);
     _GDBInternalEvent_Init(pass,__pRT__,snd);
     _GDBInvalidObjectError_Init(pass,__pRT__,snd);
+    _GDBLocalProcess_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);
     _GDBRegister_Init(pass,__pRT__,snd);
+    _GDBRemoteProcess_Init(pass,__pRT__,snd);
     _GDBStreamOutputEvent_Init(pass,__pRT__,snd);
     _GDBThreadGroupTypeProcess_Init(pass,__pRT__,snd);
     _GDBThreadInfo_Init(pass,__pRT__,snd);
@@ -292,9 +298,7 @@
     _GDBThreadStateStopped_Init(pass,__pRT__,snd);
     _GDBThreadStateTerminated_Init(pass,__pRT__,snd);
     _GDBThreadStateUnknown_Init(pass,__pRT__,snd);
-    _GDBUnixProcess_Init(pass,__pRT__,snd);
     _GDBUnsupportedFeatureError_Init(pass,__pRT__,snd);
-    _GDBWindowsProcess_Init(pass,__pRT__,snd);
     _GDBBreakpoint_Init(pass,__pRT__,snd);
     _GDBConsoleOutputEvent_Init(pass,__pRT__,snd);
     _GDBEventSetEvent_Init(pass,__pRT__,snd);
@@ -416,6 +420,8 @@
     _GDBNotificationEvent_Init(pass,__pRT__,snd);
     _GDBRegisterWithValue_Init(pass,__pRT__,snd);
     _GDBSelectedFrameChangedEvent_Init(pass,__pRT__,snd);
+    _GDBStXUnixProcess_Init(pass,__pRT__,snd);
+    _GDBStXWindowsProcess_Init(pass,__pRT__,snd);
     _GDBStatusEvent_Init(pass,__pRT__,snd);
     _GDBTargetOutputEvent_Init(pass,__pRT__,snd);
     _GDBThread_Init(pass,__pRT__,snd);
@@ -434,6 +440,8 @@
     _GDBLibraryUnloadedEvent_Init(pass,__pRT__,snd);
     _GDBRunningEvent_Init(pass,__pRT__,snd);
     _GDBStoppedEvent_Init(pass,__pRT__,snd);
+    _GDBTargetConnectedEvent_Init(pass,__pRT__,snd);
+    _GDBTargetDisonnectedEvent_Init(pass,__pRT__,snd);
     _GDBThreadEvent_Init(pass,__pRT__,snd);
     _GDBThreadGroupEvent_Init(pass,__pRT__,snd);
     _GDBThreadSelectedEvent_Init(pass,__pRT__,snd);
--- a/tests/GDBDebuggerTestCase.st	Thu Oct 11 09:55:43 2018 +0200
+++ b/tests/GDBDebuggerTestCase.st	Sat Oct 20 07:48:11 2018 +0100
@@ -22,7 +22,7 @@
 
 TestCase subclass:#GDBDebuggerTestCase
 	instanceVariableNames:'debugger'
-	classVariableNames:''
+	classVariableNames:'DebuggerSetupBlock'
 	poolDictionaries:''
 	category:'GDB-Core-Tests'
 !
@@ -50,6 +50,14 @@
 "
 ! !
 
+!GDBDebuggerTestCase class methodsFor:'accessing'!
+
+resources
+    ^ Array with: GDBDebuggeesResource
+
+    "Created: / 28-02-2015 / 00:45:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBDebuggerTestCase class methodsFor:'queries'!
 
 isAbstract
@@ -62,41 +70,24 @@
 
 !GDBDebuggerTestCase methodsFor:'running'!
 
+setUp
+    super setUp.
+    debugger := DebuggerSetupBlock notNil ifTrue:[ DebuggerSetupBlock value ] ifFalse:[ GDBDebugger new ].
+    self assert:(debugger isKindOf: GDBDebugger).
+    self assert: debugger isConnected.
+
+    "Created: / 18-10-2018 / 10:34:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 19-10-2018 / 09:50:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 tearDown
     (debugger notNil and:[ debugger isConnected ]) ifTrue:[ 
         debugger send: 'quit' andWait: false.
     ].
+    super tearDown.
 
     "Created: / 19-01-2018 / 09:18:42 / jv"
-! !
-
-!GDBDebuggerTestCase methodsFor:'tests - basic'!
-
-test_breakpoints_02
-    |  |
-
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
-    debugger executable: GDBDebuggeesResource current binaryFactorial1.
-    self assert: debugger breakpoints isEmpty.
-
-    debugger send: 'b main'.
-    self assert: debugger breakpoints size == 1.
-
-    debugger send: 'r' andWaitFor: GDBStoppedEvent.
-    self assert: debugger breakpoints size == 1.
-
-    debugger send: 'del'.
-    self assert: debugger breakpoints isEmpty.
-
-    debugger send: 'c' andWaitFor: GDBThreadGroupExitedEvent.
-    self assert: debugger breakpoints isEmpty.
-
-    debugger send: 'quit' andWait: false.
-
-    "Created: / 07-07-2017 / 11:53:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-01-2018 / 22:04:46 / jv"
+    "Modified: / 18-10-2018 / 10:34:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebuggerTestCase class methodsFor:'documentation'!
--- a/tests/GDBDebuggerTestsR.st	Thu Oct 11 09:55:43 2018 +0200
+++ b/tests/GDBDebuggerTestsR.st	Sat Oct 20 07:48:11 2018 +0100
@@ -52,7 +52,31 @@
 
 documentation
 "
-    Tests for GDBDebugger (using real test programs)         
+    Tests for GDBDebugger API. 
+
+    # Custom Debugger Setup
+
+    By default, this tests spawns a default, locally run
+    debugger for each test (see GDBDebugger >> new). To customize
+    the debugger setup, set GDBDebuggerTestsR >> debuggerSetupBlock
+    returning a GDBDebugger instance with all the necessary setup 
+    done. For example, to use externally run GDB over TCP socket:
+
+     * First, run 'GDB/MI server' (don't confuse with `gdbservver`!!)
+       run (in terminal):
+
+           socat TCP4-LISTEN:1234,FORK EXEC:'gdb -i mi2'
+
+     *
+
+
+
+
+
+    
+
+
+
 
     [author:]
         Jan Vrany <jan.vrany@fit.cvut.cz>
@@ -79,9 +103,6 @@
 test_02
     | inferior1 thread1 frame1 frame2  seqNo1 seqNo2 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
 
@@ -127,8 +148,8 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 28-02-2015 / 00:55:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-02-2018 / 22:50:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 19-01-2018 / 09:23:24 / jv"
+    "Modified: / 18-10-2018 / 10:54:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_03
@@ -136,9 +157,6 @@
 
     self skipIf: OperatingSystem isMSWINDOWSlike  description: 'Skipped since we cannot interact with inferor on Windows (no TTY support)'.
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryPressAnyKey.
 
     debugger send: (GDBMI_exec_run new).
@@ -160,14 +178,13 @@
     debugger send: 'quit' andWait: false
 
     "Created: / 08-03-2015 / 07:42:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-06-2017 / 22:30:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 14:53:19 / jv"
+    "Modified: / 18-10-2018 / 10:55:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_basic_01
     | timeToExit eventPumpProcess eventDispatchProcess|
 
-    debugger := GDBDebugger new.
     timeToExit := 0.
     eventPumpProcess := (debugger instVarNamed: #connection) instVarNamed: #eventPumpProcess.
     eventDispatchProcess := (debugger instVarNamed: #connection) instVarNamed: #eventDispatchProcess.
@@ -186,16 +203,11 @@
     self assert: eventDispatchProcess isDead.
 
     "Created: / 24-06-2014 / 09:06:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 31-05-2017 / 22:42:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 15:29:08 / jv"
+    "Modified: / 18-10-2018 / 10:55:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_01a
-    |  |
-
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -216,14 +228,10 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 07-07-2017 / 12:25:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:55:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_01b
-    |  |
-
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -244,14 +252,10 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 07-07-2017 / 12:27:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 18-10-2018 / 10:55:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_01c
-    |  |
-
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -272,15 +276,36 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 07-07-2017 / 12:34:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:55:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_breakpoints_02
+    debugger executable: GDBDebuggeesResource current binaryFactorial1.
+    self assert: debugger breakpoints isEmpty.
+
+    debugger send: 'b main'.
+    self assert: debugger breakpoints size == 1.
+
+    debugger send: 'r' andWaitFor: GDBStoppedEvent.
+    self assert: debugger breakpoints size == 1.
+
+    debugger send: 'del'.
+    self assert: debugger breakpoints isEmpty.
+
+    debugger send: 'c' andWaitFor: GDBThreadGroupExitedEvent.
+    self assert: debugger breakpoints isEmpty.
+
+    debugger send: 'quit' andWait: false.
+
+    "Created: / 07-07-2017 / 11:53:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 12-01-2018 / 22:04:46 / jv"
+    "Modified: / 18-10-2018 / 10:55:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_03a
 
     self skipIf: OperatingSystem isMSWINDOWSlike  description: 'Skipped since we don;t have separate console TTY (no TTY support)'.
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -303,14 +328,11 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 10-07-2017 / 22:05:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 11-07-2017 / 11:06:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 14:57:37 / jv"
+    "Modified: / 18-10-2018 / 10:55:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_04a
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -332,7 +354,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 11-07-2017 / 20:35:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (format): / 11-07-2017 / 23:31:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_breakpoints_05a
@@ -349,9 +371,6 @@
     "    
 
     self skipIf: true description: 'Known to fail due to a bug in GDB'.
-        debugger := GDBDebugger new.
-
-    self assert: debugger isConnected.
 
     debugger executable: GDBDebuggeesResource current binaryBreakpoints1.
     self assert: debugger breakpoints isEmpty.
@@ -388,15 +407,12 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 18-05-2018 / 10:52:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 23-05-2018 / 10:49:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:56:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_directories
     | directories current |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     directories := debugger directories.
     self assert: directories isArray.
     self assert: directories notEmpty.
@@ -416,12 +432,12 @@
 
     "Created: / 09-03-2018 / 12:28:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 03-04-2018 / 21:08:26 / jv"
+    "Modified: / 18-10-2018 / 10:56:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_disassembly_01
     | asm |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'r' andWaitFor: GDBThreadGroupExitedEvent.
 
@@ -433,12 +449,11 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 22-06-2018 / 11:52:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:56:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_features
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     self assert: debugger features isArray.
     self assert: debugger features notEmpty.
     self assert: (debugger hasFeature: debugger features anyOne).
@@ -448,13 +463,12 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 07-02-2018 / 10:56:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:56:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_registers_01a
     | stack rax rip rsp raxValue1 ripValue1 rspValue1 raxValue2 ripValue2 rspValue2 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -500,7 +514,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 27-09-2018 / 10:45:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 27-09-2018 / 16:02:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:56:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_stack_01a
@@ -509,8 +523,6 @@
 
     | stack1 stack2 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -543,6 +555,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 06-08-2018 / 15:06:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:56:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_stack_01b
@@ -551,8 +564,6 @@
 
     | stack1 pc1 stack2 pc2 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -573,13 +584,12 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 06-08-2018 / 15:07:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:57:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_stack_02
     | stack1 stack2 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
     debugger send: 'b set_data_i'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -596,7 +606,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 12-02-2018 / 21:46:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-02-2018 / 09:16:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:57:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_stack_03
@@ -605,8 +615,6 @@
 
     | stack2 selection |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     debugger send: 'b factorial'.
     debugger send: 'r' andWaitFor: GDBStoppedEvent.
@@ -631,12 +639,12 @@
     self assert: selection frame == stack2 third.
 
     "Created: / 30-07-2018 / 07:07:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:57:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_01
     | thread frame variables d |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
 
     debugger send: 'b main'.
@@ -688,7 +696,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 30-01-2018 / 10:27:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 13-02-2018 / 22:02:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:57:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_02
@@ -698,7 +706,6 @@
     "    
     | variables1 variables2 |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
 
     debugger send: 'b main'.
@@ -719,6 +726,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 01-02-2018 / 21:45:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_03
@@ -727,7 +735,6 @@
     " 
     | variables d d_i |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
 
     debugger send: 'b set_data_i'.
@@ -764,7 +771,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 01-02-2018 / 21:57:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-02-2018 / 22:36:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_04
@@ -774,7 +781,6 @@
     " 
     | variables d d_as_i_a events seqNo1 seqNo2 |
 
-    debugger := GDBDebugger new.
     events := OrderedCollection new.
     debugger announcer when: GDBEvent send: #add: to: events.
 
@@ -809,7 +815,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 04-02-2018 / 22:04:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 13-02-2018 / 10:15:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_05
@@ -819,7 +825,6 @@
     " 
     | variables d |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
 
     debugger send: 'b set_data_i'.
@@ -850,6 +855,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 12-02-2018 / 21:34:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_06
@@ -858,7 +864,6 @@
     " 
     | variables d1 d_i1 d_i2 |
 
-    debugger := GDBDebugger new.
     debugger executable: GDBDebuggeesResource current binaryVariables1.
 
     debugger send: 'b set_data_i'.
@@ -903,14 +908,12 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 13-02-2018 / 22:27:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_07
     | stack v1 v2 v3 |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -941,6 +944,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 20-03-2018 / 22:32:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_08
@@ -949,11 +953,6 @@
     "
     | c1 c1_cdr c1_cdr_cdr |
 
-
-
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryPyVarobj.
     self assert: debugger breakpoints isEmpty.
 
@@ -982,7 +981,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 01-06-2018 / 16:27:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (comment): / 04-06-2018 / 11:02:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_09
@@ -991,9 +990,6 @@
     "
     | c1 c1_cdr c1_cdr_d  c1_cdr_d_cdr c1_cdr_d_cdr_d |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryPyVarobj.
     self assert: debugger breakpoints isEmpty.
 
@@ -1028,6 +1024,7 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 04-06-2018 / 15:08:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:58:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_variables_10a
@@ -1036,9 +1033,6 @@
     "
     | stack |
 
-    debugger := GDBDebugger new.
-    self assert: debugger isConnected.
-
     debugger executable: GDBDebuggeesResource current binaryFactorial1.
     self assert: debugger breakpoints isEmpty.
 
@@ -1063,12 +1057,6 @@
     debugger send: 'quit' andWait: false.
 
     "Created: / 05-07-2018 / 11:48:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-10-2018 / 10:59:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!GDBDebuggerTestsR class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/tests/Make.proto	Thu Oct 11 09:55:43 2018 +0200
+++ b/tests/Make.proto	Sat Oct 20 07:48:11 2018 +0100
@@ -114,11 +114,15 @@
 prereq:
 	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/helpers && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/parser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/browser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/libwidg && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd $(TOP)/goodies/refactoryBrowser/lint && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd $(TOP)/goodies/magritte && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	cd ../ && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
--- a/tests/bc.mak	Thu Oct 11 09:55:43 2018 +0200
+++ b/tests/bc.mak	Sat Oct 20 07:48:11 2018 +0100
@@ -53,11 +53,15 @@
 prereq:
 	pushd ..\..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\..\stx\goodies\refactoryBrowser\helpers & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\..\stx\goodies\refactoryBrowser\parser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\..\stx\goodies\refactoryBrowser\browser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libwidg & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\..\stx\goodies\refactoryBrowser\lint & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\goodies\magritte & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd .. & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "