Hexagon GDB Debugger介绍(23)

240 篇文章 11 订阅

Hexagon GDB Debugger介绍(23)

2.12.9 便利变量

调试器提供了方便的变量,你可以在调试器中使用这些变量来存储值并在以后引用它。 这些变量完全存在于调试器中:它们不是程序的一部分,设置一个方便的变量对程序的进一步执行没有直接影响。 这就是你可以自由使用它们的原因。

注意
    便利变量在调试器中实现为 Tcl 变量(第 4.4.1 节),而不是标准的 GDB 便利变量。

便利变量名称可以是除预定义变量名称之外的任何名称。 请参阅第 2.9.1.1 节和第 2.12.10 节。 (相比之下,值历史引用由以 $ 开头的数字组成。参见第 2.12.8 节。)
你可以使用赋值表达式将值保存在便利变量中,就像在程序中设置变量一样。 例如:

set foo *object_ptr

… 将分配 foo 包含在 object_ptr 指向的对象中的值。

第一次使用便利变量创建它,但它的值是不确定的,直到你给它赋值。 你可以随时使用其他分配更改该值。
引用前面带有 $ 字符的便利变量会返回该变量的值。 例如:

step $foo

便利变量没有固定类型。 你可以为便利变量分配任何类型的值,包括结构和数组,即使该变量已经具有不同类型的值。 当用作表达式时,便利变量具有其当前值的类型。

使用便利变量的方法之一是作为要递增的计数器或要前进的指针。 例如,从结构数组的连续元素打印字段:

set i 0
print *(bar+$i++)->contents

通过键入 重复该命令。
一些便利变量由调试器自动创建,并给出可能有用的值。

$_
变量 $_ 由 x 命令自动设置为最后检查的地址(参见第 2.12.5 节)。 其他为 x 检查提供默认地址的命令也将 $_ 设置为该地址; 这些命令包括信息行和信息断点。 $_ 的类型是 void * 除非由 x 命令设置,在这种情况下,它是指向 $__ 类型的指针。

$__
变量 $__ 由 x 命令自动设置为在检查的最后一个地址中找到的值。 选择其类型以匹配打印数据的格式。

$_exitcode
当被调试的程序终止时,变量 $_exitcode 会自动设置为退出代码。

2.12.10 寄存器

你可以在表达式中将机器寄存器内容称为名称以 $ 开头的变量。 例如:$R29
info registers
info all-registers

显示所选堆栈帧中处理器寄存器的名称和值。

info registers regname …
显示每个指定寄存器 regname 的相对值。 如下文详细讨论的,寄存器值通常与选定的堆栈帧相关。 regname 可以是你正在使用的机器上有效的任何寄存器名称,带或不带初始 $。

info globalregs [regname]
显示指定全局寄存器的名称和值。 如果省略 regname,则列出所有全局寄存器。

set globalregs regname = value
将指定的全局寄存器设置为指定的值。

调试器具有三个“标准”寄存器名称,它们在大多数机器上都可用(在表达式中),只要它们与架构的寄存器规范助记符不冲突。 寄存器名称 $pc 和 $sp 用于程序计数器寄存器和堆栈指针。 $fp 用于包含指向当前堆栈帧的指针的寄存器。

例如,你可以使用以下十六进制打印程序计数器:

p/x $pc
...或打印下一个要执行的指令:
x /i $pc
...或将四个添加到堆栈指针中:
set $sp += 4

这是一种从堆栈中删除一个word的方法。 假设选择了最里面的堆栈帧; 选择其他堆栈帧时,不允许设置 $sp。 无论机器架构如何,要将整个帧从堆栈中弹出,请使用 return。

除了标准处理器特定的寄存器名称之外,还可以使用这些寄存器名称。 info registers 命令显示处理器特定的名称。

注意
    调试器不支持标准的 GDB 寄存器名称 $ps。

以这种方式检查寄存器时,调试器始终将普通寄存器的内容视为整数。 有些机器有特殊的寄存器,只能保存浮点数; 这些寄存器被认为具有浮点值。
无法将普通寄存器的内容引用为浮点值(尽管你可以使用 print/f $regname 将其打印为浮点值)。

一些寄存器具有不同的“raw”和“virtual”数据格式。 这意味着操作系统保存寄存器内容的数据格式与你的程序通常看到的数据格式不同。 例如,68881 浮点协处理器的寄存器总是以“extended”(raw)格式保存,但所有 C 程序都希望以“double”(virtual)格式工作。 在这种情况下,调试器通常仅使用虚拟格式(对你的程序有意义的格式),但 info registers 命令以两种格式打印数据。

通常,寄存器值与选定的堆栈帧相关(参见第 2.10.3 节)。 这意味着如果所有更远的堆栈帧都退出并恢复它们保存的寄存器,你将获得寄存器将包含的值。 为了看到硬件寄存器的真实内容,你必须选择最里面的帧(frame 0)。

但是,调试器必须从编译器生成的机器代码中推断出保存寄存器的位置。 如果某些寄存器没有保存,或者如果调试器无法定位保存的寄存器,则选择的堆栈帧没有任何区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值