Introduced GDBProcess - a class encapsulating gdb OS process.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 20 Jun 2014 22:14:51 +0100
changeset 23 a7eb888c81b5
parent 22 57025871aed4
child 24 98ff50f8a25d
Introduced GDBProcess - a class encapsulating gdb OS process.
GDBConnection.st
GDBDebugFlags.st
GDBDebugger.st
GDBLauncher.st
GDBMICommand.st
GDBProcess.st
GDBUnixProcess.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/GDBDebuggerTests.st
tests/Make.proto
tests/Make.spec
tests/abbrev.stc
tests/bc.mak
tests/jv_libgdbs_tests.st
tests/libInit.cc
tests/tests.rc
--- a/GDBConnection.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/GDBConnection.st	Fri Jun 20 22:14:51 2014 +0100
@@ -1,10 +1,9 @@
 "{ Package: 'jv:libgdbs' }"
 
 Object subclass:#GDBConnection
-	instanceVariableNames:'pid debuggerInput debuggerOutput inferiorPTY eventAnnouncer
-		eventAnnouncerInternal eventQueue eventQueueLock
-		eventQueueNotifier eventDispatchProcess eventPumpProcess
-		outstandingCommands'
+	instanceVariableNames:'process inferiorPTY eventAnnouncer eventAnnouncerInternal
+		eventQueue eventQueueLock eventQueueNotifier eventDispatchProcess
+		eventPumpProcess outstandingCommands'
 	classVariableNames:''
 	poolDictionaries:'GDBDebugFlags'
 	category:'GDB-Private'
@@ -13,13 +12,16 @@
 
 !GDBConnection class methodsFor:'instance creation'!
 
-pid:pidArg input:inputArg output:outputArg
-    ^ self new 
-        initializeWithPid:pidArg
-        input:inputArg
-        output:outputArg
+new
+    ^ self shouldNotImplement.
 
-    "Created: / 09-06-2014 / 18:20:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 20-06-2014 / 21:45:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+newWithProcess: aGDBProcess
+    ^ self basicNew initializeWithProcess: aGDBProcess
+
+    "Created: / 20-06-2014 / 21:45:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection methodsFor:'accessing'!
@@ -38,6 +40,18 @@
     ^ inferiorPTY
 ! !
 
+!GDBConnection methodsFor:'commands'!
+
+send: command
+    command token notNil ifTrue:[ 
+        process debuggerInput nextPutAll: command token printString.
+    ].
+    outstandingCommands add: command.
+    process debuggerInput nextPutLine: command asString.
+
+    "Created: / 20-06-2014 / 22:09:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBConnection methodsFor:'event dispatching'!
 
 eventDispatchLoop
@@ -65,12 +79,12 @@
                 ].
             ].
         ].
-        pid isNil ifTrue:[ ^ self ]. "/ gdb process terninated
+        process pid isNil ifTrue:[ ^ self ]. "/ gdb process terninated
         eventQueueNotifier wait.
     ] loop.
 
     "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (comment): / 04-06-2014 / 09:16:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:38:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventDispatchSingle: aGDBEvent
@@ -92,7 +106,7 @@
                 ].
                 self eventDispatchLoop.
             ] newProcess.
-        eventDispatchProcess name:('GDB Event dispatcher (%1)' bindWith:pid).
+        eventDispatchProcess name:('GDB Event dispatcher (%1)' bindWith:process pid).
         eventDispatchProcess priority:Processor userBackgroundPriority.
         eventDispatchProcess addExitAction:[ 
             eventDispatchProcess := nil. 
@@ -104,7 +118,7 @@
     ].
 
     "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-06-2014 / 09:27:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:38:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventDispatchStop
@@ -121,28 +135,12 @@
     "Created: / 02-06-2014 / 22:52:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!GDBConnection methodsFor:'event handling'!
-
-onCommand: aGDBCommandEvent
-    | command |
-
-    command := aGDBCommandEvent command.
-    command token notNil ifTrue:[ 
-        debuggerInput nextPutAll: command token printString.
-    ].
-    outstandingCommands add: command.
-    debuggerInput nextPutLine: command asString.
-
-    "Created: / 02-06-2014 / 23:38:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-06-2014 / 22:08:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !GDBConnection methodsFor:'event pump'!
 
 eventPumpLoop
     | parser |
 
