Zxdb 提供指令碼支援,可自動執行重複的偵錯工作、跳至特定應用程式狀態,以及自動驗證偵錯工具行為。腳本是純文字檔案,內含一系列 zxdb 指令和預期輸出內容。
執行指令碼
啟動 zxdb 時,如要從指令列執行指令碼,請使用 -S 或 --script-file 選項。
- 使用
ffx debug:
ffx debug connect -- --script-file=my_script.script- 或直接使用
zxdb(請注意,這只適用於離線核心檔案 (例如小型傾印),因此您的指令碼應先使用opendump指令載入核心檔案。詳情請參閱help opendump。):
zxdb --script-file=my_script.script指令碼語法
系統會逐行評估指令碼,通常會交替輸入指令和比對輸出內容的行。
指令
開頭為 [zxdb] 的行會解譯為要執行的指令。這些指令的執行方式與在互動式 zxdb 控制台中相同。
[zxdb] attach my_component.cm
你可以使用縮寫和任何標準 zxdb 功能:
[zxdb] t * f
這等同於:
[zxdb] thread * frame
輸出比對
如果某行不是以 [zxdb] 開頭,也不是註解,系統會將其視為要與先前執行指令的輸出內容比對的模式。
由於 zxdb 中的許多指令都是非同步,因此偵錯工具必須知道指令何時實際完成輸出,才能發出下一個指令。Zxdb 會等待輸出內容與指定行相符,再繼續執行下一個指令。這可確保指令碼與偵錯工具的非同步事件保持同步。
[zxdb] attach cobalt.cm
Attached Process
Done.
如果您不在意指令的輸出內容,就不需要指定任何相符的行。您可以編寫下一個 [zxdb] 指令,系統會允許先前的指令立即完成。
萬用字元
如果只想比對部分行,或某行包含無法預測的資料 (例如記憶體位址、程序 ID 或檔案路徑),可以使用 ?? 萬用字元。可比對行中任意區段 (最多可比對整行)。
[zxdb] frame
▶ 0 MyFunction() • my_file.cc:??
留言
以 # 開頭的行是註解,系統會忽略。註解可用於記錄指令碼,但請注意,註解也支援 UTF-8 字元。
# This is a comment explaining what the next command does.
[zxdb] pause
# Wait for the stop event
🛑
輸出內容順序錯誤
根據預設,指令碼會預期輸出行會以指定的確切順序抵達。如果指令產生的輸出內容順序不確定,您可以在預期輸出內容的區塊中加入 ## allow-out-of-order-output。這樣可確保所有指定行都相符,無論列印順序為何。這項指令必須緊接在 zxdb 指令列之後,且位於任何預期輸出內容之前,才能正確納入所有輸出內容,供比對演算法使用。
[zxdb] thread
## allow-out-of-order-output
1 State: Running
2 State: Suspended
結束指令碼
指令碼完成後,系統會自動將您帶入互動式 [zxdb] 指令列。
如果您希望 zxdb 在指令碼結束時自動退出,可以在檔案結尾附加 quit 指令。不過,請確保先前的指令有指定的相符輸出內容,否則 quit 可能會在先前的指令完成前執行。
[zxdb] quit --force
範例
擷取非同步回溯
這個指令碼會附加至元件、暫停元件、列印非同步回溯追蹤,並讓您在互動式控制台中進一步調查。
# Attach to the component
[zxdb] attach hwinfo.cm
Attached Process
Done.
# Pause execution
[zxdb] pause
🛑
# Output the tree of async tasks.
[zxdb] async-backtrace
列印所有執行緒的影格
這個指令碼會附加至元件、等待元件停止運作、列印所有執行緒的回溯追蹤,然後進入互動式控制台。
[zxdb] attach cobalt.cm
Attached Process
Done.
[zxdb] pause
🛑
# Output the backtraces of all threads of the current process.
[zxdb] thread * frame