[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    JVMTI GetStackTrace / GetThreadListStackTraces / GetAllStackTraces & GetFrameCount
From:       strale () gmx ! net (Erich)
Date:       2010-12-23 0:56:26
Message-ID: BB9A2C93-C052-444E-9ADF-E0E33734812C () gmx ! net
[Download RAW message or body]

Hello,

I've a few suggestions for future jvmti revisions regarding the Get*StackTrace[s] \
functions. First, they are quite inconsistent. While you can provide a start depth \
when calling the GetStackTrace function, GetThreadListStackTraces / GetAllStackTraces \
are lacking this parameter. I don't know if somebody wold need to specify this \
parameter for GetAllStackTraces, but I would welcome it at least for \
GetThreadListStackTraces.

More important is that it is not possible to get the frame count while getting the \
stack trace. 

Well, it's possible. You can either set the max stack depth to an astronomical high \
number to get all the stack frames and just parse those you are interested - which \
would be a waste of memory and cpu time, or suspend the thread before getting the \
stacktrace, when max frame count == frame count captured call GetFrameCount and \
resume the thread - which would imply a big performance overhead.

I would therefore propose 2 new functions ... or replacents when the new jvmti \
revision is requested:

jvmtiError GetStackTrace(jvmtiEnv* env, jthread thread, jint start_depth, jint \
                max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr, jint* \
                stack_depth)
	... when stack_depth is != NULL the stack_depth is set.
jvmtiError GetThreadListStackTraces(jvmtiEnv* env, jint thread_count, const jthread* \
thread_list, jint *start_depth_list, jint max_frame_count, jvmtiStackInfo** stack_ \
info_ptr)

and a change of the jvmtiStackInfo structure:
typedef struct {
    jthread thread;
    jint state;
    jvmtiFrameInfo* frame_buffer;
    jint frame_count;

    jint stack_depth;
} jvmtiStackInfo;

where stack_depth is the current depth of the stack. Which would also solve the issue \
when the stack is exactly max_stack_depth you can't tell if you got the whole \
stacktrace or just part of it.

Best regards & merry christmas,
  Erich Hochmuth


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic