【发布时间】:2016-02-14 13:22:08
【问题描述】:
我正在编写一个在递归链末尾调用的函数。这个函数需要在它被调用的实例中找出它在内存中的位置。代码如下:
void recover ()
{
int * x = (int *)&x;
}
问题是程序只是跳过了这个语句,就好像它从来没有写过一样。我已经在 GDP 中验证了这一点。你能想到为什么这条线被忽略了吗?
谢谢!
【问题讨论】:
-
你希望这个语句做什么?如所写,该函数什么都不做,这就是您所看到的。任何半体面的编译器都会优化整个函数。
-
printf("Function at address: 0x%x\n", recover); -
嗯,我需要这个内存地址,这样我就可以在 GDP 中访问它,并有效地使用它来回溯以前的函数调用。我的最终目标是找到传递给函数 foo 的原始参数,其中调用了 recover()
-
您可以切换到汇编视图并检查寄存器,虽然我不熟悉 GDP 功能。
-
你说的这个GDP是多少?你确定你实际上不是指 gdb 吗?在这种情况下,您只需查看 esp(或 x86_64 上的 rsp)即可查看您在堆栈中的位置 - 更简单地说,
bt将向您显示调用者所有参数的值。此外,将变量标记为volatile可以保护它免受优化器的影响。但更一般地说,你想用所有这些东西来实现什么?请记住,涉足堆栈都是 UB。