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__ 格式

无法理解 C 源代码,它不能在 GCC 中编译,但在 Visual C++ 中

Visual C++ 和 gcc 一样强大吗?

在 gcc 和 Visual C++ 中使用“>>”

将源代码从 Visual C++ 移植到 GCC 都有哪些陷阱[关闭]