GDB - 获取寄存器的变量名称
gdb - get variable name of register
在GDB中,info registers
或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
"关联"?
如果您可以访问调试符号(并了解如何读取它们 - 也就是说,您有一些解析调试符号的代码(,则可以准确跟踪哪个寄存器对应于哪个寄存器。然而,这很可能从一行到下一行发生变化,因为编译器出于某种原因决定移动东西(例如,一些计算从 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
将列出当前正在执行的指令周围的源代码。
相关文章:
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 什么是有效的寄存器变量类型
- 物理寄存器和英特尔SIMD变量之间的关系
- 指向寄存器变量的指针
- 如何使优化器正确地将变量放入寄存器中
- 将EAX寄存器存储在变量中
- 如何从汇编寄存器中获取字符串并将其存储在C++中的变量中
- 是阻塞xmm/ymm寄存器的静态/静态本地SSE/AVX变量
- 为LLVM中的变量使用特定的寄存器
- 访问SSE寄存器变量
- LibCinder:着色器参数的默认变量名
- C和C++中寄存器变量的地址
- GDB - 获取寄存器的变量名称
- 使用Visual Studio 2010时,在将调试器附加到程序时看不到托管变量名
- 通过引用传递寄存器变量
- c++局部变量和寄存器
- 在c++中,成员变量(属性)可以驻留在寄存器中吗?