methodLineTables 表中每一個項目的值,
都對應到由 classSourceFile 資料字串所參照之程式檔中的一個行號,亦即執行單元的程式碼行號。
下面就是一個 methodLineTables 字串的範例:
#51+1201#75+11,41
下面就是解譯字串的方法:
- # 記號後面緊接著的數字,代表程式碼中某個類別的完整行號。
在本例當中,該類別第一個方法的第一個執行單元,是在第 51 行。
- 加號 ("+") 後面的每一個數字,都代表要加到前一個行號的行數,以產生下一個執行單元的行號。
在本例當中,加號 (+1201) 後面的數字,是用來計算第二到第五個執行單元的行號。
- 51 + 1 = 第二個執行單元的行號:52
- 52 + 2 = 第三個執行單元的行號:54
- 54 + 0 = 第四個執行單元的行號:54(兩個執行單元位於同一個程式碼行上)
- 54 + 1 = 第五個執行單元的行號:55
- 如果行號增量是負數,或者大於九,就會指定執行單元的完整行號。
在本例當中,第六個執行單元是在 75 行,比前一個行號(55 行)整整多了 20 行。
在這種情況下,第六個執行單元就會指定完整的行號,然後再開始計算相對行號 (#75+11):
- 75 = 第六個執行單元的行號
- 75 + 1 = 第七個執行單元的行號:76
- 76 + 1 = 第八個執行單元的行號:77
- 逗號 (",") 代表一個方法的結束,以及下一個方法的開始。
逗號後面的數字和符號,之前已經解譯過了。
在本例當中,第二個方法的第一個執行單元行號,只比前一個方法的最後一個行號大 4,
因此在逗號後面繼續沿用相對行號 (,41):
- 77 + 4 = 第二個方法的第一個執行單元行號:81
- 88 + 1 = 第二個方法的第二個執行單元行號:89
附註:並不是所有的執行單元都有相關的程式碼資訊。
有的是由編譯器建立,來實作 Java 語言的語意;例如,異常狀況處理、起始設定或同步化。
這些產生的執行單元,在 methodLineTables 字串的完整行號是零。
完整行號為零,表示根本沒有行號資訊。
如果整個方法都沒有程式碼資訊,那就只有一個對應於行號零的執行單元。
下面是幾個 methodLineTables 字串範例及其意義:
methodLineTables 字串 |
意義 |
+5 |
如果第一個方法的第一個執行單元行號小於 10,則整個字串是以加號開頭,從第零行開始起跳。
在本例當中,第一個方法的第一個執行單元,是從第 5 行開始。
|
+0 |
如果第一個方法沒有程式碼資訊,則字串將由 +0 開頭。
任何套用於這類方法的 executableUnit 探針片段,只會在方法開頭處被插入一次。
|
...#437,#457+123... |
如果方法的第一個執行單元,在前一個方法最後一個執行單元之後超過 9 行才啟動,
則型樣為一個逗點、一個 # 記號以及新方法第一個執行單元的行號字串。
在本局部範例當中,新方法的第一個執行單元,是從前一個方法最後一個執行單元之後的 20 行開始。
|
...#437,+2... |
方法的最後一個執行單元可以要求附帶 "#" 表示法,
讓下一個方法的第一個執行單元再往後挪一點。
在本局部範例中,方法的最後一個執行單元是從 437 行開始,
而下一個方法的第一個執行單元則是從 439 行開始。
|