【问题标题】:java debugging - watch an out of scope variablejava调试 - 观察一个超出范围的变量
【发布时间】:2011-11-15 19:29:45
【问题描述】:

在调试 C/C++ 应用程序时,我可以创建一个监视转换为指针类型的地址,然后查看结构的内容,即使它超出范围也是如此。是否有可能在 Java 中实现类似的功能?
假设我在一个方法中,我向“&this”之类的东西添加了一个手表,然后当我离开类方法时,即使它超出范围,我仍然可以看到它的内容?

我很确定我的问题的答案是“不”,所以我最感兴趣的是“为什么不?”解释。这是 JVM 限制吗? JPDA 限制?有没有更好的地方来问这样一个专业的问题?

【问题讨论】:

    标签: java debugging jvm jpda


    【解决方案1】:

    在 C/C++ 中,您正在观察(指向的区域)一个任意指针,并将其转换为该变量。

    在 Java 中没有指针。你只能watch一个变量。超出范围不存在。

    为什么还要看呢?如果您将手表放在上面,则在范围内可以正常观看。

    【讨论】:

    • 对象存在于范围之外。假设我有一个很大的对象图和一个处理它的复杂算法。我想知道算法在哪个阶段修改了我图中的特定对象。我想逐步完成它,密切关注我感兴趣的实例的情况。
    • 嗯..是的,我的错。但是必须有一些在该对象可以访问的范围内的引用。我想您需要使用范围内的对象进行观察,深入到感兴趣的对象。我可以看到它不方便,有时甚至不支持。
    【解决方案2】:

    您无法查看不在范围内的变量。

    但是,如果您发现另一个指向它的变量,您可以观察同一个对象。

    观察一个没有在任何地方引用的对象是没有意义的(它不会以任何方式影响程序的执行,它不能再被改变,它将被垃圾收集并且内存被完全不同的东西重用)。

    Java 级别的调试工具仍然在 JVM 内存管理之上工作,因此您需要对对象的有效引用,而不能只查看随机内存区域。

    【讨论】:

    • 我不认为你理解这个问题。该对象仍然具有对它的引用,只是不是来自我目前正在逐步执行的当前类。假设我正在单步执行 20 个方法调用,并想查看其中哪一个修改了这个对象
    • 我认为你只能通过找到存在于这 20 个方法中的引用来做到这一点(可能在调用堆栈的某个地方),然后观察那个。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2017-08-20
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多