lldb:无法实现:无法获取变量的值

时间:2014-08-16 00:47:14

标签: c++ osx-mavericks lldb

我已使用此命令行编译了一个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

4 个答案:

答案 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进行编译时遇到此问题。由于某种原因,我当时认为这意味着“针对调试进行优化”。我认为事实并非如此。删除该标志对我来说解决了这个问题。