为了能够正确调试发布版本,需要一个PDB文件.当编译器使用不同类型的优化(FPO,PGO,内部函数,内联等)时,PDB文件是否会变得不太可用?如果是这样,优化效果是否严重或仅仅导致相邻的代码行混淆?
(我正在使用VC2005,并且总是选择可调试性而非优化性能 - 但问题是一般的)
是的,优化的代码可调试性较差.不仅缺少一些信息,一些信息也会产生误导.
我认为最大的问题是局部变量.编译器可以使用相同的堆栈地址或在整个函数中注册多个变量.正如其他海报所提到的,有时甚至会弄清楚"这个"指针是什么可能需要一些时间.调试优化代码时,您可能会看到当前行在单步执行时跳转,因为编译器重新组织了生成的代码.如果你使用PGO,这种跳跃可能会变得更糟.
如果您有PDB,FPO不应该过多地影响可调试性,因为PDB包含为FPO帧展开堆栈所需的所有信息.使用需要在没有符号的情况下获取堆栈跟踪的工具时,FPO可能会出现问题.对于许多项目而言,如今FPO的性能优势并不超过对可诊断性的影响; 因此,MS决定不使用FPO优化构建Windows Vista(http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx).
我更喜欢调试未优化的代码,但这并不总是可行的 - 一些问题只能用优化的代码重新编写,客户崩溃转储来自已发布的版本,并且有时无法部署调试私有代码.通常在调试优化代码时,我使用反汇编视图 - dissasembly永远不会说谎.
这一切都适用于windbg,因为我使用它进行所有本机代码调试.Visual Studio的调试器可能会更好地处理其中一些情况.