帧指针优化始终与vs 2010(及更高版本)一起使用吗?

时间:2018-07-30 15:34:57

标签: c++ visual-studio optimization

我有一个生成的c源代码,看起来像这样:

>>=

然后我将代码与/ Oy-的帧指针优化一起编译。所有标志均为:

void LCERCA_OGGETTO_AUTO(); void LCERCA_OGGETTO_AUTO() { MyApi(); }

所以我着眼于找到“标准”功能的标语:

/c /Os /Oi /Gs /O2 /MT /Gy /Gd /Oy-

但是什么也没有!

我需要这个序言来在运行时重建堆栈,以检查调用push ebp mov ebp, esp 的代码是否在LCERCA_OGGETTO_AUTO或其他函数中。

我想念一些编译器标志吗?

我编辑了问题以澄清上下文。 我们使用了专有语言,并将源代码翻译为c。 为了在源代码级别创建调试器,我们对源代码的每一行进行一次调用来检测生成的c代码:

MyApi

代码被调试引擎所在的BCTracePrintXX函数调用“填充”。  BCTracePrintXX函数使用__fastcall约定来最大程度地减少对性能的影响。  为了提供“逐步/介入”,我们需要在BCTracePrintXX函数内部知道调用者是否在先前调用的同一堆栈帧中。这个想法是在BCTracePrintXX内部收集ebp值。我们可以这样做是因为我们使用__fastcall约定,因此可以完全控制注册表的使用。 因此,我们必须禁用帧指针优化。

1 个答案:

答案 0 :(得分:0)

经过一番调查,我发现控制优化的编译器选项与我想象的不太正交。特别是,如果您启用了/O2优化,则似乎已经并且不能禁用帧指针省略优化,即: /O2 /Oy-不会禁用FPO。为此,我选择了另一种方法,以一种更简单的方式重新创建调用堆栈。