软件的“Heisenbug Principal”(观察程序会改变其行为)将始终适用,但在传统调试器下运行应该没有什么特别的区别。一个例外是当一个程序遭受高速缓存异常时。如果未能正确锁定共享变量,则CPU 1可能会向该变量写入一个值,并且CPU 2可能会在一段时间内看不到该新值。ODB将防止发生此错误。有静态锁分析器。使用一个。替代集合类(MyArrayList,Vector,Hashtable)不会通过枚举器记录更改的条目。菜单栏上显示的时钟非常有价值。
Java在所有使用锁的代码周围都有一个“catch”。通常你不会注意到这一点。它将在ODB中显示为“extra”捕获。
调用“super”方法看起来像调用静态方法。(目前还不清楚什么样的显示最“直观”。):
MySuperObj.frob() -> void
frob -> void
某些char和boolean值会被记录成int值。
一些Swing的bug和错误消息出现在JDK 1.3中,你可以忽略它(再次按下控制器中的“Stop”将强制重新显示 – 在JDK 1.3中有用)。数组只显示前1000个元素。「TTY Output」窗格仅显示对println()写入标准输出的调用。
为了更快速地启动大型项目(超过100个文件),大多数文件不经常重新编译,你可以手动监测文件。
RMI与序列化的问题(RMI and Serialization Problems)
如果序列化一个对象,那么对它进行反序列化的程序期望与序列化它的程序具有相同的类定义。但是,如果两个程序中的一个程序被检测,而另一个程序不被检测,则可能会获得各种异常,如下所示。一种解决方案是直接对文件进行监测,并在关闭收集的情况下简单地运行一端。
可能验证错误(Possible Verifier Bugs)
因为ODB是通过插入类代码来工作的,所以你的javac编译器可能会以ODB无法使用的形式生成代码。(它适用于我生成的所有代码,但我之前感到很惊讶。)你唯一可以做的就是:(a)将该类放入“don’t instrument”列表中;(b)手动调试所有其他文件,并在关闭监测下运行ODB。并向我汇报错误。
典型的验证错误(和相关的链接器错误)如下所示:
Unable to pop operand off an empty stack
类加载器问题(Classloader Issues)
ODB的默认操作是使用我写的类加载器,它是java.lang.ClassLoader的简单子类。但是,如果你对自己的某些代码使用自己的类加载器,那么那些代码将不会被监测,甚至可能导致类加载器冲突(类加载不会识别你加载的类)。依赖于特定类加载器的方法也会失败。例如,Class.getPackage()方法访问类加载器以确定包(出于某种原因),在 我的类加载器中它将返回null。
你可以手动监测(上图)或构建并安装系统类加载器:
或者
字体显示
在java version “1.6.0_45″中,如果Track面板中的记录数比较多,在进行滚动时,界面中字体重叠,黑成一团。当从新调整窗格大小时,恢复正常。这个问题出现在我的ThinkPad T540p上,而我的Dell M6800上没有这个问题。
目前该问题已经解决,通过在JScrollPane加入滚动监听,并在滚动的时候进行重绘。
参考文献
用户手册中的Known Bugs部分