GDB - 获取寄存器的变量名称

gdb - get variable name of register

本文关键字:变量名 寄存器 获取 GDB      更新时间:2023-10-16

在GDB中,info registersinfo all-registers将显示所有寄存器符号名称及其值。

问题:

如何获取存储在该寄存器中的变量名称(即来自源代码(? (或源代码中的行号,或任何内容(

例如:

int my_reg = /* something */;
float another_reg = /* something else */;
...

然后,也许info all-registers会回来:

R0             0x0      0
R1             0xfffbf0 16776176
R2             0x0      0
R3             0x0      0
R4             0x6      6

如何确定哪个寄存器 (R0? R2? R4?是否与my_reg"关联"?

如果您可以访问调试符号(并了解如何读取它们 - 也就是说,您有一些解析调试符号的代码(,则可以准确跟踪哪个寄存器对应于哪个寄存器。然而,这很可能从一行到下一行发生变化,因为编译器出于某种原因决定移动东西(例如,一些计算从 R1 开始,最终在 R2 中得到结果,因为这比试图保留 R1 中的值要好[或者我们也需要在 R1 中保留原始值 - array[x++]想 - 现在我们有 x 的新值, 希望在寄存器中,以及我们需要用于索引的旧x的值也需要在寄存器中以添加到array的基址中。

并非所有变量最终都会出现在寄存器中(取决于处理器和"哪些寄存器可用"(。

调试器知道每个变量在任何给定时间的位置 - 但有时它可能是一个很大的混乱,例如:

int array[10000];
... 
for(int i = 0; i < 10000; i++)
{
   array[i] = rand();
}

在优化过程中可能会转换为这样的东西:

int array[10000]; 
int *ptr = array;
int *ptr2 = &array[10000];
while(ptr < ptr2)
{
   *ptr++ = rand();
}

现在尝试打印i... ;)

在任何给定时间点,可能有一个寄存器、多个寄存器,甚至没有与任何给定 C 变量关联的寄存器。 您必须检查拆卸以查看发生了什么。

为什么不直接print my_reg看看价值呢?

l *$pc将列出当前正在执行的指令周围的源代码。