-    parser := GDBParser on: debuggerOutput.
+    parser := GDBParser on: process debuggerOutput.
     parser token2CommandMappingBlock:[ :token | 
         | command |
 
@@ -150,7 +148,7 @@
         command notNil ifTrue:[ outstandingCommands remove: command ].
         command
     ].
-    [ debuggerOutput atEnd ] whileFalse:[ 
+    [ process debuggerOutput atEnd ] whileFalse:[ 
         | eventset |
 
         [
@@ -165,16 +163,16 @@
 
             terminator := '(gdb)'.
             i := 1.
-            debuggerOutput notNil ifTrue:[
-                [ debuggerOutput atEnd not and: [i <= terminator size ] ] whileTrue:[ 
-                    c := debuggerOutput next.
+            process debuggerOutput notNil ifTrue:[
+                [ process debuggerOutput atEnd not and: [i <= terminator size ] ] whileTrue:[ 
+                    c := process debuggerOutput next.
                     c == (terminator at: i) ifTrue:[ 
                         i := i + 1.
                     ] ifFalse:[ 
                         i := 1.
                     ].
                 ].
-                debuggerOutput next. "/ read nl.
+                process debuggerOutput next. "/ read nl.
             ] ifFalse:[ 
                 ^ self.
             ].
@@ -182,7 +180,7 @@
     ]
 
     "Created: / 02-06-2014 / 22:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-06-2014 / 22:10:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:39:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventPumpStart
@@ -193,7 +191,7 @@
                 ].
                 self eventPumpLoop
             ] newProcess.
-        eventPumpProcess name:('GDB Event pump (%1)' bindWith:pid).
+        eventPumpProcess name:('GDB Event pump (%1)' bindWith:process pid).
         eventPumpProcess priority:Processor userBackgroundPriority.
         eventPumpProcess addExitAction:[ 
             TraceEvents ifTrue:[
@@ -205,7 +203,7 @@
     ].
 
     "Created: / 02-06-2014 / 22:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-06-2014 / 09:27:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:37:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventPumpStop
@@ -244,10 +242,8 @@
 
 !GDBConnection methodsFor:'initialize & release'!
 
-initializeWithPid:pidArg input:inputArg output:outputArg
-    pid := pidArg.
-    debuggerInput := inputArg.
-    debuggerOutput := outputArg.
+initializeWithProcess: aGDBProcess
+    process := aGDBProcess.
     inferiorPTY := GDBPTY new.
     eventQueue := OrderedCollection new.
     eventQueueLock := RecursionLock new.
@@ -255,27 +251,22 @@
     eventAnnouncer := Announcer new.
     eventAnnouncerInternal := Announcer new.    
     outstandingCommands := Set new.
-    eventAnnouncerInternal 
-        when:GDBCommandEvent
-        send:#onCommand:
-        to:self.
 
-    "Created: / 09-06-2014 / 18:21:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-06-2014 / 22:18:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 20-06-2014 / 21:40:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 release
-    pid notNil ifTrue:[
-        OperatingSystem sendSignal:(OperatingSystem sigKILL) to:pid.       
+    process pid notNil ifTrue:[
+        OperatingSystem sendSignal:(OperatingSystem sigKILL) to:process pid.       
     ]
 
     "Created: / 26-05-2014 / 21:30:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 03-06-2014 / 00:55:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:41:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 released: status
     TraceProcesses ifTrue:[ 
-        Logger log: ('gdb process: terminated with status %1' bindWith: status code)  severity: #trace facility: 'GDB'.
+        Logger log: ('gdb process: exited with status %1' bindWith: status code)  severity: #trace facility: 'GDB'.
     ].
     TraceProcesses ifTrue:[ 
         Logger log: ('gdb process: waiting for event pump to finish' bindWith: status code)  severity: #trace facility: 'GDB'.
@@ -286,20 +277,12 @@
     TraceProcesses ifTrue:[ 
         Logger log: ('gdb process: event pump finished' bindWith: status code)  severity: #trace facility: 'GDB'.
     ].
-    pid := nil.       
     eventQueueNotifier signalForAll.           
-    debuggerInput notNil ifTrue:[ 
-        debuggerInput close.
-        debuggerInput := nil.
-    ].
-    debuggerOutput notNil ifTrue:[ 
-        debuggerOutput close.
-        debuggerOutput := nil.
-    ].
+    process release.
     inferiorPTY release.
 
     "Created: / 26-05-2014 / 21:31:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 09-06-2014 / 18:26:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:37:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection class methodsFor:'documentation'!
--- a/GDBDebugFlags.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/GDBDebugFlags.st	Fri Jun 20 22:14:51 2014 +0100
@@ -15,8 +15,9 @@
     "/ please change as required (and remove this comment)
 
     TraceEvents := true.
+    TraceProcesses := true.
 
-    "Modified: / 02-06-2014 / 23:24:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 21:48:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 
--- a/GDBDebugger.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/GDBDebugger.st	Fri Jun 20 22:14:51 2014 +0100
@@ -1,7 +1,7 @@
 "{ Package: 'jv:libgdbs' }"
 
 Object subclass:#GDBDebugger
-	instanceVariableNames:'driver commandSequenceNumber inferiorStateSequenceNumber'
+	instanceVariableNames:'connection commandSequenceNumber inferiorStateSequenceNumber'
 	classVariableNames:''
 	poolDictionaries:'GDBCommandStatus'
 	category:'GDB-Core'
@@ -11,35 +11,41 @@
 !GDBDebugger class methodsFor:'instance creation'!
 
 new
-    "return an initialized instance"
+    ^ self newWithProcess: GDBUnixProcess new
+
+    "Modified: / 20-06-2014 / 21:44:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
 
-    ^ self basicNew initialize.
+newWithProcess: aGDBProcess
+    ^ self basicNew initializeWithProcess: aGDBProcess
+
+    "Created: / 20-06-2014 / 21:44:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebugger methodsFor:'accessing'!
 
 announcer
-    ^ driver eventAnnouncer.
+    ^ connection eventAnnouncer.
 
     "Created: / 02-06-2014 / 23:06:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 inferiorStderr
-    ^ driver inferiorPTY master
+    ^ connection inferiorPTY master
 
     "Created: / 09-06-2014 / 10:01:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 09-06-2014 / 18:26:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 inferiorStdin
-    ^ driver inferiorPTY master
+    ^ connection inferiorPTY master
 
     "Created: / 09-06-2014 / 10:00:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 09-06-2014 / 18:27:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 inferiorStdout
-    ^ driver inferiorPTY master
+    ^ connection inferiorPTY master
 
     "Created: / 09-06-2014 / 10:01:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 09-06-2014 / 18:27:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -97,10 +103,10 @@
                     ]].
         blocker := Semaphore new.
         self announcer when: GDBCommandResultEvent do: releaser.
-        driver pushEvent: (GDBCommandEvent new command: aGDBCommand).
+        connection pushEvent: (GDBCommandEvent new command: aGDBCommand).
         blocker wait.
     ] ifFalse:[
-        driver pushEvent: (GDBCommandEvent new command: aGDBCommand).
+        connection pushEvent: (GDBCommandEvent new command: aGDBCommand).
     ]
 
     "Created: / 02-06-2014 / 23:45:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -109,9 +115,16 @@
 
 !GDBDebugger methodsFor:'event handling'!
 
+onCommand: aGDBCommandEvent
+    connection send: aGDBCommandEvent command.
+
+    "Created: / 02-06-2014 / 23:38:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 22:09:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 onCommandResult: aGDBCommandResultEvent
     aGDBCommandResultEvent result status == CommandStatusExit ifTrue:[ 
-        driver pushEvent: GDBExitEvent new.
+        connection pushEvent: GDBExitEvent new.
     ].
 
     "Created: / 02-06-2014 / 23:40:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -141,36 +154,57 @@
 
 !GDBDebugger methodsFor:'initialize & release'!
 
-initialize
+initializeWithProcess: aGDBProcess
     self registerForFinalization.
-    driver := GDBLauncher startGDB.
+    connection := GDBConnection newWithProcess: aGDBProcess.
 
     commandSequenceNumber := 0.
     inferiorStateSequenceNumber := 0.
 
-    driver eventAnnouncerInternal
-        when: GDBCommandResultEvent     send: #onCommandResult: to: self;
-        when: GDBExitEvent              send: #onExit: to: self;
-        when: GDBExecutionEvent         send: #onExecutionEvent: to: self.
-        
+    self subscribe.        
 
-    driver eventPumpStart.
-    driver eventDispatchStart.
+    connection eventPumpStart.
+    connection eventDispatchStart.
 
 "/    self send: (GDBMICommand inferiorTtySet: driver inferiorPTY name).
-    self send: (GDBMI_inferior_tty_set arguments: { driver inferiorPTY name })
+    self send: (GDBMI_inferior_tty_set arguments: { connection inferiorPTY name })
 
-    "Created: / 26-05-2014 / 21:23:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-06-2014 / 22:22:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 20-06-2014 / 21:45:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 release
-    driver notNil ifTrue:[ 
-        driver release.
-        driver := nil.
+    connection notNil ifTrue:[ 
+        self unsubscribe.
+        connection release.
+        connection := nil.
     ].
 
     "Created: / 26-05-2014 / 21:24:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 22:08:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+subscribe
+    connection eventAnnouncerInternal
+        when: GDBCommandEvent               send: #onCommand:           to: self;
+        when: GDBCommandResultEvent         send: #onCommandResult:     to: self;
+        when: GDBExitEvent                  send: #onExit:              to: self;
+        when: GDBExecutionEvent             send: #onExecutionEvent:    to: self.
+
+    "Created: / 20-06-2014 / 22:07:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+unsubscribe
+    connection eventAnnouncerInternal unsubscribe: self
+
+    "Created: / 20-06-2014 / 22:07:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBDebugger methodsFor:'testing'!
+
+isConnected
+    ^ connection notNil
+
+    "Created: / 20-06-2014 / 22:12:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebugger class methodsFor:'documentation'!
--- a/GDBLauncher.st	Fri Jun 20 21:25:03 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-"{ Package: 'jv:libgdbs' }"
-
-Object subclass:#GDBLauncher
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Private'
-!
-
-
-!GDBLauncher class methodsFor:'starting'!
-
-startGDB
-    | inputPipe  input  outputPipe  output  args  connection  pid |
-
-    inputPipe := NonPositionableExternalStream makePipe.
-    input := inputPipe second.
-    outputPipe := NonPositionableExternalStream makePipe.
-    output := outputPipe first.
-    args := #( '/usr/bin/gdb' '--interpreter' 'mi2' ).
-    Processor 
-        monitor:[
-            pid := OperatingSystem 
-                    exec:args first
-                    withArguments:args
-                    environment:OperatingSystem getEnvironment
-                    fileDescriptors:{
-                            inputPipe first fileDescriptor.
-                            outputPipe second fileDescriptor.
-                            outputPipe second fileDescriptor
-                        }
-                    fork:true
-                    newPgrp:false
-                    inDirectory:Filename currentDirectory.
-            connection := GDBConnection 
-                    pid:pid
-                    input:input
-                    output:output.
-            pid.
-        ]
-        action:[:stat | connection released:stat. ].
-    inputPipe first close.
-    outputPipe second close.
-    pid isNil ifTrue:[
-        input close.
-        output close.
-        self error:'Failed to launch gdb'.
-        ^ self.
-    ].
-    ^ connection
-
-    "Created: / 26-05-2014 / 21:18:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 09-06-2014 / 18:31:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBLauncher class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/GDBMICommand.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/GDBMICommand.st	Fri Jun 20 22:14:51 2014 +0100
@@ -229,16 +229,20 @@
 
 asString
     ^ String streamContents: [ :s |
+        | args |
         s nextPut: $-.
         s nextPutAll: self operation.
-        self arguments do:[:each | 
-            s space.
-            s nextPutAll: each asString.
+        args := self arguments.
+        args notEmptyOrNil ifTrue:[ 
+            args do:[:each | 
+                s space.
+                s nextPutAll: each asString.
+            ].
         ].
     ]
 
     "Created: / 09-06-2014 / 18:42:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 09-06-2014 / 21:25:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-06-2014 / 22:04:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBMICommand methodsFor:'testing'!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBProcess.st	Fri Jun 20 22:14:51 2014 +0100
@@ -0,0 +1,57 @@
+"{ Package: 'jv:libgdbs' }"
+
+Object subclass:#GDBProcess
+	instanceVariableNames:'pid debuggerInput debuggerOutput connection'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private'
+!
+
+!GDBProcess class methodsFor:'queries'!
+
+isAbstract
+    "Return if this class is an abstract class.
+     True is returned here for myself only; false for subclasses.
+     Abstract subclasses must redefine again."
+
+    ^ self == GDBProcess.
+! !
+
+!GDBProcess methodsFor:'accessing'!
+
+debuggerInput
+    ^ debuggerInput
+!
+
+debuggerOutput
+    ^ debuggerOutput
+!
+
+pid
+    ^ pid
+! !
+
+!GDBProcess methodsFor:'initialization'!
+
+release
+    pid := connection := nil.
+    debuggerInput notNil ifTrue:[ 
+        debuggerInput close.
+        debuggerInput := nil.
+    ].
+    debuggerOutput notNil ifTrue:[ 
+        debuggerOutput close.
+        debuggerOutput := nil.
+    ].
+
+    "Created: / 20-06-2014 / 21:35:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBProcess methodsFor:'private'!
+
+exited: status
+    connection released: status
+
+    "Created: / 20-06-2014 / 21:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBUnixProcess.st	Fri Jun 20 22:14:51 2014 +0100
@@ -0,0 +1,57 @@
+"{ Package: 'jv:libgdbs' }"
+
+GDBProcess subclass:#GDBUnixProcess
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private'
+!
+
+!GDBUnixProcess class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
+!GDBUnixProcess methodsFor:'initialization'!
+
+initialize
+    | inputPipe  input  outputPipe  output  args |
+
+    inputPipe := NonPositionableExternalStream makePipe.
+    input := inputPipe second.
+    outputPipe := NonPositionableExternalStream makePipe.
+    output := outputPipe first.
+    args := #( '/usr/bin/gdb' '--interpreter' 'mi2' ).
+    Processor 
+        monitor:[
+            pid := OperatingSystem 
+                    exec:args first
+                    withArguments:args
+                    environment:OperatingSystem getEnvironment
+                    fileDescriptors:{
+                            inputPipe first fileDescriptor.
+                            outputPipe second fileDescriptor.
+                            outputPipe second fileDescriptor
+                        }
+                    fork:true
+                    newPgrp:false
+                    inDirectory:Filename currentDirectory.
+            debuggerInput := input.
+            debuggerOutput := output.
+            pid.
+        ]
+        action:[:stat | self exited:stat. ].
+    inputPipe first close.
+    outputPipe second close.
+    pid isNil ifTrue:[
+        input close.
+        output close.
+        self error:'Failed to launch gdb'.
+    ].
+
+    "Modified: / 20-06-2014 / 21:35:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/Make.proto	Fri Jun 20 21:25:03 2014 +0100
+++ b/Make.proto	Fri Jun 20 22:14:51 2014 +0100
@@ -128,9 +128,9 @@
 $(OUTDIR)GDBEvent.$(O) GDBEvent.$(H): GDBEvent.st $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSet.$(O) GDBEventSet.$(H): GDBEventSet.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalPipeStream.$(O) GDBInternalPipeStream.$(H): GDBInternalPipeStream.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/Stream.$(H) $(STCHDR)
-$(OUTDIR)GDBLauncher.$(O) GDBLauncher.$(H): GDBLauncher.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBProcess.$(O) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptor.$(O) GDBValueDescriptor.$(H): GDBValueDescriptor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(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)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
@@ -148,6 +148,7 @@
 $(OUTDIR)GDBParser.$(O) GDBParser.$(H): GDBParser.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBPrimitiveValueDescriptor.$(O) GDBPrimitiveValueDescriptor.$(H): GDBPrimitiveValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) 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)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBAddresValueDescriptor.$(O) GDBAddresValueDescriptor.$(H): GDBAddresValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBooleanValueDescriptor.$(O) GDBBooleanValueDescriptor.$(H): GDBBooleanValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) 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)
