我用这个命令行编译了一个cpp文件: g++ -g test.cpp
它在第28行引发异常.我想通过检查lldb中的变量来调查原因.我在第28行设置了一个断点并a.out
在lldb中运行.
(lldb) n Process 84233 stopped * thread #1: tid = 0xa44b86, 0x00000001000017fb a.out`say(s=) + 987 at so.cpp:28, queue = 'com.apple.main-thread', stop reason = step over frame #0: 0x00000001000017fb a.out`say(s= ) + 987 at so.cpp:28 25 } 26 else{ 27 s.insert(0, to_string(sz)); -> 28 s.erase(2, sz-1); 29 } 30 return s; 31 } (lldb) po s error: Couldn't materialize: couldn't get the value of variable s: variable not available Errored out in Execute, couldn't PrepareToExecuteJITExpression
为什么出现错误信息?我该如何检查变量s
?
lldb版本:lldb-320.4.115.3
g ++版本:Configured with: --prefix=/Applications/Xcode6-Beta5.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.45.3) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
该错误意味着调试信息确实提到了变量,但表示它在当前PC上没有存储位置.
这可能是因为变量被优化了(不太可能,因为你只是在变量上调用一个函数),或者因为编译器为变量添加了调试信息并且丢失了它的去向.
确保您正在编译试图在-O0调试的代码,因为没有多少编译器在更高的优化级别上发出良好的调试信息.如果你在-O0编译,这是一个编译器错误.您应该向gcc人员报告.你可以看看你是否有更好的运气.否则,您必须阅读函数的程序集以确定变量实际存在的位置,然后告诉调试器打印相应的强制转换地址.
当我从我的应用程序方案中启用"Address Sanitizer"时,我遇到了这个问题.禁用它修复了问题.
当我运行RELEASE(vs DEBUG)构建(Product-> Scheme ...-> Edit Scheme ...-> Info,然后将Build Configuration设置为"Debug"时,我看到了这一点.