gpt4 book ai didi

c++ - gdb - 获取寄存器的变量名

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:47 24 4
gpt4 key购买 nike

在 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++ - gdb - 获取寄存器的变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17203321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com