【问题标题】:Printing the return address using format string使用格式字符串打印返回地址
【发布时间】:2011-06-29 14:02:53
【问题描述】:

我需要打印出存储在堆栈中的函数返回地址吗? 我应该遵循的打印格式是

void function() 
{
      int *RetPtr = 0;
      printf("Return address 0x%08x\n",
                 (unsigned int *)(&RetPtr+Return_addr_Offset));
      /*Code goes here*/

}

有人可以帮忙吗!我不应该使用内置功能。 我该怎么做?

【问题讨论】:

  • 这不是特定于架构、处理器类型和/或编译器吗?
  • 您是想弄清楚如何在没有 printf 的情况下打印,或者如何计算 Return_addr_Offset?
  • 我想弄清楚如何计算 Return_addr_Offset?我要求使用 printf 功能.......我在 Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP UTC 2010 i686 GNU/Linux 上运行它
  • 我在 Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP UTC 2010 i686 GNU/Linux 上运行它
  • @Merlyn:是的,还有编译器的优化设置。

标签: c function stack return


【解决方案1】:

如果你不能使用内置函数,这对我来说就像是作业。

无论如何,它是一个指针并没有什么神奇之处。你只需要打印一个十六进制数字。

如果不知道您可以使用哪些功能,则很难提供帮助。您基本上需要计算出八个十六进制数字然后输出它们。

【讨论】:

  • 有什么办法可以计算出八个十六进制数字吗?我在想如果我声明一个 char 数组并将其分配给 RetPtr 并基本上计算返回地址的偏移量(一些数学)。并尝试打印。它并没有真正起作用......
【解决方案2】:

您需要弄清楚Return_addr_Offset 应该是什么。 RetPtr 是在堆栈上分配的,因此通过计算相对于 RetPtr 地址的偏移量,您可以打印出调用函数的地址,该地址在调用函数时存储在堆栈中。您需要的实际偏移量值取决于您使用的计算机架构和调用约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2020-08-01
    • 2016-06-21
    相关资源
    最近更新 更多