将 invokestatic 添加到 java/lang/Object。通过 JVM <init> TI 代理导致 JVM 崩溃并出现段错误



我正在尝试跟踪JVM中所有对象的分配。

在有关分配资料的几个文件中,提到最简单的方法是:将invokestatic Tracker.trackAllocation()V指令添加到java/lang/Object.<init>(通常由单个return指令组成,我们在它之前添加invokestatic,因此现在是2个指令)。

(我知道这种方法很慢,不会跟踪数组分配,但是我想从最简单的解决方案开始。我也不将对分配的对象引用到Tracker,但这将在稍后添加。)

类文件与JVM Ti代理进行仪器。

但是,在添加invokestatic指令后,JVM与Segfault崩溃。跟踪器对象被添加到Bootstrap classloader中,因此在任何阶段都应可见。我尝试添加nop而不是invokestatic,而JVM可以与修改后的对象类一起使用。因此,问题专门用于调用某些静态方法。

我还尝试了仪器应用程序(不是基本的一部分)类,并且它运行良好 - 调用了跟踪器,并且没有发生崩溃。另外,我尝试在2点重新定义对象:最初加载时(首次加载类),或在VMINIT事件之后(加载所有基本类并抬高JNI的限制时)。

>

关于仪器java.lang.object我有什么我缺少的?

代理的代码在这里:https://gist.github.com/korobochka/3bf2f906f6b85b2222dec(删除了错误检查,也不包括用于更改类的代码,但对于其他类别来说足够好)

看起来问题在于从leakagentInterface调用System.out.println。首先,System.out可能尚未初始化。第二,println可以分配对象本身。

最新更新