开发和调试 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#DEBUG更改为fx 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 shell,并且您可以使用 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. 运行连接到“要调试”的调试程序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 实例。