如果我有一个C函数和I';我用gdb调试它,我如何找到函数的返回值?

如果我有一个C函数和I';我用gdb调试它,我如何找到函数的返回值?,c,debugging,gdb,stack,cpu-registers,C,Debugging,Gdb,Stack,Cpu Registers,我有一个任务,要求我通过寄存器检查(我们正在学习gdb)来找到main的返回值,我该如何做呢?一般来说,请查看调用约定 在x86中,所有调用约定在EAX上返回小整数结果,在EDX:EAX上返回大(64位)结果(EDX保留较高的位),浮点结果返回FP0 在x64中,RAX返回小整数结果,FP0返回浮点结果 在ARM(包括thumb模式)中,整数结果以R0返回 如果您试图找出断点的位置,我的建议是在主函数的开头放置一个断点。如果这样做,返回地址(即main在执行完成后将返回到的位置)将是堆栈顶部的值

我有一个任务,要求我通过寄存器检查(我们正在学习gdb)来找到main的返回值,我该如何做呢?

一般来说,请查看调用约定

在x86中,所有调用约定在EAX上返回小整数结果,在EDX:EAX上返回大(64位)结果(EDX保留较高的位),浮点结果返回FP0

在x64中,RAX返回小整数结果,FP0返回浮点结果

在ARM(包括thumb模式)中,整数结果以R0返回

如果您试图找出断点的位置,我的建议是在主函数的开头放置一个断点。如果这样做,返回地址(即main在执行完成后将返回到的位置)将是堆栈顶部的值。如果将断点放在那里,则在主函数完成执行后会中断


由于main的返回类型为int,因此可以查看EAX(或RAX或R0)以查看main返回的值。

很好的解释。然而,我倾向于简单地尝试引导人们在任务中提出问题时走正确的方向,而不是为他们解决问题{它只是在代码实际执行的下一行中断。当你说它将返回到哪里,这是否意味着函数返回的值将返回到哪里?当我运行
信息寄存器时,我得到了这个结果:
rax 0x10000EC0 4294971072
这到底是什么意思?@DougSmith:如果你有YMBOL和源代码,在主函数末尾的return关键字上放置一个断点,然后逐步执行,直到看到“ret”。在这一点上查看RAX。正如在(比如说
B18
)上找到的return行一样?我不是说duplicate,因为您特别要求检查寄存器,但这几乎是一样的(一个答案实际上解释了登记册检查方法):