我有以下代码,可以在引发异常的情况下获取当前堆栈帧位置处的行号,但我是通过试验而不是通过规范来解决的。我只留下了相关的代码。
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.location
与start_location
返回的GetLineNumberTable
相匹配?有什么规格如何匹配?虽然我的代码似乎有效,但我无法相信这是始终有效的解决方案。它向后搜索大于或等于frame.location
的第一个lineNumberEntry.start_location
。
感谢任何提示和指示!
我有以下代码,可以在引发异常的情况下获取当前堆栈帧位置处的行号,但我是通过试验而不是通过规范来解决的。 ...
[关于reading的更多信息之后,以上代码适用于所有情况。