7

在 GDB 中, info registers or info 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

4

2 回答 2

2

如果您可以访问调试符号(并了解如何读取它们——也就是说,您有一些解析调试符号的代码),则可以准确地跟踪哪个寄存器对应于哪个寄存器。但是,这很可能会从一行更改为下一行,因为编译器出于某种原因决定移动事物(例如,某些计算从 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... ;)

于 2013-06-20T00:29:54.583 回答
1

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

为什么不只是print my_reg看价值?

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

于 2013-06-20T00:05:17.923 回答