【问题标题】:Converting BCI (bytecode indices) to source code line numbers将 BCI(字节码索引)转换为源代码行号
【发布时间】:2011-03-29 14:24:45
【问题描述】:

我正在编写 JVMTI 代码来分析 Java 程序,这主要需要使用函数 AsyncGetCallTrace 以固定时间间隔从随机线程获取堆栈跟踪。因此,我能够获得 CallTrace 结构,每个结构都包含一个 CallFrame 结构数组,其中包含有关堆栈跟踪中各个帧的数据。具体来说,这些数据包括:jmethodID method_id(框架所在的java方法的ID)和:jint lineno(.class文件中方法的BCI,据我了解文档)。我似乎找不到使用 JVMTI 框架将此“lineno”转换为相应源代码行号的方法(请参阅文件 jvmti.h,至少位于 /usr/lib/jvm/java-6-sun/include 中在 Linux 上)。事实上,即使在 JVMTI 框架之外,到目前为止我在网上唯一能找到的就是这里:http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html,但即使这样也可能不是我想要的,并且需要额外安装,并且需要我处理数据,由 C++ JMVTI 代码使用单独的 Java 程序生成。

如果有人知道如何将 BCI 转换为 JVMTI 中的源代码行号(甚至以任何方式),请帮助!

[如果有人很了解这个领域,请告诉我,因为我还有一些关于这个过程的问题要问。]

【问题讨论】:

    标签: code-analysis line-numbers jvmti


    【解决方案1】:

    我想我有点想通了。使用的主要方法是jvmti->GetLineNumberTable(...),它填充了一个jvmtiLineNumberEntry 数组。给定 BCI 行号 n(将映射到源行号),可以测试 int i 是:jvmtiLineNumberEntryArray[i]

    一个问题是,由于某种原因,AsyncGetCallTrace 始终返回奇怪的 BCI,因此尽管映射给出了精确源代码行号,但它们仍然不准确,因为原始的 BCI 并不准确。为什么会这样,我不知道。我希望使用 Sun Studio 分析器(它也使用 AsyncGetCallTrace)来测试返回的行号是否与我的分析器相同。在这种情况下,AsyncGetCallTrace 函数不准确。但到目前为止,使用 Sun Studio 本身就是一项挑战。 如果有人知道如何使用这个工具,请帮忙!

    更大的问题是 Java 方法通常是内联的,因此行号并不总是正确映射。事实上,这可能是上面段落中描述的问题的原因,尽管根据我看到的数字这似乎不太可能。以下是解决内联问题的一些信息:http://developer.amd.com/documentation/articles/pages/JVMTIEventPiggybacking.aspx

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2012-07-24
      • 2016-12-07
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2016-06-23
      • 2012-06-20
      • 2010-09-17
      相关资源
      最近更新 更多