--- a/Make.spec	Fri Jun 20 21:25:03 2014 +0100
+++ b/Make.spec	Fri Jun 20 22:14:51 2014 +0100
@@ -56,9 +56,9 @@
 	GDBEvent \
 	GDBEventSet \
 	GDBInternalPipeStream \
-	GDBLauncher \
 	GDBObject \
 	GDBPTY \
+	GDBProcess \
 	GDBValueDescriptor \
 	GDBValueDescriptorError \
 	jv_libgdbs \
@@ -76,6 +76,7 @@
 	GDBParser \
 	GDBPrimitiveValueDescriptor \
 	GDBStreamOutputEvent \
+	GDBUnixProcess \
 	GDBAddresValueDescriptor \
 	GDBBooleanValueDescriptor \
 	GDBConsoleOutputEvent \
@@ -221,9 +222,9 @@
     $(OUTDIR_SLASH)GDBEvent.$(O) \
     $(OUTDIR_SLASH)GDBEventSet.$(O) \
     $(OUTDIR_SLASH)GDBInternalPipeStream.$(O) \
-    $(OUTDIR_SLASH)GDBLauncher.$(O) \
     $(OUTDIR_SLASH)GDBObject.$(O) \
     $(OUTDIR_SLASH)GDBPTY.$(O) \
