JPDA 架构研究10 - Agent利用环境指针访问VM(局部变量管理篇)

引入:

上篇我们讲解了Agent如何利用环境指针访问VM的管理堆的操作。这里主要讲解如何管理局部变量。

分类6:局部变量管理

a.GetLocalObject. 获取局部对象

jvmtiError
GetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject* value_ptr)

b.GetLocalInt.获取局部整型值

jvmtiError
GetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint* value_ptr)

它可以被用来获取整型,字符,字节,布尔型。

c.GetLocalLong.获取局部长整型值

jvmtiError
GetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong* value_ptr)

d.GetLocalFloat.获取局部的浮点值。

jvmtiError
GetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat* value_ptr)

e.GetLocalDouble.获取局部的双精度浮点值。

jvmtiError
GetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble* value_ptr)

f.SetLocalObject.设置局部对象。

jvmtiError
SetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject value)

g.SetLocalInt.设置局部整型变量。

jvmtiError
SetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint value)

同样适用于整型,字符,字节,布尔型。

h.SetLocalLong.设置局部长整型变量。

jvmtiError
SetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong value)

i.SetLocalFloat.设置局部浮点变量。

jvmtiError
SetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat value)

j.SetLocalDouble.设置局部双精度浮点变量。

jvmtiError
SetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble value)
时间: 2024-10-10 15:52:54

JPDA 架构研究10 - Agent利用环境指针访问VM(局部变量管理篇)的相关文章

JPDA 架构研究9 - Agent利用环境指针访问VM (堆管理篇)

引入: 上文中我们讨论了Agent利用环境指针访问VM的堆栈操作部分,这里我们讨论堆操作部分. 分类5:堆操作 a. GetTag. 获取对象在堆上的唯一标识符(长整型). jvmtiError GetTag(jvmtiEnv* env,             jobject object,             jlong* tag_ptr) b.SetTag.为对象设置堆上的唯一标示符. jvmtiError SetTag(jvmtiEnv* env,             jobje

JPDA 架构研究13 - Agent利用环境指针访问VM(类管理篇)

引入: 上文中提到Agent如何利用环境指针访问VM的(Watch)功能,这里主要讲解如何去管理类的. 分类9:管理类 a.GetLoadedClasses. 获得虚拟机中所有被加载的类的数组. jvmtiError GetLoadedClasses(jvmtiEnv* env,             jint* class_count_ptr,               jclass** classes_ptr) 从返回值可以看出,class_count_ptr表示被加载的类的数量,cla

JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)

引入: 上文讨论了Agent如何利用环境指针访问VM(管理类),这里讨论如何管理对象. 分类9:对象管理 a.GetObjectSize.  获取对象的大小, jvmtiError GetObjectSize(jvmtiEnv* env,             jobject object,             jlong* size_ptr) 注意,这不是真实大小,这只是从对象的定义代码中获得的一个预估值. b.GetObjectHashCode.获取对象的hash值. jvmtiErr

JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)

引入: 我们在前面说到JVMTI的客户端Agent,又提到Agent通过环境指针来访问VM.这里就来看看环境指针到底有多大的访问VM的能力. 分类1:内存管理 a.Allocate. 分配内存 jvmtiError Allocate(jvmtiEnv* env,             jlong size,             unsigned char** mem_ptr) size:分配的字节数. mem_ptr:分配内存的首地址. b.Deallocate.释放内存,释放已经分配的内

JPDA 架构研究7 - Agent利用环境指针访问VM(线程组管理篇)

引入: 上篇文章中我们讨论了Agent利用环境指针访问VM的线程操作,这里讨论线程组操作. 分类3:线程组操作 a.GetTopThreadGroups.让Agent获取VM中的所有全局的线程组. jvmtiError GetTopThreadGroups(jvmtiEnv* env,             jint* group_count_ptr,             jthreadGroup** groups_ptr) 函数会返回全局的线程组的数量和线程组的列表. b.GetThre

JPDA 架构研究8 - Agent利用环境指针访问VM(堆栈管理篇)

引入: 上篇文章讲解了Agent利用环境指针访问VM的线程组操作,这里讨论下堆栈操作. 分类4:堆栈操作 a. GetStackTrace.获取某线程的堆栈. jvmtiError GetStackTrace(jvmtiEnv* env,             jthread thread,             jint start_depth,             jint max_frame_count,             jvmtiFrameInfo* frame_buff

JPDA 架构研究15 - Agent利用环境指针访问VM(字段访问篇)

引入: 上文中我们已经探讨了Agent如何利用环境指针访问VM(对象级的操作),现在我们 讨论让Agent利用环境指针访问类的字段. 分类10:字段访问 a.GetFieldName.获取某类的某字段名字 jvmtiError GetFieldName(jvmtiEnv* env,             jclass klass,             jfieldID field,             char** name_ptr,             char** signat

JPDA 架构研究11 - Agent利用环境指针访问VM(断点操作篇)

引入: 上文我们讲解了Agent如何利用环境指针访问VM(操作局部变量篇),这里主要关注于如何操作断点. 这个在调试期间非常频繁的被使用. 分类7:断点操作 a.SetBreakPoint.设置断点,它会产生一个BreakPoint事件. jvmtiError SetBreakpoint(jvmtiEnv* env,             jmethodID method,             jlocation location) 设置断点指令.从这里可以看出需要传两个参数,一个是被设断

JPDA 架构研究12 - Agent利用环境指针访问VM(观察字段篇)

引入: 上文我们讲解了Agent如何利用环境指针访问VM的操作断点部分,这里我们详细讲解观察字段篇.这也是我们调试期间用的最多的操作.因为我们要不断从Watch Field看他们值的改变. 分类8:观察字段 a.SetFieldAccessWatch.启用对某字段进行访问的观察.每次访问都会创建一个FieldWatch事件. jvmtiError SetFieldAccessWatch(jvmtiEnv* env,             jclass klass,             jf