朋友们如题所示,我在squeak4.1调试的时候,“debug it”菜单很强大,有Proceed、Restart、Into、Over、Through等按钮,每次进入Into按钮,我都可以追踪进入具体代码,但是 Over 和 Through 按钮有什么区别呢?
1 回答
Squeak 调试器起初可能有点吓人。让我们检查一下它的各个部分。
上下文堆栈
调试器窗口顶部的列表是上下文堆栈或调用堆栈的表示。上下文是活动块或方法的状态。
堆栈中最顶层的上下文是当前正在执行的上下文。通常在从上下文返回后,程序执行会在它下面的上下文中恢复(即它的发送者的上下文)。
代码窗格
在上下文堆栈中突出显示的方法的代码显示在调试器窗口中心的代码窗格中,并且该方法中的当前语句被突出显示。
实例和上下文变量
在调试器窗口的底部有两个用于显示变量的监视列表。
左边的列表包含当前方法的接收者的所有实例变量。右侧的列表包含当前上下文中的所有临时变量。
当在这些列表中选择一个变量时,它的值将显示在列表右侧的空间中。
调试器按钮
假设调试器处于此图像中显示的状态,调试器按钮会执行以下操作:
继续:关闭调试器并继续。
继续正常执行程序。这里在成绩单上显示“12345”,发出哔声,返回#someMethod
等等……
重新启动:将上下文重置为其开始。
重新启动当前堆栈上下文的执行,to: 5
再次突出显示其第一个消息发送(此处)。
进入:进入消息发送步骤
进入方法(此处Interval>>do:
)突出显示其中发送的第一条消息。
Over:跳过消息发送
执行突出显示的消息发送 ( )并突出显示下一个 ( )。#do:
#beep
Through: Step into a block
像over一样单步执行代码,除了调试器在进入其代码是当前显示方法的一部分的任何上下文时也会暂停。这意味着:
- ) 块内的执行停止,
[:each | Transcript show: each]
而不是一次性跨过整个#do:
调用。 - 当从块返回时,调试器会跳到此方法中的下一个点,而不是重新调整到评估块的位置(即 inside
Interval>>do:
)。
一些简单的块构造,例如ifTrue: []
并且不会编译为实际的消息发送,并且无论使用Over还是ThroughifFalse: []
,调试器始终会进入此类块。
完整堆栈:显示完整堆栈
在堆栈窗格中显示更多帧。
Run to Here: Run to Selection
例如,如果您在此方法中突出显示文本“哔”#beep
,则程序将在消息发送之前恢复并停止。
其中:选择当前 pc 范围
如果光标被移动,则重新突出显示代码窗格中发送的下一条消息(此处do: [:each |Transcript show: each]
)。
其他特性
Squeak 调试器还允许您:
- 获得 DNU 时单击“创建”按钮轻松创建缺少的方法
- 让您直接在调试器中编辑代码
- 使用do it (cmd-a)评估代码位并在代码中打印(cmd-p) 命令
- 从堆栈、变量列表和代码窗格的上下文菜单中打开浏览器或检查器