+    $(OUTDIR_SLASH)GDBProcess.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptorError.$(O) \
     $(OUTDIR_SLASH)jv_libgdbs.$(O) \
@@ -241,6 +242,7 @@
     $(OUTDIR_SLASH)GDBParser.$(O) \
     $(OUTDIR_SLASH)GDBPrimitiveValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBStreamOutputEvent.$(O) \
+    $(OUTDIR_SLASH)GDBUnixProcess.$(O) \
     $(OUTDIR_SLASH)GDBAddresValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBBooleanValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBConsoleOutputEvent.$(O) \
--- a/abbrev.stc	Fri Jun 20 21:25:03 2014 +0100
+++ b/abbrev.stc	Fri Jun 20 22:14:51 2014 +0100
@@ -7,9 +7,9 @@
 GDBEvent GDBEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBEventSet GDBEventSet jv:libgdbs 'GDB-Core-Events' 0
 GDBInternalPipeStream GDBInternalPipeStream jv:libgdbs 'GDB-Support' 0
-GDBLauncher GDBLauncher jv:libgdbs 'GDB-Private' 0
 GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 GDBPTY GDBPTY jv:libgdbs 'GDB-Private' 0
+GDBProcess GDBProcess jv:libgdbs 'GDB-Private' 0
 GDBValueDescriptor GDBValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBValueDescriptorError GDBValueDescriptorError jv:libgdbs 'GDB-Private-Descriptors' 1
 jv_libgdbs jv_libgdbs jv:libgdbs '* Projects & Packages *' 3
