是否有以下的Visual C ++版本(在GCC中)?
__builtin_return_address
__builtin_frame_address
参考 - http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
如果没有,有没有办法模仿它们?
感谢。
答案 0 :(得分:5)
以下是可用Visual Studio 2008 Compiler Intrinsics的完整列表。你在这里特别寻找的一个是_ReturnAddress ......还在寻找另一个。
为了遍历堆栈(并获取帧指针),请阅读Visual Leak Detector stack walking mechanism上的详细信息,该内部使用StackWalk64。
答案 1 :(得分:1)
对于声明为__cdecl
的函数,帧地址是函数堆栈的顶部(由esp
指向,并由sizeof
函数的参数调整)。我相信GCC通常会在ebp
中存储当前函数的指针(不确定VS)。该内存位置是一个指针,并保存返回地址。
对于声明为__fastcall
的函数,对esp
的调整要小得多,因为某些函数的参数可能已在寄存器中传递。
我不确定__stdcall
,但我认为与__cdecl
相同。
答案 2 :(得分:1)
__builtin_frame_address的相应函数(如果存在)可能在优化代码中不起作用,因为VC执行称为帧指针省略的优化。但是,您可以关闭此优化,如下所述: http://msdn.microsoft.com/en-us/library/2kxx5t2c(VS.71).aspx
请注意,对于x86,您可以编写内联汇编代码 http://msdn.microsoft.com/en-us/library/4ks26t93(VS.71).aspx 遗憾的是,它不适用于64位体系结构,因此可能对您没有帮助。
答案 3 :(得分:0)
您可以使用_AddressOfReturnAddress来确定帧地址。