JVMTI-从jvmtiFrameInfo获取行号

问题描述 投票:0回答:1

我有以下代码,可以在引发异常的情况下获取当前堆栈帧位置处的行号,但我是通过试验而不是通过规范来解决的。我只留下了相关的代码。

int max_frame_count = 50;
jvmtiFrameInfo frames[max_frame_count];
jint count;
(*jvmti_env)->GetStackTrace(jvmti_env, thread, 0, max_frame_count, frames, &count);
for (int loop = 0; loop < count; loop++) {
    jvmtiFrameInfo frame = frames[loop];
    jmethodID currentMethod = frame.method;
    (*jvmti_env)->GetMethodName(jvmti_env, currentMethod, &name_ptr, &signature_ptr, &generic_ptr);
    (*jvmti_env)->GetLineNumberTable(jvmti_env, currentMethod, &entry_count_ptr, &table_ptr);
    jint lineNumber = -1;
    int lineNumberCount;
    jlocation prevLocationId = -1;
    if (frame.location != -1) {
        for (int lineNumberLoop = entry_count_ptr - 1; lineNumberLoop >= 0; lineNumberLoop--) {
            jvmtiLineNumberEntry lineNumberEntry = table_ptr[lineNumberLoop];
            if (frame.location >= lineNumberEntry.start_location) {
                lineNumber = lineNumberEntry.line_number;
                break;
            }
        }
    }
}
对于GetLineNumberTable的所有行,

line_number返回start_location和相应的currentMethod。现在,我的困惑就从这里开始:为什么我不能将frame.locationstart_location返回的GetLineNumberTable相匹配?有什么规格如何匹配?虽然我的代码似乎有效,但我无法相信这是始终有效的解决方案。它向后搜索大于或等于frame.location的第一个lineNumberEntry.start_location

感谢任何提示和指示!

我有以下代码,可以在引发异常的情况下获取当前堆栈帧位置处的行号,但我是通过试验而不是通过规范来解决的。 ...

java jvm java-native-interface jvmti
1个回答
0
投票

[关于reading的更多信息之后,以上代码适用于所有情况。

© www.soinside.com 2019 - 2024. All rights reserved.