我已使用此命令行编译了一个cpp文件:g++ -g test.cpp
它在第28行引发异常。我想通过检查lldb中的变量来调查原因。我在第28行设置了一个断点并在lldb中运行a.out
。
(lldb) n
Process 84233 stopped
* thread #1: tid = 0xa44b86, 0x00000001000017fb a.out`say(s=<unavailable>) + 987 at so.cpp:28, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x00000001000017fb a.out`say(s=<unavailable>) + 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
答案 0 :(得分:21)
该错误意味着调试信息确实提到了变量,但表示它在当前PC上没有存储位置。
这可能是因为变量得到了优化(不太可能,因为你只是在变量上调用一个函数),或者因为编译器对变量进行了调试信息,并且丢失了它的去向。
确保您正在编译试图在-O0调试的代码,因为没有多个编译器在更高的优化级别上发出良好的调试信息。如果你在-O0编译,这是一个编译器错误。您应该向gcc人员报告。你可以看看你是否有更好的运气。否则,您必须读取函数的程序集以确定变量实际存在的位置,然后告诉调试器打印适当的强制转换地址。
答案 1 :(得分:12)
当我启用&#34; Address Sanitizer&#34;我遇到了这个问题。从我的应用程序方案。禁用它修复了问题。
答案 2 :(得分:11)
当我运行RELEASE(vs DEBUG)版本(Product-&gt; Scheme ...-&gt; Edit Scheme ...-&gt; Info,然后将Build Configuration设置为“Debug”)时,我看到了这一点。
答案 3 :(得分:0)
使用标志-Og
进行编译时遇到此问题。由于某种原因,我当时认为这意味着“针对调试进行优化”。我认为事实并非如此。删除该标志对我来说解决了这个问题。