「界面中的窗格」

ODB尝试一次性在屏幕上显示所有感兴趣的数据。弹出对话框仅用于查找源文件和选择值,这些很少用的地方。所用的窗格里的内容都是同一个时间戳的。

「Threads」

线程以<Thread-3>一样的格式显示,其中“Thread-3”是由getName()方法返回的内容。如果当前选定的时间戳在线程创建之前(在线程的第一个时间戳之前),则线程显示为— <Thread-3> –。如果选定的时间戳在线程退出之后,则显示为<Thread-3> Dead (在最后时间戳之后的线程的isAlive()方法返回false)。如果线程被阻塞、等待一个锁、在一个调用wait()或join()之中时,它将显示为<Thread-10> <MyObj_2>。将线程添加到「Objects」窗格将显示为伪实例变量_blockedOn。

「Stack」

这里显示堆栈中的所有方法。单击「Stack」窗格中的一行将更新「Code」窗格、参数、局部变量。当前的时间戳不会被改变。推动任何按钮都会影响实际时间,而不是在「Code」窗格中显示的内容。(目前还不清楚这里最“直观的”是什么。)菜单命令Code->Goto Stack Frame将恢复为该时间戳。

「Locals」

所有参数和局部变量将显示在这里。如果程序编译时没有-g标志,局部变量名称将显示为var1等等。

「this」

该窗格显示当前的’this’对象(或静态方法的类对象)。

「Trace」

对于每个线程,这显示了所有进行的方法调用的跟踪。只显示三个参数。只记录十个。

「Code」

这显示了当前的代码行。按钮向前或向后移动都是从这条线开始。这两个例外是:当选择了一个更高的堆栈帧(请参阅「Stack」窗格)并且在无法找到的源文件中出现时间戳时,「Code」窗格将为空。

「TTY Output」/「I/O」

这显示了由System.out.println()和System.err.println()写入的所有行。(很显然,只有那些来自被检测代码的调用。)如果行前面有“–”,表示当前时间戳在该行被写入的时间之前。(最终,这个窗格将显示调用print(),write()等去任何I/O流。)

「Objects」

这显示了用户通过双击其他窗口中的对象复制的任何对象。双击实例变量会将该对象添加到「Objects」窗格。双击「Objects」窗格中的对象将“关闭”该对象,隐藏其所有实例变量。再次双击将打开它。单个实例变量也可以选择性地删除(请参阅Objects->Remove和Objects->Retain)。

双击一个实例变量将展开该实例变量的值(如图2中的数组int[20]_0)。如果该值是一个基元或者是一个没有可见实例变量的对象,则不会发生任何事情。按下“Previous Value”按钮等将前进到实例变量的下一个值,而不是实例变量的实例变量的下一个值。例如,图2中数组的前一个值为空,所以如果你去那里,数组将会消失。如果你选择一个实例变量的实例变量,那么这些命令将在该实例变量上起作用,如果实例变量也更改了值,则这些命令可能会使其消失。(这个递归的东西有点混乱,试着操作一下。)

尚未设置的值(例如,对象创建之前的实例变量)将显示为“–”。变量值如果从先前选择的时间戳后发生了更改,将会显示一个前导“*”。

目前只支持单一级别的递归。双击实例变量的实例变量会将该实例变量复制到「Object」窗格的顶层。实例变量的值也可以通过Objects->Add Instance Variable复制到顶层。

Objects菜单允许你显示所选对象的类对象(及其静态变量),Objects->Add Class。

参考文献

用户手册中的「The Display Panes」部分