Crash jvmti:jni getobjectclass和有时GetIntField崩溃

Crash jvmti:jni getobjectclass和有时GetIntField崩溃,crash,segmentation-fault,jvmti,jnienv,Crash,Segmentation Fault,Jvmti,Jnienv,我正在为java程序编写一个jvmti代理。我正在尝试读取堆栈上的对象。使用VMinit/vmstart事件上接收到的jnienv指针。 我使用以下命令成功读取methodexit事件中的对象: 从getlocalvariableentry()获取变量(插槽); 从变量签名使用jni函数获取对象,使用getlocalobject函数获取引用对象/对象的子类;jni::getobjectclass();使用返回的类,获取类中的字段; 使用getclassfields();然后从getfieldna

我正在为java程序编写一个jvmti代理。我正在尝试读取堆栈上的对象。使用VMinit/vmstart事件上接收到的jnienv指针。 我使用以下命令成功读取methodexit事件中的对象: 从getlocalvariableentry()获取变量(插槽); 从变量签名使用jni函数获取对象,使用getlocalobject函数获取引用对象/对象的子类;jni::getobjectclass();使用返回的类,获取类中的字段; 使用getclassfields();然后从getfieldname()获取字段签名;然后根据字段的签名为其调用适当的函数,例如为int field调用getintfield()。 但是,一旦我尝试在函数中的try块中创建的对象上执行此操作,就会引发methodexit事件;每次在Getobjectclass()上我都会遇到崩溃(SIGSEGV)。这是因为对象在范围之外被销毁了吗;如果是,如何在函数退出时读取函数try块中的变量值。 获取崩溃在为Integer(从localvariabletableentry)对象读取jobject时,我调用getintfield()作为其int字段成员的第一个成员MIN_值。如果我只是尝试读取Integer类的成员“VALUE”,则调用getintfield()不会崩溃。 这次崩溃是因为我试图读取一个类的静态最终成员,即integer类的member MIN_值。 如何解决这个问题并避免崩溃?

1)如何知道通过GetLocalobject获取的jobject是否已被销毁?2)如何知道类的字段(通过Getclassfields获取)是否是其类的静态成员或最终成员3)当jobject引用空(没有成员)的类对象时,getobjectclass崩溃并且位于调用其退出getobjectclass的函数内的try块中