我正在尝试跟踪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
可以分配对象本身。