Hexagon GDB Debugger介绍(22)
2.12.7 打印设置(续)
set print pretty on
以每行一个成员的缩进格式打印结构,如下所示:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
set print pretty off
以紧凑的格式打印结构,如下所示:
$1 = {next = 0x0, flags = {sweet = 1, sour = 1}, \
meat = 0x54 "Pork"}
这是默认格式。
show print pretty
显示调试器用于打印结构的格式。
set print sevenbit-strings on
仅使用七位字符打印; 如果设置了此选项,调试器将使用符号 \nnn 显示任何八位字符(在字符串或字符值中)。 如果你使用英语 (ASCII) 工作并且你使用字符的高位作为标记或“元”位,则此设置是最好的。
set print sevenbit-strings off
打印完整的八位字符。 这允许使用更多国际字符集,并且是默认设置。
show print sevenbit-strings
显示调试器是否只打印七位字符。
set print union on
打印包含在结构中的联合。 这是默认设置。
set print union off
不要打印包含在结构中的联合。
show print union
显示结构中包含的印刷工会的当前状态。 例如,考虑以下声明:
typedef enum {Tree, Bug} Species;
typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
typedef enum {Caterpillar, Cocoon, Butterfly}
Bug_forms;
struct thing {
Species it;
union {
Tree_forms tree;
Bug_forms bug;
} form;
};
struct thing foo = {Tree, {Acorn}};
With set print union on in effect, p foo would print:
$1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
But with set print union off in effect, it would print:
$1 = {it = Tree, form = {...}}
调试 C++ 程序时,以下设置很重要:
set print demangle
set print demangle on
以源代码形式打印 C 名称,而不是以传递给汇编器和链接器以进行类型安全链接的编码(“mangled”)形式。 默认为开启。
show print demangle
显示 C 名称是以损坏的还是损坏的形式打印的。
set print asm-demangle
set print asm-demangle on
即使在汇编代码打印输出(例如指令反汇编)中,也要以其源代码形式而不是经过修改的形式打印 C 名称。 默认为关闭。
show print asm-demangle
显示程序集列表中的 C 名称是以重整还是重整的形式打印的。
set demangle-style styl
在不同编译器用来表示 C++ 名称的多种编码方案中进行选择。 样式的选择目前是:
- auto 允许调试器通过检查你的程序来选择解码风格。
- gnu 基于 GNU C++ 编译器 (g++) 编码算法解码。 这是默认设置。
- hp 基于 HP ANSI C++ (aCC) 编码算法进行解码。
- lucid 基于 Lucid C++ 编译器 (lcc) 编码算法进行解码。
- arm 使用 C++ 注释参考手册中的算法进行解码。
注意
仅此设置不足以允许调试 cfront 生成的可执行文件。 为此,调试器需要进一步增强。
如果省略样式,你将看到可能的格式列表。
show demangle-style
显示当前用于解码 C++ 符号的编码样式。
set print object
set print object on
显示指向对象的指针时,使用虚函数表标识对象的实际(派生)类型而不是声明的类型。
set print object off
只显示声明类型的对象,不参考虚函数表。 这是默认设置。
show print object
显示是否显示实际的或声明的对象类型。
set print static-members
set print static-members on
显示 C++ 对象时打印静态成员。 默认为开启。
set print static-members off
显示 C++ 对象时不要打印静态成员。
show print static-members
显示是否打印 C++ 静态成员。
set print vtbl
set print vtbl on
漂亮的打印 C++ 虚拟函数表。 默认为关闭。
set print vtbl off
不要漂亮地打印 C++ 虚拟函数表。
show print vtbl
显示 C++ 虚拟函数表是否打印得很漂亮。
2.12.8 值历史记录
打印命令打印的值保存在调试器的值历史记录中。 这允许你在其他表达式中引用它们。 值被保留直到符号表被重新读取或丢弃(例如使用文件或符号文件命令)。 当符号表更改时,值历史将被丢弃,因为值可能包含指向符号表中定义的类型的指针。
打印的值被赋予历史编号,你可以通过这些编号来参考它们。 这些是从值 1 开始的连续整数。 print 通过在值之前打印 $num = 来显示分配给值的历史编号; 这里 num 是历史编号。
要引用任何以前的值,请使用 $ 后跟该值的历史编号。 其输出的打印标签方式旨在提醒你这一点。 只是 $ 指的是历史中最近的值,而 $$ 指的是之前的值。 $$n 指的是从末尾开始的第 n 个值; $$2 是 $$ 之前的值,$$1 相当于 $ , , ,$0 相当于 $。
例如,假设你刚刚打印了一个指向结构的指针并想查看该结构的内容。 只需键入:
p *$
如果你有一个结构链,其中下一个组件指向下一个组件,你可以使用以下命令打印下一个组件的内容:
p *$.next
你可以通过重复此命令来打印链中的连续链接; 你只需键入 即可完成。
请注意,历史记录记录的是值,而不是表达式。 如果 x 的值为 4 并且你键入以下命令:
print x
set x=5
… 那么即使 x 的值已更改,打印命令在值历史记录中记录的值仍为 4。
show values
显示值历史中的最后十个值及其项目编号(即,p $$9 重复十次,但显示值不会更改历史记录)。
show values n
显示以历史项目编号 n 为中心的十个历史值。
show values +
在最后打印的值之后显示十个历史值。 如果没有更多可用值,则显示值 + 不产生任何显示。
按 重复显示值 n 与显示值 + 的效果完全相同。