【发布时间】:2013-03-22 03:01:07
【问题描述】:
我有一个作业要求我通过寄存器检查找到 main 的返回值(我们正在学习 gdb),我该怎么做?
【问题讨论】:
-
我不是说重复,因为您专门要求进行寄存器检查,但这几乎相同(并且一个答案实际上解释了寄存器检查方法):stackoverflow.com/questions/267674/…
标签: c debugging gdb stack cpu-registers
我有一个作业要求我通过寄存器检查找到 main 的返回值(我们正在学习 gdb),我该怎么做?
【问题讨论】:
标签: c debugging gdb stack cpu-registers
一般来说,看看调用约定。
在 x86 中,所有调用约定在 EAX 上返回小整数结果,在 EDX:EAX(EDX 持有较高位)上返回大(64 位)结果,浮点结果在 FP0。
在 x64 中,RAX 上返回小整数结果,FP0 上返回浮点结果。
在 ARM(包括拇指模式)中,整数结果在 R0 中返回。
如果您想确定在哪里放置断点,我的建议是在 main 函数的开头放置一个断点。如果你这样做,返回地址(即 main 执行完成后将返回的位置)将是堆栈顶部的值。如果您在此处设置断点,您将在 main 函数完成执行后立即中断。
由于 main 的返回类型为 int,您可以查看 EAX(或 RAX 或 R0)以查看 main 返回的值.
【讨论】:
int main() { 行设置断点,它只会在实际执行代码的下一行中断。当你说它将返回到哪里时,这是否意味着函数返回的值将返回到哪里?当我运行info registers 时我得到了这个:rax 0x100000ec0 4294971072 这到底是什么意思?
b 18)?