通过JVM TI代理将invokestatic添加到java / lang / Object。<init>会导致JVM因segfault

时间:2015-05-07 14:07:11

标签: java jvm instrumentation .class-file jvmti

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

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

(我知道这种方法很慢并且不会跟踪数组分配,但我想从最简单的解决方案开始。我也不会将对已分配对象的引用传递给跟踪器,但稍后会添加。)< / p>

类文件在onClassLoaded钩子中使用JVM TI代理进行检测。

但是,添加invokestatic指令后,JVM与segfault崩溃。 Tracker对象被添加到bootstrap类加载器中,因此它应该在任何阶段都可见。 我尝试添加nop而不是invokestatic,并且JVM可以与修改后的Object类一起使用。所以问题特别在于调用一些静态方法。

我还试图检测应用程序(不是基础的一部分)类并且它工作正常 - 跟踪器被调用并且没有发生崩溃。 此外,我尝试在2点重新定义Object:初始加载时(第一个加载的类),或者在vmInit事件之后(加载所有基类并解除对jni的限制)。

关于检测java.lang.Object有什么遗漏吗?

代理商的代码在这里: https://gist.github.com/Korobochka/3bf2f906f6ab85b22dec (错误检查被剥离,更改类的代码也不包括在内,但它对其他类来说效果很好)

1 个答案:

答案 0 :(得分:5)

看起来问题在于从LeakAgentInterface调用System.out。首先,println可能尚未初始化。其次,<input id="name" class="input" name="name" type="text" value="" size="30" /> <input id="email" class="input" name="email" type="text" value="" size="30"/> 可以自己分配对象。