@@ -27,6 +27,7 @@
 GDBParser GDBParser jv:libgdbs 'GDB-Private' 0
 GDBPrimitiveValueDescriptor GDBPrimitiveValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBStreamOutputEvent GDBStreamOutputEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBUnixProcess GDBUnixProcess jv:libgdbs 'GDB-Private' 0
 GDBAddresValueDescriptor GDBAddresValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBBooleanValueDescriptor GDBBooleanValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBConsoleOutputEvent GDBConsoleOutputEvent jv:libgdbs 'GDB-Core-Events' 0
--- a/bc.mak	Fri Jun 20 21:25:03 2014 +0100
+++ b/bc.mak	Fri Jun 20 22:14:51 2014 +0100
@@ -74,9 +74,9 @@
 $(OUTDIR)GDBEvent.$(O) GDBEvent.$(H): GDBEvent.st $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSet.$(O) GDBEventSet.$(H): GDBEventSet.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalPipeStream.$(O) GDBInternalPipeStream.$(H): GDBInternalPipeStream.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\Stream.$(H) $(STCHDR)
-$(OUTDIR)GDBLauncher.$(O) GDBLauncher.$(H): GDBLauncher.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBProcess.$(O) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptor.$(O) GDBValueDescriptor.$(H): GDBValueDescriptor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(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)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
@@ -94,6 +94,7 @@
 $(OUTDIR)GDBParser.$(O) GDBParser.$(H): GDBParser.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBPrimitiveValueDescriptor.$(O) GDBPrimitiveValueDescriptor.$(H): GDBPrimitiveValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) 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)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBAddresValueDescriptor.$(O) GDBAddresValueDescriptor.$(H): GDBAddresValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBooleanValueDescriptor.$(O) GDBBooleanValueDescriptor.$(H): GDBBooleanValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) 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)
