使用脚本自动执行 zxdb

Zxdb 提供脚本支持,可让您自动执行重复的调试任务、跳转到特定的应用状态,并以自动方式验证调试器行为。脚本是纯文本文件,其中包含一系列 zxdb 命令及其预期输出。

运行脚本

如需在启动 zxdb 时从命令行运行脚本,请使用 -S--script-file 选项。

  • 使用 ffx debug
ffx debug connect -- --script-file=my_script.script
  • 或者直接使用 zxdb(请注意,这仅适用于离线核心文件,例如 minidump,因此您的脚本应先使用 opendump 命令加载核心文件。如需了解详情,请参阅 help opendump):
zxdb --script-file=my_script.script

脚本语法

脚本会逐行进行评估,并且通常会在输入命令和匹配输出行之间交替进行。

命令

[zxdb] 开头的行会被解读为要运行的命令。这些命令的执行方式与在交互式 zxdb 控制台中相同。

[zxdb] attach my_component.cm

您可以使用缩写和任何标准 zxdb 功能:

[zxdb] t * f

这相当于:

[zxdb] thread * frame

输出匹配

如果某行不以 [zxdb] 开头且不是注释,则会被视为与之前执行的命令的输出相匹配的模式。

由于 zxdb 中的许多命令都是异步的,因此调试器需要知道命令何时实际完成输出,然后才能发出下一个命令。Zxdb 将等待输出与指定的行匹配,然后再继续执行下一个命令。这样可确保脚本与调试器的异步事件保持同步。

[zxdb] attach cobalt.cm
Attached Process
Done.

如果您不关心命令的输出,则无需指定任何匹配行。您可以写入下一个 [zxdb] 命令,系统会允许上一个命令立即完成。

通配符

如果您只想匹配行的部分内容,或者某行包含不可预测的数据(例如内存地址、进程 ID 或文件路径),可以使用 ?? 通配符。它匹配行的任意部分(最多可匹配整行)。

[zxdb] frame
 0 MyFunction()  my_file.cc:??

评论

# 开头的行是注释,会被忽略。注释有助于记录脚本,但请注意,注释也支持 UTF-8 字符。

# This is a comment explaining what the next command does.
[zxdb] pause
# Wait for the stop event
🛑

无序输出

默认情况下,脚本会期望输出行按指定的确切顺序到达。如果命令生成的输出无法保证顺序,您可以在预期输出块中的任意位置添加 ## allow-out-of-order-output。这样可确保所有指定的行都匹配,无论它们的打印顺序如何。此指令必须紧跟在 zxdb 命令行之后,并且位于任何要匹配的预期输出之前,以便匹配算法正确考虑所有输出。

[zxdb] thread
## allow-out-of-order-output
  1 State: Running
  2 State: Suspended

退出脚本

脚本完成后,您将自动进入交互式 [zxdb] 命令行。

如果您希望 zxdb 在脚本结束时自动退出,可以在文件末尾附加 quit 命令。不过,请确保上一个命令具有指定的匹配输出,否则 quit 可能会在上一个命令完成之前执行。

[zxdb] quit --force

示例

捕获异步回溯

此脚本会附加到某个组件,暂停该组件,打印异步回溯,并让您在交互式控制台中进一步调查。

# Attach to the component
[zxdb] attach hwinfo.cm
Attached Process
Done.

# Pause execution
[zxdb] pause
🛑

# Output the tree of async tasks.
[zxdb] async-backtrace

此脚本会附加到某个组件,等待该组件停止,打印所有线程的回溯,然后进入交互式控制台。

[zxdb] attach cobalt.cm
Attached Process
Done.

[zxdb] pause
🛑

# Output the backtraces of all threads of the current process.
[zxdb] thread * frame