Hexagon GDB Debugger介绍(41)
4 命令扩展
4.1 概述
调试器支持以下用于扩展调试器命令集的功能:
■ 用户定义的命令是用户定义的调试器命令序列,由单个用户定义的命令名称调用。
■ 命令文件是包含一个或多个调试器命令的文本文件。 它们可以从调试器命令行执行。
■ Tcl 脚本允许使用Tcl 脚本语言控制调试器。 可以从调试器命令行执行 Tcl 命令。
■ Python 脚本使调试器能够使用Python 编程语言进行控制。 Python 代码可以从调试器命令行运行。
注意:
Tcl 和 Python 脚本不能在同一个调试会话中一起使用。
本章涵盖以下主题:
■ 用户定义的命令
■ 命令文件
■ Tcl 脚本
■ Python 脚本
4.2 用户自定义命令
用户定义的命令是由用户定义的命令名称调用的用户定义的调试器命令序列。
用户定义的命令是使用define 命令从调试器命令行定义的。 例如:
define bail
quit
end
此多行命令除了将名称保释定义为用户定义的调试器命令外不执行任何操作,该命令在执行时(在调试器命令行上)调用调试器命令 quit 。
用户定义的命令最多可以接受 10 个命令参数(在命令名称后指定并用空格分隔)。 使用符号 $arg0 … $arg9 在用户定义的命令中访问参数。 例如:
define adder
print $arg0 + $arg1 + $arg2
end
用户定义的命令以与常规调试器命令相同的方式执行。
例如:
adder 1 2 3
这将调用用户定义的命令 adder ,它打印其三个参数的总和。
注意:
参数被视为文本替换,因此它们可以引用变量、使用复杂的表达式,甚至执行低级函数调用。
符号 $argc 可用于确定已传递给用户定义命令的参数数量。 此符号扩展为 0 到 10 范围内的数字。例如:
define adder
if $argc == 2
print $arg0 + $arg1
end
if $argc == 3
print $arg0 + $arg1 + $arg2
end
end
define commandname
定义一个名为 commandname 的命令。 如果已存在具有该名称的命令,则会要求您确认是否要重新定义它。 commandname 可以是由字母、数字、破折号和下划线组成的裸命令名。 它也可以从任何预定义的前缀命令开始。 例如,‘define target my-target’创建一个用户定义的‘target my-target’命令。
命令的定义由一个或多个调试器命令行组成,这些命令行在定义命令之后指定。 这些命令的结尾由包含符号 end 的行标记。
document commandname
记录用户定义的命令 commandname,以便调试器命令 help 可以访问它。 命令名必须已经定义。 此命令读取文档行,就像define 读取命令定义的行一样,以 end 结尾。 文档命令完成后,命令‘help commandname’将显示您编写的文档。
您可以再次使用 document 命令来更改命令的文档。 使用定义重新定义命令不会更改文档。
dont-repeat
当用于定义用户定义的命令时,这会通知调试器在用户键入 键时不应重复定义的命令(第 2.5.2 节)。
help user-defined
列出所有用户定义的命令,每个命令都在文档的第一行(如果有)。
show user
show user commandname
显示用户定义命令 commandname 的命令定义(但不显示其文档)。 如果未指定 commandname,则显示所有用户定义命令的定义。
show max-user-call-depth
set max-user-call-depth value
max-user-call-depth 的值指定在调试器怀疑无限递归并中止命令之前,用户定义的命令中允许的递归级别数。
注意:
用户定义的命令可以使用调试器的控制流命令(第 4.3.2 节)。
执行用户自定义命令时,不打印定义的命令。 任何命令中的错误都会停止执行用户定义的命令。
在用户定义的命令中使用时,通常提示确认的调试器命令不会生成此类提示。 类似地,许多通常打印状态消息的调试器命令在用户定义的命令中使用时会抑制这些消息。
4.2.1 用户定义的命令钩子
调试器支持用户定义的钩子,这是一种特殊类型的用户定义命令。 每当您运行命令 foo 时,如果用户定义的命令 hook-foo 存在,则会在执行 foo 之前自动执行(不带参数)。
钩子也可以定义为在命令执行后运行。 每当你运行‘foo’命令时,如果用户定义的命令hookpost-foo存在,它会在foo执行后自动执行(不带参数)。
注意:
可以为同一命令定义执行前和执行后挂钩。
命令挂钩可以调用它挂钩的命令。 如果发生这种情况,钩子不会重新执行,从而避免无限递归。
定义一个名为 hook-stop 的钩子命令会导致与钩子关联的命令在程序中每次执行停止时自动执行:例如,在运行断点命令之前,打印显示或打印堆栈帧。
例如,要在 echo 命令的开头和结尾挂钩,并在消息的开头和结尾添加额外的文本,请定义以下命令:
define hook-echo
echo <<<---
end
define hookpost-echo
echo --->>>\n
end
(gdb) echo Hello World
<<<---Hello World--->>>
(gdb)
可以为任何单字调试器命令定义挂钩,但不能为命令别名定义。 例如,您可以为 backtrace 定义一个钩子,但不能为 bt 定义一个钩子。
通过将前缀 hook- 或 hookpost- 添加到命令的最后一个字,可以为多字命令定义挂钩。 例如,‘define target hook-remote’为命令‘target remote’定义了一个钩子。
如果在执行挂钩期间发生错误,则调试器命令的执行将停止并且调试器生成提示(在您实际键入的命令有机会运行之前)。
注意:
如果您尝试定义与任何已知命令都不匹配的挂钩,调试器会生成一条警告消息。