開發 zxdb 及偵錯

本文件涵蓋多個主題,以便協助您開發 zxdb 偵錯工具:

執行測試

若要執行 zxdb 前端測試:

fx test zxdb_tests

如何執行 debug_agent 測試:

fx test debug_agent_unit_tests
fx test debug_agent_integration_tests

如何執行端對端測試:

fx test --e2e zxdb_e2e_tests

建立新建構作業後重新載入 debug_agent.cm

由於 debug_agent_launcher 是一個長時間執行的程序,系統 未嘗試在第一個 ffx debug connect 之後更新 debug_agent 套件 呼叫。

如何強制系統卸載 debug_agent.cm

ffx component stop /core/debug_agent

在「debug_agent」中啟用偵錯記錄功能

如要啟用 debug_agent 的偵錯記錄功能,請新增 --select core/debug_agent#DEBUGfx log。例如:

fx log --select core/debug_agent#DEBUG --tag debug_agent --hide_metadata --pretty

在 zxdb 中啟用偵錯記錄功能

如何在 zxdb 中啟用偵錯記錄功能:

ffx debug connect -- --debug-mode

在其他偵錯工具中啟動 zxdb

您可以讓 ffx debug 在其他偵錯工具 (例如 lldb) 中啟動 zxdb。例如:

ffx debug connect --debugger lldb

這個指令可提供 lldb 殼層,您可以使用 run 啟動 zxdb。

您也可以指定其他偵錯工具,例如 gdb,而不指定 lldb。 不過,如果您使用 gdb,可能會遇到下列問題:

  • 舊版 gdb 可能不支援所有 DWARF 5 標準。這可能會 因此缺少來源檔案清單等資訊。
  • Ctrl-C 不會從 zxdb 歸還至 gdb。停止 zxdb 終端機執行:

    pkill -INT zxdb`
    

對另一個 debug_agent 中的 debug_agent 進行偵錯

您可以將 debug_agent 附加至其他 debug_agent

  1. 執行附加至「to-be-debugged」偵錯工具debug_agent 你 想要偵錯:

    ffx debug connect
    
  2. 從 zxdb 控制台執行:

    [zxdb] attach debug_agent
    

    您應該會看到類似下方的輸出內容:

    Waiting for process matching "debug_agent".
    Type "filter" to see the current filters.
    Attached Process 1 state=Running koid=345223 name=debug_agent.cm
    Attached Process 2 state=Running koid=345403 name=/pkg/bin/debug_agent
    
  3. 第一個 debug_agent 會擷取啟動器和本身。您可以將 避免任何死結

    舉例來說,如要卸離程序 1:

    [zxdb] pr 1 detach
    

    舉例來說,若要卸離程序 2:

    [zxdb] pr 2 detach
    
  4. $main 函式上建立中斷點:

    [zxdb] break $main
    
  5. 在另一個終端機中,啟動另一個 zxdb 執行個體:

    ffx debug connect
    
  6. 在 zxdb 的初始終端機中,您應該會看到類似下方的輸出內容:

    Attached Process 1 state=Running koid=12345 name=/pkg/bin/debug_agent
    Breakpoint 1 now matching 1 addrs for $main
    🛑 process 1 on bp 1 main(int, const char**) • main.cc:101
        99
      100 int main(int argc, const char* argv[]) {
    ▶ 101   debug_agent::CommandLineOptions options;
      102   cmdline::Status status = ParseCommandLine(argc, argv, &options);
      103   if (status.has_error()) {
    

    您現在有兩個執行中的 zxdb 執行個體。