【发布时间】:2016-11-24 08:36:09
【问题描述】:
我参与了一个完全没有 PDB 的调试情况(不幸的是,这种情况仍然会发生)。在特定情况下,我正在研究堆栈损坏,并尝试进行手动堆栈遍历。但是,ESP 和 EBP 寄存器之间存在严重的不匹配,因此我认为代码是在打开/Oy 优化(帧指针省略)的情况下编译的。在这种情况下,我不得不放弃。
我现在的问题是:从 Visual Studio 2015 C++ 编译器切换到优化,哪些会使调试变得困难?一个简短的解释为什么变得困难会很棒。
为了限制问题的范围,答案应仅考虑 x86(32 位)。
可用的选项可以是found on MSDN,因为有:
-
O1- 创建小代码 -
Os- 喜欢小代码 -
O2- 创建快速代码 -
Ot- 支持快速代码 -
Ob- 控制内联扩展 -
Oi- 生成内在函数
以下几个不需要考虑:
-
Od- 禁用优化。这显然会造成最少的麻烦 -
Og- 已弃用 -
Ox- 只是其他人的组合。这显然会导致各个开关的故障总和 -
Oy- 省略帧指针。我已经知道了。这使得堆栈行走非常困难。主要是靠猜测。
【问题讨论】:
-
内联和帧指针遗漏是您应该担心的。文档说明了您的第一个列表如何映射到详细选项。
-
作为 cmets 下面的 Sombrero Kid,只需使用
-Zo标志。它会生成一个更大的 PDB 文件,但使零售调试几乎与调试未优化的调试版本一样好。 -
除了 /Od 之外的任何东西都很难。您仍然会在叶函数中省略帧指针。换句话说,任何不进行任何调用的函数。从 ESP 中找到堆栈帧,根据您在函数序言中找到的值进行调整。
-
FPO 是使调试极其困难的一种。内联也使旧版本的windbg难以调试,现代版本显示内联。
标签: c++ visual-c++ visual-studio-2015 compiler-optimization