GNU Smalltalk提供了调试工具。它在
DebugTool.st
中实现了一个
Debugger类,正如Smalltalk 80:the language所述。与
Debugger
一起提到的其他类未必被实现,可能是因为它们涉及GUI操作。
相反,GNU Smalltalk提供了
MiniDebug命令行调试器,可用于GNU Smalltalk或IDE不可用时使用。它大致是GDB的一个基本子集。
加载MiniDebugger
一个简单的方法是将文件读入到gst中。
$ gst
GNU Smalltalk ready
st> FileStream fileIn: '/usr/share/gnu-smalltalk/examples/MiniDebugger.st'
"Global garbage collection... done"
Loading package DebugTools
FileStream
st>
请注意,
MiniDebugger.st
的位置适用于 Ubuntu 16.04。其他操作系统可能会将该文件放置在不同的位置。
MiniDebugger 你好,世界
MiniDebugger 的一个 你好,世界 示例:
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>
c
在(debug)
提示符下的输入表示“继续”。通过键入h
(或其他任何无效命令),可以显示其他选项。
制作调试镜像
一旦MiniDebugger加载到gst REPL中,就可以创建包含调试器的镜像:
st> ObjectMemory snapshot: 'myDebuggerImage.im'
并在启动gst
时重新加载(假设'myDebuggerImage.im'位于当前目录或gst
默认查找的其他位置):
$ gst -I myDebuggerImage.im
设置断点
当控制流程遇到Object:halt
时,MiniDebugger将出现。例如,如果我有以下文件:
"Halter.st"
Object subclass: Halter [
breakpoint [
self halt.
]
]
然后:
st> h := Halter new
a Halter
st> h breakpoint
'a Halter error: halt encountered'
...
(debug)