GCC 函数的 Visual C++ 版本
Posted
技术标签:
【中文标题】GCC 函数的 Visual C++ 版本【英文标题】:Visual C++ versions of GCC functions 【发布时间】:2009-08-18 02:12:20 【问题描述】:是否有以下的 Visual C++ 版本(在 GCC 中)?
__builtin_return_address
__builtin_frame_address
参考 - http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
如果没有,有没有办法模仿它们?
谢谢。
【问题讨论】:
【参考方案1】:这里是可用Visual Studio 2008 Compiler Intrinsics 的完整列表。您在这里特别寻找的其中一个是_ReturnAddress...仍在寻找另一个。
要遍历堆栈(并获取帧指针),请阅读Visual Leak Detector stack walking mechanism 上的详细信息,它在内部使用StackWalk64。
【讨论】:
【参考方案2】:对于声明为__cdecl
的函数,帧地址是函数堆栈的顶部(由esp
指向,并由函数的参数sizeof
调整)。我相信 GCC 通常将当前函数的指针存储在 ebp
中(不确定 VS)。该内存位置是一个指针,并保存返回地址。
对于声明为__fastcall
的函数,对esp
的调整要小得多,因为函数的某些参数可能已在寄存器中传递。
我不确定__stdcall
,但我认为它与__cdecl
相同。
【讨论】:
扣除。运行时解决方案是回溯并模拟弹出堆栈以定位旧堆栈位置。【参考方案3】:__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 位架构,因此可能对您没有帮助。
【讨论】:
【参考方案4】:您可以使用_AddressOfReturnAddress 来确定框架地址。
【讨论】:
以上是关于GCC 函数的 Visual C++ 版本的主要内容,如果未能解决你的问题,请参考以下文章
是否有免费的开源工具供 MS Visual C++ Express 使用 gcc 构建?
等效于 Visual C++ 中 gcc 的 __attribute__ 格式