教程:使用代理调试模式调试测试

本教程介绍了 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>

运作方式

  1. 如果存在 --breakpoint 选项,则表示 fxtest 框架应正常附加 zxdb(省略 --weak 标志)。
  2. 由于附加是正常的,因此 zxdb 会立即为目标进程加载符号。
  3. zxdb 在初始化握手期间预先安装并解析指定的断点。
  4. 当测试执行到断点时,调试器会暂停进程,并向 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 可获取您可以运行的所有命令的列表。

另请参阅