本文說明用於收集、儲存及傳輸 Fuchsia 追蹤記錄的二進位格式。您可以使用這份文件搜尋 Fuchsia 追蹤記錄格式中各個欄位的詳細資訊。
總覽
追蹤記錄執行期間,追蹤記錄提供者會使用本文所述的二進位格式,將記錄寫入與追蹤管理員共用的追蹤緩衝區 VMO。
二進位格式設計的目的,是在記錄追蹤記錄時,盡可能降低對追蹤對象效能的影響。記錄也會依序寫入,因此如果追蹤作業結束 (正常或異常結束),追蹤管理員仍可透過讀取上次格式正確記錄之前的所有內容,復原已儲存在追蹤緩衝區中的部分追蹤資料。
隨著追蹤記錄的進度,追蹤記錄管理工具會匯總參與追蹤記錄收集的所有追蹤記錄提供者記錄,並將這些記錄與一些特殊中繼資料記錄串連在一起,形成追蹤記錄封存檔案。
追蹤完成後,trace
指令列程式等工具可以讀取追蹤封存檔中的追蹤記錄,以便將結果以圖形化方式呈現,或儲存到檔案供日後使用。您也可以使用 Perfetto UI 以視覺化方式呈現追蹤記錄檔案。
功能
- 小型足跡
- 追蹤記錄是精簡的記錄,將資訊壓縮至少量位元。
- 字串、程序和執行緒的集區可進一步壓縮追蹤資料。
- 對齊記憶體
- 追蹤記錄會在記憶體中維持 8 個位元組對齊,方便直接寫入記憶體對應的 VMOs。
- 可變大小記錄
- 整體記錄大小上限為 32 KB。
- 大型物件可能需要分割成多個記錄。
- 可擴充性
- 您可以視需要定義新的記錄類型。
- 系統可以略過未偵測到或格式不正確的追蹤記錄。
編碼原始碼
Fuchsia 追蹤記錄格式具有下列編碼基元:
Atoms
每筆記錄都會以原子序列的形式建構。
每個原子都會以 8 位元組對齊方式寫入,且大小也必須是 8 位元組的倍數,以便維持對齊。
原子分為兩種:
- Word:可進一步細分為位元欄位的 64 位元值。字詞會以機器字詞順序儲存 (在所有目前支援的架構上為 little-endian)。
- 串流:以零填補的位元組序列,直到下一個 8 位元組邊界。串流會以位元組順序儲存。長度為 8 個位元組整數倍的串流不會填充 (沒有零終端符號)。
欄位是 64 位元字的細分項目,以 [<least significant bit> .. <most significant bit>]
表示,其中第一個和最後一個位元位置是包含的。所有未使用的位元都會保留供日後使用,且必須設為 0。
除非記錄格式另有指定,否則字和欄位會儲存無符號整數。
Streams 可儲存 UTF-8 字串或二進位資料,這取決於記錄格式。
記錄
追蹤記錄是二進位編碼的追蹤資訊,包含一連串的原子。
所有記錄都包含標頭字詞,其中包含下列基本資訊:
- 記錄類型:4 位元欄位,用於識別記錄類型和內含的資訊。請參閱「記錄類型」。
- 記錄大小:通常為 12 位元欄位,用於指出記錄中字詞的數量 (8 位元單位的倍數),包括記錄標頭本身。記錄的大小上限為 4095 個字 (32760 個位元組)。非常簡單的記錄可能只有 1 個字 (8 個位元組) 長。大型記錄會使用 32 位元大小欄位,因此最大大小較大。
記錄的長度一律為 8 位元組的倍數,且會以 8 位元組對齊方式儲存。
封存
追蹤記錄檔案是一系列連結在一起的追蹤記錄,用於儲存追蹤供應器在追蹤執行期間收集的資訊,以及用於識別及區隔各個追蹤供應器產生的追蹤記錄的中繼資料記錄。
追蹤記錄檔案應依序讀取,因為在追蹤記錄中較早出現的記錄,可能會影響對較晚出現記錄的解讀。影響封存檔案中後續記錄的記錄範例包括字串參照和執行緒參照。
具有相關聯時間戳記的事件記錄,不保證會按照時間戳記順序排列。某些記錄類型 (例如流程事件) 需要依時間戳記順序處理事件,因此處理追蹤記錄資料的程式應在處理前依時間戳記排序事件。
追蹤系統提供工具,可從追蹤封存檔中擷取資訊,並轉換為其他形式以供視覺化。
時間戳記
時間戳記以 64 位元時脈表示,這些時脈是從硬體計數器衍生而來。追蹤初始化記錄會說明實體時間的每秒計時數。
根據預設,我們假設 1 個時脈等於 1 奈秒。
字串參照
字串會編碼為 String Refs,這是以下格式的 16 位元值:
- 空字串:值為零。
- 索引字串:最高位元為零。較低的 15 位元表示字串表格中的索引,該索引先前是使用字串記錄指派的。
- 內嵌字串:最高位元為 1。較低的 15 位元表示字串長度 (以位元組為單位)。字串內容會根據記錄格式指定的內容,在記錄的另一個部分內嵌。
為讓追蹤記錄更精簡,請使用字串記錄將經常參照的字串 (例如事件類別和名稱常數) 註冊至字串資料表,然後透過索引參照。
字串表格最多可容納 32767 個字串。如果達到這個限制,您可以透過取代現有項目或內嵌編碼字串,對其他字串進行編碼。
字串內容本身會儲存為 UTF-8 串流,且不含結尾。
字串的理論長度上限為 32767 位元組,但在實際情況下,由於包含字串的記錄需要更多空間,因此字串長度會進一步縮短,因此我們將字串長度上限設為 32000 位元組。
執行緒參照
執行緒和處理程序核心物件 ID (koids) 會編碼為 thread refs,這是以下格式的 8 位元值:
- 內嵌執行緒:值為零。根據記錄格式指定,執行緒和程序 koid 會在記錄的另一個部分內嵌顯示。
- 已編入索引的執行緒:值不為零。這個值代表「執行緒表」中的索引,先前已使用「執行緒記錄」指派這個索引。
為讓追蹤記錄更精簡,應使用執行緒記錄將常見的執行緒登錄至執行緒表,然後以索引參照。
字串表格最多可包含 255 個執行緒。如果達到這個限制,您可以透過取代現有項目或內嵌編碼執行緒,對其他執行緒進行編碼。
使用者空間物件資訊
追蹤記錄可以包含關於使用者空間物件 (可使用指標類型值參照的任何物件,例如 C++ 或 Dart 物件) 的註解,格式為使用者空間物件記錄。追蹤記錄提供者通常會在建立物件時產生這類記錄。
之後,任何參照相同指標的指標引數都會與參照的註解建立關聯。
這樣一來,您就能輕鬆將人類可讀的標籤和其他資訊,與稍後在追蹤記錄中顯示的物件建立關聯。
核心物件資訊
追蹤記錄可包含有關核心物件 (可使用 Zircon koid 參照的任何項目,例如程序、管道或事件) 的註解,形式為核心物件記錄。追蹤記錄提供者通常會在建立物件時產生這類記錄。
之後,任何參照相同 koid 的 kernel 物件 ID 引數都會與參照的註解建立關聯。
這樣一來,您就能輕鬆將人類可讀的標籤和其他資訊,與稍後在追蹤記錄中顯示的物件建立關聯。
具體來說,這是追蹤系統將名稱與程序和執行緒 koid 建立關聯的方式。
引數
引數是類型化的鍵/值組合。
許多記錄類型最多可在記錄中附加 15 個引數,以便提供開發人員的其他資訊。
引數會像一般記錄一樣加上大小前置字元,以便略過無法辨識的引數類型。
詳情請參閱「引數類型」。
擴充格式
您可以透過下列方式擴充追蹤記錄格式:
- 定義新的記錄類型。
- 在現有記錄類型的保留欄位中儲存新資訊。
- 將新資訊附加至現有記錄類型 (您可以檢查記錄的大小和酬載,偵測這類資訊是否存在)。
- 定義新的引數類型。
記錄類型
記錄類型如下:
- 記錄標頭
- 大型記錄標頭
- 中繼資料記錄 (記錄類型 = 0)
- 初始化記錄 (記錄類型 = 1)
- 字串記錄 (記錄類型 = 2)
- 執行緒記錄 (記錄類型 = 3)
- 事件記錄 (記錄類型 = 4)
- Blob 記錄 (記錄類型 = 5)
- Userspace 物件記錄 (記錄類型 = 6)
- 核心物件記錄 (記錄類型 = 7)
- 排程記錄 (記錄類型 = 8)
- 記錄記錄 (記錄類型 = 9)
- 大型 BLOB 記錄 (記錄類型 = 15,大型類型 = 0)
記錄標頭
所有記錄都會包含這個標頭,用來指定記錄的類型和大小,以及 48 位元資料,其用途會因記錄類型而異。
格式
標頭字詞
[0 .. 3]
:記錄類型[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 63]
:視記錄類型而定 (如果未使用,則必須為零)
大型記錄標頭
支援超過 32 KB 的記錄。大型記錄會使用 32 位元大小欄位,而非一般 12 位元大小欄位。
標頭字詞
[0 .. 3]
:記錄類型 (15)[4 .. 35]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[36 .. 39]
:大型記錄類型[40 .. 63]
:視大型記錄類型而定 (如果未使用,則必須為零)
中繼資料記錄 (記錄類型 = 0)
提供後續追蹤資料的中繼資料。
這個記錄類型是預留給追蹤管理工具在產生追蹤封存檔時使用。追蹤記錄供應器不得自行發出追蹤記錄。如果追蹤管理員在追蹤提供者產生的追蹤記錄中遇到中繼資料記錄,就會將其視為垃圾,並略過該記錄。
有多個中繼資料記錄子類型,每個子類型都包含不同的資訊。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:中繼資料類型[20 .. 63]
:視中繼資料類型而定 (如果未使用,則必須為零)
供應者資訊中繼資料 (中繼資料類型 = 1)
這項中繼資料會指出為追蹤記錄提供資訊的追蹤記錄提供者。
後續所有資料 (直到遇到下一個供應商區段中繼資料或供應商資訊中繼資料為止) 都必須是從相同供應商收集而來。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:中繼資料類型 (1)[20 .. 51]
:供應者 ID (用於在追蹤記錄中識別供應者的權杖)[52 .. 59]
:名稱長度 (以位元組為單位)[60 .. 63]
:保留 (必須為零)
供應商名稱串流
- UTF-8 字串,以零填補至 8 位元組對齊
供應者部分中繼資料 (中繼資料類型 = 2)
這項中繼資料會將從不同供應者取得的追蹤記錄區段分隔開來。
系統會假設後續所有資料 (直到遇到下一個供應商區段中繼資料或供應商資訊中繼資料為止) 均來自同一個供應商。
當讀取的追蹤記錄由不同追蹤記錄供應器的追蹤記錄累積而成時,讀取器必須為每個供應器的追蹤記錄 (例如初始化資料、字串資料表、執行緒資料表、使用者空間物件資料表和核心物件資料表) 分別維護狀態,並在遇到新的供應器區段中繼資料記錄時切換內容。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:中繼資料類型 (2)[20 .. 51]
:供應者 ID (用於在追蹤記錄中識別供應者的權杖)[52 .. 63]
:保留 (必須為零)
供應器事件中繼資料 (中繼資料類型 = 3)
這個中繼資料會提供供應器想要回報的事件執行通知。
這項記錄可能會出現在輸出內容的任何位置,且不會分隔前後內容。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:中繼資料類型 (3)[20 .. 51]
:供應者 ID (用於在追蹤記錄中識別供應者的權杖)[52 .. 55]
:事件 ID[56 .. 63]
:保留 (必須為零)
活動
定義下列事件。
0
:緩衝區已滿,記錄可能已遭到捨棄
追蹤資訊中繼資料 (中繼資料類型 = 4)
這個中繼資料會提供追蹤記錄的整體資訊。這個記錄不會與特定供應商建立關聯。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:中繼資料類型 (4)[20 .. 23]
:追蹤資訊類型[24 .. 63]
:依追蹤資訊類型而異 (如果未使用,則必須為零)
魔術數字記錄 (追蹤資訊類型 = 0)
這個記錄可做為指標,指出二進位資料採用 Fuchsia 追蹤格式。通常會顯示在追蹤記錄的開頭。不含任何其他資訊。魔術數字 0x16547846
是字串「FxT」,後面接著隨機選擇的位元組。
為了讓追蹤記錄的前八個位元組能一起視為魔術數字,而不需要關心內部記錄結構,因此此記錄類型「無法」擴充。記錄中不得包含標頭字詞以外的任何字詞,且沒有保留欄位。整個記錄的值為 0x0016547846040010,為八個位元組的數字。
請注意,該值的位元組順序和追蹤記錄中的所有其他字詞,都取決於寫入追蹤記錄的系統的字節順序。對於小端序系統,前八個位元組為 10 00 04 46 78 54 16 00。在 big-endian 系統中,會是相反的順序:00 16 54 78 46 04 00 10。
格式
標頭字詞
[0 .. 3]
:記錄類型 (0)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數 (1)[16 .. 19]
:中繼資料類型 (4)[20 .. 23]
:追蹤資訊類型 (0)[24 .. 55]
:魔幻數字 0x16547846[56 .. 63]
:零
初始化記錄 (記錄類型 = 1)
提供解讀後續記錄所需的參數。如果沒有這項記錄,讀取器可能會假設 1 個時間間隔為 1 奈秒。
格式
標頭字詞
[0 .. 3]
:記錄類型 (1)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 63]
:保留 (必須為零)
勾選倍增字詞
[0 .. 63]
:每秒刻度數
字串記錄 (記錄類型 = 2)
在字串表格中註冊字串,並指派 0x0001
到 0x7fff
範圍內的字串索引。在解讀後續記錄時,註冊作業會取代指定字串索引的任何先前註冊。
嘗試為字串索引 0x0000
設定值的字串記錄必須遭到忽略,因為這個值是用來代表空字串。
字串記錄必須包含空字串,但這毫無意義,因為空字串可在字串參照中簡單編碼為零。
格式
標頭字詞
[0 .. 3]
:記錄類型 (2)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 30]
:字串索引 (範圍 0x0001 到 0x7fff)[31]
:一律為零 (0)[32 .. 46]
:字串長度 (以位元組為單位,範圍為 0x0000 到 0x7fff)[47]
:一律為零 (0)[48 .. 63]
:保留 (必須為零)
字串值串流
- UTF-8 字串,以零填補至 8 位元組對齊
執行緒記錄 (記錄類型 = 3)
在執行緒表中註冊程序 ID 和執行緒 ID 組合,並指派 0x01
到 0xff
範圍內的執行緒索引。在解讀後續記錄時,註冊作業會取代指定執行緒索引的任何先前註冊作業。
執行緒索引 0x00
是保留用於在執行緒參照中使用內嵌執行緒 ID。嘗試為此值設定值的執行緒記錄必須遭到忽略。
格式
標頭字詞
[0 .. 3]
:記錄類型 (3)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 23]
:執行緒索引 (絕不會是 0x00)[24 .. 63]
:保留 (必須為零)
process id 字詞
[0 .. 63]
:處理程序 koid (核心物件 ID)
thread id word
[0 .. 63]
:執行緒 koid (核心物件 ID)
事件記錄 (記錄類型 = 4)
說明帶有時間戳記的事件。
這個記錄包含事件的部分基本資訊,包括事件發生的時間和地點,以及事件引數和事件子類型專屬資料。
格式
標頭字詞
[0 .. 3]
:記錄類型 (4)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:事件類型[20 .. 23]
:引數數量[24 .. 31]
:執行緒 (執行緒參照)[32 .. 47]
:類別 (字串參照)[48 .. 63]
:名稱 (字串參照)
時間戳記字詞
[0 .. 63]
:刻度數
程序 ID 字詞 (除非執行緒參照符號表示內嵌執行緒,否則省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
執行緒 ID 字詞 (除非執行緒參照表示內嵌執行緒,否則會省略)
[0 .. 63]
:執行緒 koid (核心物件 ID)
類別串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數資料 (針對每個引數重複)
- (詳情請見下方)
事件類型專屬資料
- 可以是下列任一值:
即時事件 (事件類型 = 0)
標示這個執行緒的某個時刻。這些與 Zircon 核心探針相同。
格式
不需要事件類型的特定資料。
計數器事件 (事件類型 = 1)
將每個引數的樣本值記錄為與計數器名稱和 ID 相關聯的時間序列資料。這些值可以堆疊面積圖的圖形呈現。
格式
計數字
[0 .. 63]
:計數器 ID
時間長度開始事件 (事件類型 = 2)
標示特定執行緒上作業的開始。必須與時間長度結束事件相符。可巢狀。
格式
不需要事件類型的特定資料。
時間長度結束事件 (事件類型 = 3)
標示特定執行緒上作業的結束。
格式
不需要事件類型的特定資料。
時間長度完成事件 (事件類型 = 4)
標示特定執行緒上作業的開始和結束時間。
格式
end time word
[0 .. 63]
:結束時間的刻度數
非同步開始事件 (事件類型 = 5)
標示可能跨執行緒的作業開始。必須由使用相同非同步關聯 ID 的非同步結束事件比對。
格式
async 關聯字詞
[0 .. 63]
:非同步關聯 ID
非同步即時事件 (事件類型 = 6)
標示作業中可能跨執行緒的某個時刻。必須使用相同的非同步關聯 ID,在非同步開始事件和非同步結束事件之間顯示。
格式
async 關聯字詞
[0 .. 63]
:非同步關聯 ID
非同步結束事件 (事件類型 = 7)
標示可能跨執行緒的作業結束。
格式
async 關聯字詞
[0 .. 63]
:非同步關聯 ID
流程開始事件 (事件類型 = 8)
標示作業的開始,這會產生一連串可能跨越多個執行緒或抽象層的動作。必須與使用相同流程關聯 ID 的流程結束事件相符。這可以視為時長事件之間的箭頭。
流程的開頭會與此執行緒的包函時間長度事件相關聯;它會在包函的時間長度事件結束時開始。
格式
流程關聯字詞
[0 .. 63]
:流程關聯 ID
流程步驟事件 (事件類型 = 9)
標示流程中的點。
步驟會與此執行緒的包函時間長度事件相關聯;流程會在包函時間長度事件開始時繼續,然後在包函時間長度事件結束時暫停。
格式
流程關聯字詞
[0 .. 63]
:流程關聯 ID
流程結束事件 (事件類型 = 10)
標示流程結束。
流程結束與此執行緒的包函時間長度事件相關聯;流程會在包函的時間長度事件開始時繼續執行。
格式
流程關聯字詞
[0 .. 63]
:流程關聯 ID
BLOB 記錄 (記錄類型 = 5)
提供要納入追蹤記錄的未解譯大量資料。這對於將擷取的追蹤記錄資料嵌入其他格式很有幫助。
Blob 名稱會在追蹤記錄中,以唯一方式識別個別 Blob 資料串流。透過寫入多個同名 Blob 記錄,您可以將其他資料區塊附加至先前建立的 Blob。
BLOB 類型代表 BLOB 內容的表示法。
格式
標頭字詞
[0 .. 3]
:記錄類型 (5)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:blob 名稱 (字串參照)[32 .. 46]
:Blob 酬載大小 (以位元組為單位,不含邊框間距)[47 .. 47]
:保留 (必須為零)[48 .. 55]
:Blob 類型[56 .. 63]
:保留 (必須為零)
blob 名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
酬載串流 (大小不固定)
- 二進位資料,以零填補至 8 位元組對齊
Blob 類型
定義下列 Blob 類型:
TRACE_BLOB_TYPE_DATA
=0x01
:原始未指定類型的資料。取用端應瞭解如何取用,或許是根據情境。TRACE_BLOB_TYPE_LAST_BRANCH
=0x02
:Intel Performance Monitor 的最後分支記錄。格式是由 CPU 效能監控器定義。TRACE_BLOB_TYPE_PERFETTO =
0x03`: Blob 包含從 Perfetto 語音元件記錄的資料。資料會以 Perfetto 的 Proto 格式編碼。
使用者空間物件記錄 (記錄類型 = 6)
說明使用者空間物件、指派標籤,並視需要將鍵/值資料與該物件做為引數。系統會將物件相關資訊新增至個別程序的使用者空間物件表格。
當追蹤消費者遇到事件,且該事件的指標引數值與程序物件表中的項目相符時,可以將引數的指標值與先前的使用者空間物件記錄交叉參照,找出參照項目的說明。
格式
標頭字詞
[0 .. 3]
:記錄類型 (6)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 23]
:程序 (執行緒參照)[24 .. 39]
:名稱 (字串參照)[40 .. 43]
:引數數量[44 .. 63]
:保留 (必須為零)
指標字
[0 .. 63]
:指標值
程序 ID 字詞 (除非執行緒參照符號表示內嵌執行緒,否則省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
名稱串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數資料 (針對每個引數重複)
- (詳情請見下方)
核心物件記錄 (記錄類型 = 7)
描述核心物件、指派標籤,並視需要將鍵/值資料與該物件做為引數。物件相關資訊會新增至全域核心物件表格。
當追蹤消費者遇到事件,且該事件的 koid 引數值與核心物件表中的項目相符時,可以將引數的 koid 值與先前的核心物件記錄交叉參照,以便找出參照項目的說明。
格式
標頭字詞
[0 .. 3]
:記錄類型 (7)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 23]
:核心物件類型 (zircon/syscalls/types.h 中的 ZX_OBJ_TYPE_XXX 常數之一)[24 .. 39]
:名稱 (字串參照)[40 .. 43]
:引數數量[44 .. 63]
:保留 (必須為零)
核心物件 ID 字詞
[0 .. 63]
:koid (核心物件 ID)
名稱串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數資料 (針對每個引數重複)
- (詳情請見下方)
引數慣例
根據慣例,在針對特定類型的物件寫入核心物件記錄時,追蹤記錄器應納入下列命名引數。這有助於追蹤消費者與核心物件之間的關聯關係。
"process"
:針對ZX_OBJ_TYPE_THREAD
物件,指定含有執行緒的程序的 koid
排程記錄 (記錄類型 = 8)
說明排程事件,例如執行緒喚醒或從一個執行緒切換至另一個執行緒的情況。
格式
+---------(4)--------------+--------(48)--------+--(8)--+-(4)-+
| scheduling record type | <type specific> | size | 8 |
+--------------------------+--------------------+-------+-----+
標頭字詞
[0 .. 3]
:記錄類型 (8)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 59]
:排程記錄類型的特定資料[60 .. 63]
:排程記錄類型
情境切換記錄 (排程事件記錄類型 = 1)
格式
+-(4)-+----(20)---+--------(4)-------+----(16)---+-------(4)-------+----(8)--+-(4)-+
| 1 | reserved | out thread state | cpu | argument count | size | 8 |
+-----+-----------+------------------+-----------+-----------------+---------+-----+
+---------------------------(64)------------------------------+
| timestamp |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| outgoing thread id |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| incoming thread id |
+-------------------------------------------------------------+
+--------------------------(...)------------------------------+
| argument data |
+-------------------------------------------------------------+
標頭字詞
[0 .. 3]
:記錄類型 (8)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:引數數量[20 .. 35]
:CPU 編號[36 .. 39]
:傳出執行緒狀態[40 .. 59]
:保留[60 .. 63]
:排程記錄類型 (1)
時間戳記字詞
[0 .. 63]
:刻度數量
outoing 執行緒 id
[0 .. 63]
:執行緒 koid (核心物件 ID)
傳入的執行緒 ID
[0 .. 63]
:執行緒 koid (核心物件 ID)
引數資料 (重複顯示每個引數)
- (如要瞭解引數格式,請參閱「引數」)
引數慣例
依照慣例,追蹤記錄寫入器在寫入此記錄時,也可以選擇加入下列命名的引數,為追蹤取用者提供額外資訊。
"incoming_weight"
:Int32
,說明傳入執行緒的相對權重"outgoing_weight"
:Int32
描述傳出執行緒的相對權重
執行緒喚醒記錄 (排程事件記錄類型 = 2)
格式
+-(4)-+----(24)---+----(16)---+-------(4)-------+----(8)--+-(4)-+
| 2 | reserved | cpu | argument count | size | 8 |
+-----+-----------+-----------+-----------------+---------+-----+
+---------------------------(64)------------------------------+
| timestamp |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| waking thread id |
+-------------------------------------------------------------+
+--------------------------(...)------------------------------+
| argument data |
+-------------------------------------------------------------+
標頭字詞
[0 .. 3]
:記錄類型 (8)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 19]
:引數數量。[20 .. 35]
:CPU 編號。[60 .. 63]
:排程記錄類型 (2)
時間戳記字詞
[0 .. 63]
:刻度數
喚醒執行緒 ID
[0 .. 63]
:執行緒 koid (核心物件 ID)
引數資料 (重複顯示每個引數)
- (如要瞭解引數格式,請參閱「引數」)
引數慣例
依照慣例,追蹤記錄寫入器在寫入此記錄時,也可以選擇加入下列命名的引數,為追蹤取用者提供額外資訊。
"weight"
:Int32
可說明喚醒執行緒的相對權重
舊版內容切換記錄 (內容切換記錄類型 = 0)
隨著 Fuchsia 的排程功能不斷演進,這項記錄已不再是有效的內容切換模式。但仍會保留,以維持回溯相容性。
這項記錄會指定在切換內容後,傳出執行緒的新狀態。根據定義,由於傳入的執行緒剛剛已暫停,因此其新狀態為「執行中」。
格式
[0 .. 3]
:記錄類型 (8)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 23]
:CPU 編號[24 .. 27]
:傳出執行緒狀態 (下列任何值,除了「running」)[28 .. 35]
:傳出執行緒 (執行緒參照)[36 .. 43]
:傳入的執行緒 (執行緒參照)[44 .. 51]
:傳出執行緒優先順序[52 .. 59]
:傳入的執行緒優先順序[60 .. 63]
:排程記錄類型 (0)
時間戳記字詞
[0 .. 63]
:刻度數量
傳出程序 ID 字詞 (除非傳出執行緒參照表示內嵌執行緒,否則會省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
outgoing 執行緒 id word (除非 outgoing 執行緒 ref 表示內嵌執行緒,否則會省略)
[0 .. 63]
:執行緒 koid (核心物件 ID)
傳入的程序 ID 字詞 (除非傳入的執行緒參照表示內嵌執行緒,否則會省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
incoming thread id word (除非 incoming thread ref 表示內嵌執行緒,否則會省略)
[0 .. 63]
:執行緒 koid (核心物件 ID)
執行緒狀態
定義下列執行緒狀態:
0
:new1
:執行中2
:已暫停使用3
:已封鎖4
:dying5
:已停用
這些值與 zircon/syscalls/object.h 中的 ZX_THREAD_STATE_XXX
常數相符。
記錄記錄 (記錄類型 = 9)
說明在特定時間寫入記錄的訊息。
格式
標頭字詞
[0 .. 3]
:記錄類型 (9)[4 .. 15]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[16 .. 30]
:記錄訊息長度 (以位元組為單位,範圍為 0x0000 到 0x7fff)[31]
:一律為零 (0)[32 .. 39]
:執行緒 (執行緒參照)[40 .. 63]
:保留 (必須為零)
時間戳記字詞
[0 .. 63]
:刻度數
程序 ID 字詞 (除非執行緒參照符號表示內嵌執行緒,否則省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
執行緒 ID 字詞 (除非執行緒參照表示內嵌執行緒,否則會省略)
[0 .. 63]
:執行緒 koid (核心物件 ID)
記錄訊息串流
- UTF-8 字串,以零填補至 8 位元組對齊
大型 BLOB 記錄 (記錄類型 = 15,大型類型 = 0)
提供大型二進位 BLOB 資料,以便嵌入追蹤記錄中。使用大型記錄標頭。
大型 BLOB 記錄支援多種不同的格式。這些格式可用於變更記錄中包含的 BLOB 資料和中繼資料類型。
格式
標頭字詞
[0 .. 3]
:記錄類型 (15)[4 .. 35]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[36 .. 39]
:大型記錄類型 (0)[40 .. 43]
:Blob 格式類型[44 .. 63]
:保留,必須為零
含有中繼資料的 In Band 大型 Blob 記錄 (blob 格式 = 0)
這個類型包含記錄本身中的 Blob 資料和中繼資料。除了類別和名稱之外,中繼資料還包含時間戳記、執行緒/程序資訊和引數。
名稱應足以識別 Blob 中所含資料的類型。
格式
標頭字詞
[0 .. 3]
:記錄類型 (15)[4 .. 35]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[36 .. 39]
:大型記錄類型 (0)[40 .. 43]
:Blob 格式類型 (0)[44 .. 63]
:保留,必須為零
格式標頭字詞
[0 .. 15]
:類別 (字串參照)[16 .. 31]
:名稱 (字串參照)[32 .. 35]
:引數數量[36 .. 43]
:執行緒 (執行緒參照)[44 .. 63]
:保留,必須為零
類別串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
時間戳記字詞
[0 .. 63]
:刻度數
程序 ID 字詞 (除非執行緒參照符號表示內嵌執行緒,否則省略)
[0 .. 63]
:處理程序 koid (核心物件 ID)
執行緒 ID 字詞 (除非執行緒參照表示內嵌執行緒,否則會省略)
[0 .. 63]
:執行緒 koid (核心物件 ID)
引數資料 (針對每個引數重複)
- (詳情請見下方)
blob 大小字詞
[0 .. 63]
:Blob 酬載大小 (以位元組為單位,不含邊框間距)
酬載串流 (大小不固定)
- 二進位資料,以零填補至 8 位元組對齊
在頻帶中記錄大型 Blob 且不含中繼資料 (Blob 格式 = 1)
這個類型包含記錄本身中的 Blob 資料,但不包含中繼資料。記錄只包含類別和名稱。
名稱應足以識別 Blob 中所含資料的類型。
格式
標頭字詞
[0 .. 3]
:記錄類型 (15)[4 .. 35]
:記錄大小 (包含此字詞) 為 8 位元組的倍數[36 .. 39]
:大型記錄類型 (0)[40 .. 43]
:Blob 格式類型 (1)[44 .. 63]
:保留,必須為零
格式標頭字詞
[0 .. 15]
:類別 (字串參照)[16 .. 31]
:名稱 (字串參照)[32 .. 63]
:保留,必須為零
類別串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
blob 大小字詞
[0 .. 63]
:Blob 酬載大小 (以位元組為單位,不含邊框間距)
酬載串流 (大小不固定)
- 二進位資料,以零填補至 8 位元組對齊
引數類型
引數會將指定類型的鍵和值資料記錄建立關聯。這些記錄會與事件記錄、使用者空間物件記錄和核心物件記錄一併使用。
每個引數都包含一個字詞標頭,後面接著變數數字字詞酬載。在許多情況下,標頭本身就足以編碼引數的內容。
引數類型如下:
- 引數標頭
- 空值引數
- 帶正負號的 32 位元整數引數
- 32 位元不帶正負號整數引數
- 64 位元帶正負號整數引數
- 64 位元不帶正負號整數引數
- 雙精度浮點引數
- 字串引數
- 指標引數
- 核心物件 ID 引數
- 布林引數
引數標頭
所有引數都包含這個標頭,可指定引數的類型、名稱和大小,以及 32 位元資料,其用途會因引數類型而異。
格式
引數標頭字詞
[0 .. 3]
:引數類型[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:會有所變動 (如果未使用,則必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
空值引數 (引數類型 = 0)
代表只在名稱中顯示的引數,沒有值。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (0)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
32 位元帶正負號整數引數 (引數類型 = 1)
代表 32 位元帶正負號整數。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (1)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:32 位元帶正負號整數
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
32 位元不帶正負號整數引數 (引數類型 = 2)
代表 32 位元無正負號整數。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (2)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:32 位元未簽署整數
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
64 位元帶正負號整數引數 (引數類型 = 3)
代表 64 位元帶正負號整數。如果值可容納在 32 位元中,請改用 32 位元帶號整數引數類型。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (3)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值字詞
[0 .. 63]
:64 位元帶正負號整數
64 位元不帶正負號整數引數 (引數類型 = 4)
代表 64 位元無正負號整數。如果值可容納在 32 位元中,請改用 32 位元無符號整數引數類型。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (4)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值字詞
[0 .. 63]
:64 位元不帶正負號整數
雙精度浮點引數 (引數類型 = 5)
代表雙精度浮點數。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (5)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值字詞
[0 .. 63]
:雙精度浮點數
字串引數 (引數類型 = 6)
代表字串值。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (6)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 47]
:引數值 (字串參照)[48 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照符號表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
指標引數 (引數類型 = 7)
代表指標值。您可以透過與相同指標相關聯的使用者空間物件記錄,提供參照項目的其他資訊。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (7)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值字詞
[0 .. 63]
:指標值
核心物件 ID 引數 (引數類型 = 8)
代表 koid (核心物件 ID)。您可以透過與相同 koid 相關聯的核心物件記錄,提供參照項目的其他資訊。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (8)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:保留 (必須為零)
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊
引數值字詞
[0 .. 63]
:koid (核心物件 ID)
布林引數 (引數類型 = 9)
代表布林值。
格式
引數標頭字詞
[0 .. 3]
:引數類型 (9)[4 .. 15]
:引數大小 (包含此字詞) 為 8 位元組的倍數[16 .. 31]
:引數名稱 (字串參照)[32 .. 63]
:以零填補 1 位元
引數名稱串流 (除非字串參照表示內嵌字串,否則會省略)
- UTF-8 字串,以零填補至 8 位元組對齊