如何关闭 Clang++ 中的_all_优化?

How do I turn off _all_ optimizations in Clang++?

我正在尝试调试一些 C++11 代码,但 LLDB 没有帮助。代码大致如下所示:

void f(my_type dt) {
   try {
      g(h(dt));
   }
   catch ( /* reasonable exception type here */ ) {
   }
}

当我在 g(h(dt)) 行下断点时,LLDB 坚持认为 dt 的值不可用。它肯定不能被删除,因为它在 h 的实现中用作某些数据库查询的输入。

我使用 CMake,它使用以下标志进行编译:

CXX_FLAGS = -g -O0 -fPIC -std=c++11 -stdlib=libc++ -Wall

我确认(使用 make VERBOSE=true)这些标志确实用于构建项目。据我所知,应该包含完整的调试信息并关闭所有优化。这显然不是这种情况。 我可以添加哪些其他标志来强制 Clang 在整个调用堆栈中保持所有参数和变量可用?

不幸的是,使用小文件和函数的小测试用例不会重现此问题:大多数时候,变量会按我的预期保留。

我正在研究 Mac 运行 Yosemite。

$ clang++ --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

这很可能是编译器中的错误。在 -O0 处,它应该始终使变量在其定义块期间保持活动状态。它实际上可能是,但有人忘记了它在编译器管道中的某个位置。

如果您可以举出一些示例来说明这个问题,并且您不介意与 llvm 人员分享,那么请使用 llvm bugzilla (http://llvm.org/bugs/) or with the Apple llvm team at http://bugreport.apple.com.

提交错误