本教程介绍了 fx test 中代理调试模式的概念和工作流程,以及在与自动化脚本或 IDE 调试器集成时如何管理符号加载和断点解析。
概览
代理调试模式专为无头自动化、IDE 集成(如 VS Code)和脚本而设计。它以后台服务器的形式运行 zxdb,在 /tmp/fx-debug-daemon.sock 的 Unix 网域套接字上公开调试适配器协议 (DAP) 端点。
如需在此模式下启动测试套件,请执行以下操作:
fx test <TEST_SUITE_NAME> --agent-debugging-mode默认行为:弱依附
如果您在不使用任何断点实参的情况下运行 fx test --agent-debugging-mode,测试框架会使用 attach --weak 命令将 zxdb“弱”附加到目标进程。
什么是弱依恋?
弱附加通过防止 zxdb 主动查询模块并为进程加载符号索引来优化启动性能。
- 延迟符号加载:
zxdb在初始附加时不会加载符号。 - 分辨率限制:由于缺少符号索引,在测试开始后通过 DAP UDS 接口动态注册的任何
file:line或符号断点都将保持“待处理”状态,无法进行验证或解析。 - 崩溃时的自动解析:异常或外部事件(例如 Rust panic 或 C++ 断言失败)会触发符号加载。停止后,系统会自动加载符号并解析待处理的断点。
解决方案:主动安装断点
如果您需要调试通过路径,或者想要确保断点在执行开始之前处于有效状态并已通过验证,则必须在 fx test 命令行中指定这些断点:
fx test <TEST_SUITE_NAME> --agent-debugging-mode --breakpoint <SOURCE_FILE>:<LINE>运作方式
- 如果存在
--breakpoint选项,则表示fxtest框架应正常附加zxdb(省略--weak标志)。 - 由于附加是正常的,因此
zxdb会立即为目标进程加载符号。 zxdb在初始化握手期间预先安装并解析指定的断点。- 当测试执行到断点时,调试器会暂停进程,并向 DAP 客户端发送包含
"reason": "breakpoint"的"stopped"事件。
使用 fx debug CLI 进行交互式调试
当执行在断点或异常处停止后,您可以使用 fx debug cli 封装容器工具从第二个终端与调试器进行交互。
如需连接并检索当前调试器状态,请执行以下操作:
fx debug cli --json '{"command": "get-state"}'该工具会返回一个 JSON 响应,其中列出了活跃的进程和线程:
{
"success": true,
"body": {
"threads": [
{ "id": 1, "name": "initial-thread" }
],
"processes": { "12345": "my_test_binary" }
}
}
如需检索特定线程的堆栈轨迹,请传递 thread_id:
fx debug cli --json '{"command": "stackTrace", "thread_id": 1}'该工具会返回堆栈帧详细信息:
{
"success": true,
"body": {
"stackFrames": [
{
"id": 0,
"name": "my_test_function",
"source": {
"name": "main_test.cc",
"path": "/src/main_test.cc"
},
"line": 42,
"column": 1
}
],
"totalFrames": 1
}
}
诊断检查完成后,恢复线程的执行:
fx debug cli --json '{"command": "continue", "thread_id": 1}'使用 fx debug cli help 可获取您可以运行的所有命令的列表。