GNU Smalltalk includes tools for debugging. It implements a Debugger class as mentioned in Smalltalk 80: the language within DebugTool.st
. Other classes mentioned alongside Debugger
are not necessarily implemented, perhaps because they relate to GUI operations.
Instead, GNU Smalltalk provides the MiniDebug command line debugger for use with GNU Smalltalk or when the IDE is not available. It is more or less a rudimentary subset of GDB.
Loading MiniDebugger
A simple way to use it is read the file into gst:
$ gst
GNU Smalltalk ready
st> FileStream fileIn: '/usr/share/gnu-smalltalk/examples/MiniDebugger.st'
"Global garbage collection... done"
Loading package DebugTools
FileStream
st>
Note that the location of MiniDebugger.st
is typical for Ubuntu 16.04. Other operating systems may put the file in a different place.
MiniDebugger Hello World
A hello world example of the MiniDebugger is:
st> self halt
'nil error: halt encountered'
Halt(Exception)>>signal (ExcHandling.st:254)
Halt(Exception)>>signal: (ExcHandling.st:264)
UndefinedObject(Object)>>halt: (SysExcept.st:1464)
UndefinedObject(Object)>>halt (Object.st:1325)
UndefinedObject>>executeStatements (a String:1)
6 ^self activateHandler: (onDoBlock isNil and: [ self isResumable ])
(debug) c
st>
The entry of c
at the (debug)
prompt is for 'continue'. Other options will be displayed by typing h
(or any other invalid command).
Making a Debugging Image
Once MiniDebugger is loaded into a gst REPL, an image containing the debugger can be created:
st> ObjectMemory snapshot: 'myDebuggerImage.im'
and later reloaded when starting gst
(this assumes 'myDebuggerImage.im' is located in the current directory or in another place gst
looks by default):
$ gst -I myDebuggerImage.im
Setting a Breakpoint
The MiniDebugger will then appear any time the control flow encounters Object:halt
. For example if I have the file:
"Halter.st"
Object subclass: Halter [
breakpoint [
self halt.
]
]
Then:
st> h := Halter new
a Halter
st> h breakpoint
'a Halter error: halt encountered'
...
(debug)