博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPDA 架构研究8 - Agent利用环境指针访问VM(堆栈管理篇)
阅读量:7030 次
发布时间:2019-06-28

本文共 1667 字,大约阅读时间需要 5 分钟。

引入:

上篇文章讲解了Agent利用环境指针访问VM的线程组操作,这里讨论下堆栈操作。

分类4:堆栈操作

a. GetStackTrace.获取某线程的堆栈。

jvmtiErrorGetStackTrace(jvmtiEnv* env,            jthread thread,            jint start_depth,            jint max_frame_count,            jvmtiFrameInfo* frame_buffer,            jint* count_ptr)

入参thread表示要分析的线程,如果不设置值则为当前线程。start_depth表示要分析的起始深度,0表示当前frame,1 表示调用者的frame,2表示调用者的调用者的frame. max_frame_count表示最大frame数。返回frame_buffer包含了巨大的想要的堆栈信息。

b.GetAllStackTraces.获取所有活着的线程的堆栈信息。

jvmtiErrorGetAllStackTraces(jvmtiEnv* env,            jint max_frame_count,            jvmtiStackInfo** stack_info_ptr,            jint* thread_count_ptr)

所有活着的线程的堆栈信息数组被放在返回值stack_info_ptr中。

c.GetThreadListStackTraces。获取给定线程列表的堆栈信息。

jvmtiErrorGetThreadListStackTraces(jvmtiEnv* env,            jint thread_count,            const jthread* thread_list,            jint max_frame_count,            jvmtiStackInfo** stack_info_ptr)

d.GetFrameCount.获取给定线程调用堆栈中的当前帧数。

jvmtiErrorGetFrameCount(jvmtiEnv* env,            jthread thread,            jint* count_ptr)

e.PopFrame.弹出给定线程堆栈的最上层的frame.

jvmtiErrorPopFrame(jvmtiEnv* env,            jthread thread)

这时候

(1)当前的frame就会被丢弃而之前的frame就会成为当前的frame.

(2)运算子(operand)的堆栈被恢复。

(3)操作码(opcode)恢复到之前的调用指令。

f.GetFrameLocation.返回当前执行的指令frame的位置。

jvmtiErrorGetFrameLocation(jvmtiEnv* env,            jthread thread,            jint depth,            jmethodID* method_ptr,            jlocation* location_ptr)

从返回可以看出,这个返回位置包含深度,方法指针,位置指针。

g.NotifyFramePop. 当某Frame从堆栈中弹出时候,产生一个FramePop事件。

jvmtiErrorNotifyFramePop(jvmtiEnv* env,            jthread thread,            jint depth)
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587697,如需转载请自行联系原作者
你可能感兴趣的文章
RESTful API 中的 Status code 是否要遵守规范
查看>>
第十一天-《企业应用架构模式》-对象-关系行为模式
查看>>
[spring boot] jdbc
查看>>
新的开始!
查看>>
区块链— 比特币中的区块、账户验证和记账
查看>>
Electron打包,NSIS修改默认安装路径
查看>>
分享一些好用的网站
查看>>
【Android】Retrofit 2.0 的使用
查看>>
Nacos系列:基于Nacos的注册中心
查看>>
原生JS 实现复杂对象深拷贝(对象值包含函数)
查看>>
【跃迁之路】【732天】程序员高效学习方法论探索系列(实验阶段489-2019.2.22)...
查看>>
PAT A1060 科学记数法经典例题(全string库解决)
查看>>
仿知乎分享界面
查看>>
最小外接矩形思路以及实现
查看>>
Python是什么?简单了解pythonp-入门
查看>>
利用ES6进行Promise封装总结
查看>>
ES10 特性的完整指南
查看>>
学习threejs走过的坑
查看>>
ThinkSNS+的 SPA(H5)安装教程
查看>>
C++回声服务器_5-多进程版本
查看>>