Java无断点调试

问题描述 投票:0回答:5

是否可以在没有断点的情况下调试正在运行的 java 进程(使用 Eclipse / IntelliJ)?当具有这样的构造时,对于获取对象的状态很有用:

double d = Math.random();
BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.take();

“take()”将永远阻塞,我想在调用 take() 后使用调试器获取 d 的值。

java debugging intellij-idea
5个回答
1
投票

I'd like to get the value of d with the debugger after take() was called

一个简单的解决方案是打印该值。那么你就根本不需要调试器了。当由于测试某些内容、在运行时检查某些对象等而更改数据时,调试器非常有用。

queue.take();
System.out.println(d);

0
投票

在你的情况下,这不是选择。您可以选择的一种选择是反编译包含

BlockingQueue
类的 jar,将它们转换为源文件,将其包含在您的项目中,并在
take()
内设置断点以查看行为。

一个最好的反编译器是:

http://jd.benow.ca/

使用此功能,您可以查看

take()
函数的源代码,并复制整个类并将其粘贴到名称为
BlockingQueue.java
的包中,然后根据需要粘贴整个源代码并进行调试。


0
投票

在发生错误后查看线程的状态将非常有用;虽然它在某些解释性语言中更为常见,但遗憾的是在 Java 中却缺乏。然而,我想到了四种方法,但请记住,Java 中的标准方法是记录重要状态以供以后诊断。

  1. 记录您的系统,并保持所有处理的幂等性和确定性。
  2. 出现错误后附加调试器;您将无法回滚到异常点,但您将能够检查系统的当前状态
  3. 向您的服务器添加一个 repl,您可以通过 telnet 进入并检查系统
  4. 研究 Java 的 DVR 解决方案,例如 http://chrononsystems.com。它们允许系统回滚到异常点。

0
投票

刚刚注意到 Eclipse 和 IntelliJ 中有一个暂停/挂起按钮。这就是工作。


0
投票

可以通过 IntelliJ 中的暂停操作实现。您可以在调试器的工具栏或Run | 中找到它。 调试操作 | 暂停。 此操作将允许您按照您的描述读取变量值。 您可以在这里阅读更多相关信息。此外,此操作还有几个高级用例,例如无源调试

© www.soinside.com 2019 - 2024. All rights reserved.