没有断点的Java调试

时间:2015-07-06 13:47:01

标签: java debugging intellij-idea

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

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

&#34;取()&#34;将永远阻止,并且我希望在调用take()之后使用调试器获取d的值。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

在你的情况下,它不是选项。您可以选择的一个选项是对包含BlockingQueue类的jar进行反编译,将它们转换为源文件,将其包含在项目中,并在take()内设置断点以查看行为。

一个最好的反编译器是:

http://jd.benow.ca/

使用此功能,您可以查看take()函数的来源并复制整个类并将其粘贴到名称为BlockingQueue.java的包中,并根据需要粘贴整个源代码并进行调试。

答案 2 :(得分:0)

查看错误后的线程状态非常有用;虽然它在一些解释性语言中更常见,但令人遗憾的是Java缺乏。然而,有四种方法可以想到,但是请记住,Java中的标准方法是记录重要状态以便以后进行诊断。

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

答案 3 :(得分:0)

注意到Eclipse和IntelliJ中有一个暂停/暂停按钮。这是在做这项工作。