gcv*_*gcv 5 debugging optimization lldb c++11 clang++
我正在尝试调试一些 C++11 代码,而 LLDB 没有帮助。代码大致如下:
void f(my_type dt) {
try {
g(h(dt));
}
catch ( /* reasonable exception type here */ ) {
}
}
Run Code Online (Sandbox Code Playgroud)
当我在该行上放置断点时g(h(dt)),LLDB 坚持认为 的值dt不可用。它肯定不能被忽略,因为它用于实现h某些数据库查询的输入。
我使用 CMake,它使用以下标志进行编译:
CXX_FLAGS = -g -O0 -fPIC -std=c++11 -stdlib=libc++ -Wall
Run Code Online (Sandbox Code Playgroud)
我确认(使用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
Run Code Online (Sandbox Code Playgroud)
这很可能是编译器中的错误。在 -O0 处,它应该始终使变量在定义块期间保持活动状态。它实际上可能是,但是有人忘记了它在编译器管道中的某个位置。
如果您可以举出一些显示此问题的示例,并且您不介意与 llvm 人员分享,那么请通过 llvm bugzilla ( http://llvm.org/bugs/ ) 或 Apple llvm提交错误团队位于http://bugreport.apple.com。