Hexagon GDB Debugger介绍(21)
2.12.6 自动显示
如果你发现要频繁打印表达式的值(以查看它如何更改),你可能希望将其添加到自动显示列表中,以便调试器在每次程序停止时打印其值。 添加到列表中的每个表达式都有一个编号来标识它; 要从列表中删除表达式,请指定该数字。 自动显示如下:
2: foo = 38
3: *(bar+5) = (struct hack *) 0x3804
此显示显示项目编号、表达式及其当前值。 与显示一样,你可以使用 x 或打印手动请求,你可以指定你喜欢的输出格式; 实际上, display 决定使用 print 还是 x 取决于你的格式规范的详细程度。 如果指定单位大小或仅 x 支持的两种格式(i 和 s)之一,则使用 x; 否则它使用打印。
display expr
将表达式 expr 添加到每次程序停止时显示的表达式列表中。 见第 2.12.1 节。
如果你在使用后再次按下 ,则显示不会重复。
display/fmt expr
对于仅指定显示格式而不是大小或计数的 fmt,将表达式 expr 添加到自动显示列表但安排每次以指定的格式 fmt 显示它。 见第 2.12.4 节。
display/fmt addr
对于 fmt i 或 s,或者包括单元大小或单元数量,添加表达式 addr 作为每次程序停止时要检查的内存地址。 检查实际上是在执行 x /fmt addr。 见第 2.12.5 节。
例如, display/i
p
c
有
助
于
在
每
次
执
行
停
止
时
查
看
将
要
执
行
的
机
器
指
令
(
pc 有助于在每次执行停止时查看将要执行的机器指令(
pc有助于在每次执行停止时查看将要执行的机器指令(pc 是程序计数器的通用名称;请参阅第 2.12.10 节)。
undisplay dnums…
delete display dnums…
从要显示的表达式列表中删除项目编号 dnums。
如果在使用后按 ,则取消显示不会重复。 (否则你只会得到错误 No display number …
disable display dnums…
禁用项目编号 dnums 的显示。 禁用的显示项目不会自动打印,但不会被遗忘。 稍后可能会再次启用。
enable display dnums…
启用项目编号 dnums 的显示。 它在其表达式的自动显示中再次生效,直到你另行指定。
display
显示列表中表达式的当前值,就像程序停止时一样。
info display
显示先前设置为自动显示的表达式列表,每个表达式都有其项目编号,但不显示值。 这包括被标记为禁用的表达式。 它还包括现在不会显示的表达式,因为它们指的是当前不可用的自动变量。
如果一个显示表达式引用了局部变量,那么它在为其设置的词法上下文之外没有意义。 当执行进入其变量之一未定义的上下文时,将禁用此类表达式。 例如,如果你在带有参数 last_char 的函数内使用命令 display last_char,调试器会在你的程序继续在该函数内停止时显示该参数。 当它在没有变量 last_char 的其他地方停止时,将自动禁用显示。 下次你的程序在 last_char 有意义的地方停止时,你可以再次启用显示表达式。
2.12.7 打印设置
调试器提供以下方法来控制数组、结构和符号的打印方式。
这些设置对于调试任何语言的程序都很有用:
set print address
set print address on
打印显示堆栈跟踪、结构值、指针值、断点等位置的内存地址,即使它也显示这些地址的内容。 默认为开启。 例如,这是设置打印地址时堆栈帧显示的样子:
(hexagon-gdb) f
#0 set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
at input.c:530
530 if (lquote != def_lquote)
set print address off
显示地址时不要打印地址。 例如,这是在 set print address off 时显示的相同堆栈帧:
(hexagon-gdb) set print addr off
(hexagon-gdb) f
#0 set_quotes (lq="<<", rq=">>") at input.c:530
530 if (lquote != def_lquote)
你可以使用 set print address off 从调试器界面中消除所有与机器相关的显示。 例如,关闭打印地址,你应该在所有机器上获得相同的回溯文本,无论它们是否涉及指针参数。
show print address
显示是否要打印地址。
当调试器打印一个符号地址时,它通常打印最接近的早期符号加上一个偏移量。 如果该符号不能唯一标识地址(即,它是一个范围为单个源文件的名称),你可能需要澄清。 一种方法是使用info line,例如信息行 *info line 0x4537。 或者,你可以设置调试器在打印符号地址时打印源文件和行号:
set print symbol-filename on
以地址的符号形式打印符号的源文件名和行号。
set print symbol-filename off
不要打印符号的源文件名和行号。 这是默认设置。
show print symbol-filename
显示调试器是否会以地址的符号形式打印符号的源文件名和行号。
另一种有助于显示符号文件名和行号的情况是在反汇编代码时; 调试器会显示与每条指令对应的行号和源文件。
此外,你可能希望仅在打印的地址与最接近的早期符号相当接近时才查看符号形式:
set print max-symbolic-offset max-offset
如果最近的较早符号与地址之间的偏移量小于 max-offset,则仅显示地址的符号形式。 默认值为 0,它告诉调试器总是打印地址的符号形式,如果任何符号在它之前。
show print max-symbolic-offset
询问调试器在符号地址中打印的最大偏移量有多大。
如果你有一个指针并且不确定它指向哪里,请尝试将打印符号文件名设置为 on。 然后,你可以使用 p/a 指针确定其指向的变量的名称和源文件位置。 这以符号形式解释地址。 例如,这里调试器显示一个变量 ptt 指向另一个变量 t,在 hi2.c 中定义:
(hexagon-gdb) set print symbol-filename on
(hexagon-gdb) p/a ptt
$4 = 0xe008 <t in hi2.c>
注意
对于指向局部变量的指针,即使打开了适当的设置打印选项,p/a 也不显示所指对象的符号名称和文件名。
其他设置控制如何打印不同类型的对象:
set print array
set print array on
漂亮的打印阵列。 这种格式更便于阅读,但会占用更多空间。 默认为关闭。
set print array off
返回到数组的压缩格式。
show print array
显示是选择压缩格式还是漂亮格式来显示数组。
set print elements number-of-elements
设置调试器输出数组元素的数量限制。如果打印一个大数组,调试器在打印完set print elements命令设置的元素数量后停止打印。这个限制也适用于字符串的显示。当调试器启动时,此限制被设置为200。将元素数量设置为零意味着打印是无限的。
show print elements
显示调试器将打印的大型数组的元素数。 如果数字为 0,则打印不受限制。
set print null-stop
当遇到第一个 NULL 时停止打印数组的字符。 当大数组实际上只包含短字符串时,这很有用。 默认为关闭。