--- a/jv_libgdbs.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/jv_libgdbs.st	Fri Jun 20 22:14:51 2014 +0100
@@ -70,9 +70,9 @@
         GDBEvent
         GDBEventSet
         GDBInternalPipeStream
-        GDBLauncher
         GDBObject
         GDBPTY
+        GDBProcess
         GDBValueDescriptor
         GDBValueDescriptorError
         #'jv_libgdbs'
@@ -90,6 +90,7 @@
         GDBParser
         GDBPrimitiveValueDescriptor
         GDBStreamOutputEvent
+        GDBUnixProcess
         GDBAddresValueDescriptor
         GDBBooleanValueDescriptor
         GDBConsoleOutputEvent
--- a/libInit.cc	Fri Jun 20 21:25:03 2014 +0100
+++ b/libInit.cc	Fri Jun 20 22:14:51 2014 +0100
@@ -33,9 +33,9 @@
 _GDBEvent_Init(pass,__pRT__,snd);
 _GDBEventSet_Init(pass,__pRT__,snd);
 _GDBInternalPipeStream_Init(pass,__pRT__,snd);
-_GDBLauncher_Init(pass,__pRT__,snd);
 _GDBObject_Init(pass,__pRT__,snd);
 _GDBPTY_Init(pass,__pRT__,snd);
