返回介绍

8.3 挂起整个虚拟机

发布于 2024-08-21 22:20:21 字数 1155 浏览 0 评论 0 收藏 0

在这里,我还想提一个比较重要的功能。在默认情况下,当断点条件成立时,系统会挂起相关的线程,没有断点的线程会继续执行。在实际环境中,那些还在继续执行的线程可能会对整个调试产生不利的影响。为此,我们可以设置断点类型为挂起整个Java虚拟机,而不仅仅是挂起相关线程。如图8.6所示,改变这个断点的类型:

图8.6 设置断点类型为挂起整个虚拟机

当然,默认情况下,调试器只会挂起遇到断点的线程,如果你希望所有断点的模式都是挂起虚拟机而不是挂起线程,则还可以在Eclipse的全局配置中设置,如图8.7所示。

图8.7 设置断点模式行为为挂起虚拟机

在挂起虚拟机模式下,程序进入断点后的状态如图8.8所示。

图8.8 挂起虚拟机时的系统状态

可以看到,当前所有的线程全部处于挂起状态,不论当前线程是否接触到了断点。这种模式可以排除其他线程对被调试线程的干扰。当然,使用这种方法有时候会引起调试器或者虚拟机的一些问题,导致系统不能正常工作。

直接执行上述代码,很可能抛出类似下面的异常:

Exception in thread "t2" java.lang.ArrayIndexOutOfBoundsException: 21079
  at java.util.ArrayList.add(ArrayList.java:444)
  at geym.conc.ch8.UnsafeArrayList$AddTask.run(UnsafeArrayList.java:19)
  at java.lang.Thread.run(Thread.java:745)

下面,就让我们用单步调试的方法,来重现这个异常吧!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文