我有一个生成的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约定,因此可以完全控制注册表的使用。 因此,我们必须禁用帧指针优化。
答案 0 :(得分:0)
经过一番调查,我发现控制优化的编译器选项与我想象的不太正交。特别是,如果您启用了/O2
优化,则似乎已经并且不能禁用帧指针省略优化,即:
/O2 /Oy-
不会禁用FPO。为此,我选择了另一种方法,以一种更简单的方式重新创建调用堆栈。