+_GDBProcess_Init(pass,__pRT__,snd);
 _GDBValueDescriptor_Init(pass,__pRT__,snd);
 _GDBValueDescriptorError_Init(pass,__pRT__,snd);
 _jv_137libgdbs_Init(pass,__pRT__,snd);
@@ -53,6 +53,7 @@
 _GDBParser_Init(pass,__pRT__,snd);
 _GDBPrimitiveValueDescriptor_Init(pass,__pRT__,snd);
 _GDBStreamOutputEvent_Init(pass,__pRT__,snd);
+_GDBUnixProcess_Init(pass,__pRT__,snd);
 _GDBAddresValueDescriptor_Init(pass,__pRT__,snd);
 _GDBBooleanValueDescriptor_Init(pass,__pRT__,snd);
 _GDBConsoleOutputEvent_Init(pass,__pRT__,snd);
--- a/libgdbs.rc	Fri Jun 20 21:25:03 2014 +0100
+++ b/libgdbs.rc	Fri Jun 20 22:14:51 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Fri, 20 Jun 2014 20:22:51 GMT\0"
+      VALUE "ProductDate", "Fri, 20 Jun 2014 21:13:53 GMT\0"
     END
 
   END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/GDBDebuggerTests.st	Fri Jun 20 22:14:51 2014 +0100
@@ -0,0 +1,45 @@
+"{ Package: 'jv:libgdbs/tests' }"
+
+TestCase subclass:#GDBDebuggerTests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-Tests'
+!
+
+!GDBDebuggerTests class methodsFor:'documentation'!
+
+documentation
+"
+    documentation to be added.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!GDBDebuggerTests methodsFor:'tests - basic'!
+
+test_exit_01
+    | debugger timeouted |
+
+    debugger := GDBDebugger new.
+    self assert: debugger isConnected.
+    timeouted  := ([
+        debugger send: (GDBMI_gdb_exit new).
+        true.
+    ] valueWithTimeout: 3 seconds) isNil.
+
+    self assert: timeouted not.
+    self assert: debugger isConnected not.
+
+    "Created: / 20-06-2014 / 22:00:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/tests/Make.proto	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/Make.proto	Fri Jun 20 22:14:51 2014 +0100
@@ -127,6 +127,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)GDBDebuggerTests.$(O) GDBDebuggerTests.$(H): GDBDebuggerTests.st $(INCLUDE_TOP)/stx/goodies/sunit/TestAsserter.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestCase.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalPipeStreamTests.$(O) GDBInternalPipeStreamTests.$(H): GDBInternalPipeStreamTests.st $(INCLUDE_TOP)/stx/goodies/sunit/TestAsserter.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestCase.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBParserTests.$(O) GDBParserTests.$(H): GDBParserTests.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestAsserter.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestCase.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs_tests.$(O) jv_libgdbs_tests.$(H): jv_libgdbs_tests.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
--- a/tests/Make.spec	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/Make.spec	Fri Jun 20 22:14:51 2014 +0100
@@ -50,6 +50,7 @@
 STCWARNINGS=-warnNonStandard
 
 COMMON_CLASSES= \
