我正在将JVMTI代码编写为配置Java程序,该程序主要需要使用函数AsyncgetCallTrace以固定的时间间隔从随机线程中获取堆栈跟踪。因此,我能够获取Calltrace结构,每个结构都包含一个CallFrame结构,这些结构包含有关堆栈跟踪中各个帧的数据。具体而言,这些数据包含:jmethodid method_id(框架所在的Java方法的ID)和:Jint Lineno(据我了解,.class文件中的方法BCI(据我了解文档))。我似乎找不到使用JVMTI框架将此“ Lineno”转换为相应的源代码线号的方法(请参阅/usr/lib/lib/jvm/jvm/java-6-sun/confile infile jvmti.h在Linux上)。实际上,即使在JVMTI框架之外,我到目前为止在网络上唯一能找到的东西是这里: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/linenumbertable.html, ,但即使这也可能没有做我想要的事情,需要额外的安装,并要求我使用单独的Java程序处理由C ++ JMVTI代码生成的数据。

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

如果有人很好地知道这个领域,请告诉我,因为我还有一些问题要询问该过程。

有帮助吗?

解决方案

我想我有点想出了这一点。使用的主要方法是jvmti-> getlineNumbertable(...),它填充了JVMTILINUMBERENTRY数组。给定BCI线号n(应映射到源线号),可以测试INT I是:JVMTIRINUMBERENTRYARRARAY [i] <= n <= n <jvmtilinenumberentryarray [i + 1]。然后,此I是所需的相应源代码行号。

一个捕获是,由于某种原因,AsyncgetCallTrace始终返回怪异的BCI,因此,尽管映射给出了 精确的 源代码行号,它们仍然不是 准确的, ,因为原始的BCI不准确。为什么这是我不知道的。我希望使用也使用AsyncgetCalltrace的Sun Studio Profiler来测试返回的行号是否与我的Profiler相同。在这种情况下,异步CallTrace函数不准确。但是到目前为止,使用Sun Studio变成了自己的挑战。 如果有人知道如何使用此工具,请提供帮助!

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top