JPDA 架構研究8 - Agent利用環境指針訪問VM(堆棧管理篇)

引入:數組

上篇文章講解了Agent利用環境指針訪問VM的線程組操做,這裏討論下堆棧操做。
jvm


分類4:堆棧操做ide

a. GetStackTrace.獲取某線程的堆棧。線程

jvmtiError
GetStackTrace(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.獲取全部活着的線程的堆棧信息。code

jvmtiError
GetAllStackTraces(jvmtiEnv* env,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr,
            jint* thread_count_ptr)

全部活着的線程的堆棧信息數組被放在返回值stack_info_ptr中。事件


c.GetThreadListStackTraces。獲取給定線程列表的堆棧信息。it

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


d.GetFrameCount.獲取給定線程調用堆棧中的當前幀數。io

jvmtiError
GetFrameCount(jvmtiEnv* env,
            jthread thread,
            jint* count_ptr)


e.PopFrame.彈出給定線程堆棧的最上層的frame.class

jvmtiError
PopFrame(jvmtiEnv* env,
            jthread thread)

這時候

(1)當前的frame就會被丟棄而以前的frame就會成爲當前的frame.

(2)運算子(operand)的堆棧被恢復。

(3)操做碼(opcode)恢復到以前的調用指令。


f.GetFrameLocation.返回當前執行的指令frame的位置。

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

從返回能夠看出,這個返回位置包含深度,方法指針,位置指針。


g.NotifyFramePop. 當某Frame從堆棧中彈出時候,產生一個FramePop事件。

jvmtiError
NotifyFramePop(jvmtiEnv* env,
            jthread thread,
            jint depth)
相關文章
相關標籤/搜索