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

时间:2015-02-11 19:41:29

标签: debugging c++11 optimization lldb 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在整个调用堆栈中保留所有参数和变量?

不幸的是,使用小文件和函数的小测试用例不会重现这个问题:大多数情况下,变量会按照我的预期保留。

我在运行Yosemite的Mac上工作。

$ 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

1 个答案:

答案 0 :(得分:1)

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

如果您可以提供一些显示此问题的示例,您不介意与llvm人分享,那么请使用llvm bugzilla(http://llvm.org/bugs/)或Apple llvm提交错误团队http://bugreport.apple.com