我正在编写 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 程序生成。
如果有人知道如何从 JVMTI 中(甚至以任何方式)将 BCI 转换为源代码行号,请提供帮助!
[如果有人很了解这个领域,请告诉我,因为我还有一些关于这个过程的问题要问。]