如何关闭 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.
提交错误
我正在尝试调试一些 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.
提交错误