【问题标题】:If I have a C function and I'm debugging it with gdb, how do I find the return value of a function?如果我有一个 C 函数并且我正在使用 gdb 调试它,我如何找到函数的返回值?
【发布时间】:2013-03-22 03:01:07
【问题描述】:

我有一个作业要求我通过寄存器检查找到 main 的返回值(我们正在学习 gdb),我该怎么做?

【问题讨论】:

  • 我不是说重复,因为您专门要求进行寄存器检查,但这几乎相同(并且一个答案实际上解释了寄存器检查方法):stackoverflow.com/questions/267674/…

标签: c debugging gdb stack cpu-registers


【解决方案1】:

一般来说,看看调用约定。

在 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 这到底是什么意思?
  • @DougSmith:如果您有符号和源代码,请在主函数末尾的 return 关键字上放置一个断点,然后单步执行,直到看到“ret”。在那个点查看RAX。
  • 在行中找到返回(比如b 18)?
猜你喜欢
  • 2017-08-09
  • 2020-06-20
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多