当前位置: 首页 > 知识库问答 >
问题:

JVMTI-从jvmtiFrameInfo获取行号

南宫才艺
2023-03-14
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;
            }
        }
    }
}

共有1个答案

姬寂离
2023-03-14

你的想法是对的。若要通过jlocation查找行号,您需要使用最接近的start_location来查找jvmtilinenumberentry,该start_location小于或等于jlocation

实际上,官方的JVM TI示例执行类似的搜索:

HeapTracker.c

error = (*jvmti)->GetLineNumberTable(jvmti, finfo->method, &lineCount, &lineTable);
if ( error == JVMTI_ERROR_NONE ) {
    /* Search for line */
    lineNumber = lineTable[0].line_number;
    for ( i = 1 ; i < lineCount ; i++ ) {
        if ( finfo->location < lineTable[i].start_location ) {
            break;
        }
        lineNumber = lineTable[i].line_number;
    }
} else if ( error != JVMTI_ERROR_ABSENT_INFORMATION ) {
    check_jvmti_error(jvmti, error, "Cannot get method line table");
}
for ( i = start ; i < count ; i++ ) {
    if ( location < table[i].start_location ) {
        HPROF_ASSERT( ((int)location) < ((int)table[i].start_location) );
        break;
    }
    line_number = table[i].line_number;
}
 类似资料:
  • 本文向大家介绍Java获取JVMTI环境,包括了Java获取JVMTI环境的使用技巧和注意事项,需要的朋友参考一下 示例 内部Agent_OnLoad方法:            

  • 为了帮助 Java 开发人员诊断和跟踪 Java 线程状态的切换,Sun 公司在 Java 开发工具包(Java2 Software Development Kit, JDK)1.5.0 版本中引进了 Java 虚拟机工具接口(Java Virtual Machine Toolkit Interface,JVMTI),用于替代在先前的 JDK 版本中作为试验功能存在的 Java 虚拟机剖析接口(J

  • 我需要读取excel文件并突出显示重复的行,而不需要编辑excel或添加新的列/行。我使用读取excel文件,并使用读取所有重复行,但不包括'mark4'。问题是,我无法提取这些行号来与一起使用,以突出显示excel中的那些行,因为这些行不包括在DF中。 我试过,但由于没有唯一的行,所以无法提取数据。 的输出为: [6行x170列] 我需要提取那些不属于excel列的行号,并将它们作为列表用于将来

  • 问题内容: 我有以下查询: 如何检查是否有行,如何只返回第一行(如果有匹配项,则只能返回一行)? 问题答案: 使用 得到之一,正是一个结果。在所有其他情况下,它将引发你可以处理的异常: 还有,它将为你提供可能的第一个结果,而不会引发这些异常。但是,由于你要处理没有结果或超出你的想象的情况,因此正是你应该使用的方法。

  • 问题内容: (.issues[] | {key, status: .fields.status.name, assignee: .fields.assignee.emailAddress}) 输出: 但是我需要解析每一行,但是就密钥组而言,很难确定哪个受让人对应哪个密钥。使用jq可以使一束成行吗? 预期产量: 要么 问题答案: 您可能需要的是 使用上面发布的输出,可以进行进一步处理: 给予 或者您