首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将BCI (字节码索引)转换为源代码行号

将BCI (字节码索引)转换为源代码行号
EN

Stack Overflow用户
提问于 2010-08-14 01:26:17
回答 1查看 1.4K关注 0票数 6

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-20 22:28:32

我想我多少弄明白了这一点。要使用的主要方法是jvmti->GetLineNumberTable(...),它填充一个jvmtiLineNumberEntry数组。给定BCI行号n(其将被映射到源码行号),可以测试哪个int i是: jvmtiLineNumberEntryArrayi <= n< jvmtiLineNumberEntryArrayi + 1。然后,该int i是所需的相应源码行号。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3479270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档