+	GDBDebuggerTests \
 	GDBInternalPipeStreamTests \
 	GDBParserTests \
 	jv_libgdbs_tests \
@@ -58,6 +59,7 @@
 
 
 COMMON_OBJS= \
+    $(OUTDIR_SLASH)GDBDebuggerTests.$(O) \
     $(OUTDIR_SLASH)GDBInternalPipeStreamTests.$(O) \
     $(OUTDIR_SLASH)GDBParserTests.$(O) \
     $(OUTDIR_SLASH)jv_libgdbs_tests.$(O) \
--- a/tests/abbrev.stc	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/abbrev.stc	Fri Jun 20 22:14:51 2014 +0100
@@ -1,6 +1,7 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
+GDBDebuggerTests GDBDebuggerTests jv:libgdbs/tests 'GDB-Core-Tests' 1
 GDBInternalPipeStreamTests GDBInternalPipeStreamTests jv:libgdbs/tests 'GDB-Support-Tests' 1
 GDBParserTests GDBParserTests jv:libgdbs/tests 'GDB-Private-Tests' 1
 jv_libgdbs_tests jv_libgdbs_tests jv:libgdbs/tests '* Projects & Packages *' 3
--- a/tests/bc.mak	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/bc.mak	Fri Jun 20 22:14:51 2014 +0100
@@ -73,6 +73,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)GDBDebuggerTests.$(O) GDBDebuggerTests.$(H): GDBDebuggerTests.st $(INCLUDE_TOP)\stx\goodies\sunit\TestAsserter.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestCase.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalPipeStreamTests.$(O) GDBInternalPipeStreamTests.$(H): GDBInternalPipeStreamTests.st $(INCLUDE_TOP)\stx\goodies\sunit\TestAsserter.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestCase.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBParserTests.$(O) GDBParserTests.$(H): GDBParserTests.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestAsserter.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestCase.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs_tests.$(O) jv_libgdbs_tests.$(H): jv_libgdbs_tests.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
--- a/tests/jv_libgdbs_tests.st	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/jv_libgdbs_tests.st	Fri Jun 20 22:14:51 2014 +0100
@@ -29,7 +29,7 @@
 
     ^ #(
         #'jv:libgdbs'    "GDBCommandStatus - shared pool used by GDBParserTests "
-        #'stx:goodies/sunit'    "TestAsserter - superclass of GDBInternalPipeStreamTests "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of GDBDebuggerTests "
         #'stx:libbasic'    "LibraryDefinition - superclass of jv_libgdbs_tests "
     )
 !
@@ -65,6 +65,7 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
+        GDBDebuggerTests
         GDBInternalPipeStreamTests
         GDBParserTests
         #'jv_libgdbs_tests'
--- a/tests/libInit.cc	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/libInit.cc	Fri Jun 20 22:14:51 2014 +0100
@@ -27,6 +27,7 @@
 void _libjv_libgdbs_tests_Init(pass, __pRT__, snd)
 OBJ snd; struct __vmData__ *__pRT__; {
 __BEGIN_PACKAGE2__("libjv_libgdbs_tests", _libjv_libgdbs_tests_Init, "jv:libgdbs/tests");
+_GDBDebuggerTests_Init(pass,__pRT__,snd);
 _GDBInternalPipeStreamTests_Init(pass,__pRT__,snd);
 _GDBParserTests_Init(pass,__pRT__,snd);
 _jv_137libgdbs_137tests_Init(pass,__pRT__,snd);
--- a/tests/tests.rc	Fri Jun 20 21:25:03 2014 +0100
+++ b/tests/tests.rc	Fri Jun 20 22:14:51 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Fri, 20 Jun 2014 20:22:53 GMT\0"
+      VALUE "ProductDate", "Fri, 20 Jun 2014 21:13:55 GMT\0"
     END
 
   END