使用格式字符串打印返回地址
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 地址的偏移量,您可以打印出调用函数的地址,该地址在调用函数时存储在堆栈中。您需要的实际偏移量值取决于您使用的计算机架构和调用约定。
【讨论】:
以上是关于使用格式字符串打印返回地址的主要内容,如果未能解决你的问题,请参考以下文章