本文档包含各种主题,可以帮助您开发和调试 zxdb 调试程序:
- 运行测试
- 在新构建后重新加载
debug_agent.cm
- 在
debug_agent
中启用调试日志记录 - 在 zxdb 中启用调试日志记录
- 在其他调试程序中启动 zxdb
- 在其他
debug_agent
中调试debug_agent
运行测试
如需运行 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
:
运行连接到“要调试”的调试程序
debug_agent
你 想要调试:ffx debug connect
在 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
第一个
debug_agent
会捕获启动器及其本身。您可以将 避免任何死锁例如,如需分离进程 1,请运行以下命令:
[zxdb] pr 1 detach
例如,如需分离进程 2,请运行以下命令:
[zxdb] pr 2 detach
在
$main
函数上创建一个断点:[zxdb] break $main
从另一个终端启动另一个 zxdb 实例:
ffx debug connect
在 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 实例。