使用格式字符串打印返回地址

Posted

技术标签:

【中文标题】使用格式字符串打印返回地址【英文标题】: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:是的,还有编译器的优化设置。 【参考方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

以上是关于使用格式字符串打印返回地址的主要内容,如果未能解决你的问题,请参考以下文章

如何 gdb 如何打印一个地址中的内容

PHP常用的自定义函数

CString 格式返回奇怪的字符

格式化 Go 字符串而不打印?

PHP常用的自定义函数

如何获取 BMP 格式图像的 Base64 字符串