【问题标题】:Deciphering variable information while debugging Java在调试 Java 时解密变量信息
【发布时间】:2010-02-24 00:43:39
【问题描述】:

我正在使用 IntelliJ IDEA 8 来调试一些 Java,但这个问题可能适用于所有 Java 调试器。在变量列表中,它们显示为:

myVariable = {some.package.SomeClass@12345}

我很好奇类名后面的数字。具体数字是多少?如果引用的是同一个底层对象,两个变量是否会有相同的编号?

提前致谢。

【问题讨论】:

    标签: java debugging intellij-idea


    【解决方案1】:

    即JVM上报的objectId,详情请看JDWP specification

    唯一标识一个对象 目标虚拟机。一个特定的对象将是 仅由一个 objectID 标识 贯穿始终的 JDWP 命令和回复 它的生命周期(或直到 objectID 为 明确处置)。 ObjectID 是 不重复使用以识别不同的 对象,除非它已明确 处置,无论是否 引用的对象已经是垃圾 集。 objectID 为 0 表示 一个空对象。注意存在 对象 ID 不会阻止 对象的垃圾回收。任何 尝试访问垃圾 收集的对象及其对象 ID 将导致 INVALID_OBJECT 错误代码。垃圾收集可以 使用 DisableCollection 禁用 命令,但通常不会 有必要这样做。

    【讨论】:

    • JDWP objectID 有点没用,因为我们无法从代码中访问它。对象的 System.identityCashCode() 会更有用。这是因为我们经常有一个对象 A 包含对对象 B 的引用,并且在对象 A 的 toString() 中我们可以包含对象 B 的身份哈希码,但随后我们会查看变量 / 手表 / 等具有该身份哈希码的对象 B,我们找不到它,因为 IntelliJ IDEA 没有通过身份哈希码报告它。
    • 这同样适用于日志记录:我们经常记录对对象的引用;记录对象实例的一种简单可靠的方法是记录其 identityHashCode。但同样,IntelliJ IDEA 无法验证日志中引用的对象是否与变量中出现的引用相同,因为我只能记录一个 identityHashCode,但 IntelliJ IDEA 显示的是 JDWP objectID。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多