methodLineTables 数据字符串格式

methodLineTables 数据字符串对表进行编码,每个条目对应于类中的每个可执行单元。

methodLineTables 表中每个条目的值是对应的可执行单元的行号(在 classSourceFile 数据字符串命名的源文件中)。例如,表中的 5 号条目给出 5 号可执行单元的行号。

以下是 methodLineTables 字符串的示例:
#51+1201#75+11,41
下面是对该字符串的解释:
  • 紧跟在编号符号(“#”)后面的数字表示一个类的源代码中的完整行号。在该示例中,类中的第一个方法的第一个可执行单元在第 51 行上。
  • 加号(“+”)后面的每个单个数字表示要与前一个行号相加的行数,以便生成下一个可执行单元的行号。在该示例中,加号后面的数字(+1201)用来计算第二个到第五个可执行单元的行号。
    1. 51 + 1 = 第二个可执行单元的行号:52
    2. 52 + 2 = 第三个可执行单元的行号:54
    3. 54 + 0 = 第四个可执行单元的行号:54(这两个可执行单元位于同一个源代码行上)
    4. 54 + 1 = 第五个可执行单元的行号:55
  • 当行号增量为负数或者大于九时,就会指定可执行单元的完整行号。在该示例中,第六个可执行单元在第 75 行上,比前一个行号 55 要大 20。在这种情况下,将指定第六个可执行单元的完整行号,并重新开始计算相对行号(#75+11):
    1. 75 = 第六个可执行单元的行号
    2. 75 + 1 = 第七个可执行单元的行号:76
    3. 76 + 1 = 第八个可执行单元的行号:77
  • 逗号(“,”)表示一个方法的结束,同时又表示下一个方法的开始。逗号后面的数字和符号与逗号前面的数字和符号作同样的解释。在该示例中,第二个方法的第一个可执行单元的行号仅比对前一个方法计算的最后一个行号大 4,因此,在逗号(,41)后面将继续计算相对行号:
    1. 77 + 4 = 第二个方法的第一个可执行单元的行号:81
    2. 81 + 1 = 第二个方法的第二个可执行单元的行号:82
注意:并不是所有可执行单元都具有与它们相关联的源代码信息。某些可执行单元是编译器为了实现 Java 语言的语义(例如,异常处理、初始化或同步)而创建的。生成的这些可执行单元在 methodLineTables 字符串中具有一个完整行号 - 零。完整行号为零表示未提供行号信息。当整个方法没有源代码信息时,它表现为具有单个可执行单元,且对应于行号零。
以下是 methodLineTables 字符串的更多示例以及它们的含义:
methodLineTables 字符串 含义
+5 如果第一个方法的第一个可执行单元的行号小于 10,则整个字符串将以加号开头,以开始从行号零开始的增量系列。在此示例中,第一个方法的第一个可执行单元从第 5 行开始。
+0 如果第一个方法没有源代码信息,则字符串以 +0 开头。应用于这样一个方法的任何 executableUnit 探针段都将仅在方法的开头插入一次。
...#437,#457+123... 如果一个方法的第一个可执行单元从前一个方法的最后一个可执行单元的不止 9 行之后开始,则模式为逗号、编号符号和新方法中的第一个可执行单元的行号字符串。在该部分示例中,新方法中的第一个可执行单元从前一个方法的最后一个可执行单元的 20 行之后开始。
...#437,+2... 方法中的最后一个可执行单元可能要求“#”符号,而下一个方法的第一个可执行单元与它稍微隔开。在该部分示例中,一个方法的最后一个可执行单元从第 437 行开始,而下一个方法的第一个可执行单元从第 439 行开始。
相关参考
探针段