【问题标题】:lldb: Couldn't materialize: couldn't get the value of variablelldb:无法实现:无法获取变量的值
【发布时间】:2014-10-09 18:05:31
【问题描述】:

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

【问题讨论】:

    标签: c++ osx-mavericks lldb


    【解决方案1】:

    该错误意味着调试信息确实提到了该变量,但表示它在当前 PC 上没有存储位置。

    这可能是因为变量已优化(不太可能是因为您只是在变量上调用函数),或者是因为编译器混淆了变量的调试信息并忘记了它的去向。

    确保您在 -O0 编译您尝试调试的代码,因为没有多少编译器可以在更高的优化级别发出良好的调试信息。如果你在 -O0 编译,这是一个编译器错误。您可能应该将其报告给 gcc 人员。你可以看看你是否有更好的铿锵声。否则,您必须阅读函数的程序集以找出变量实际存在的位置,然后告诉调试器打印适当的转换地址。

    【讨论】:

    • OP 正在使用 clang。向“gcc 人员”报告是没有意义的
    【解决方案2】:

    当我从我的应用方案中启用“Address Sanitizer”时,我遇到了这个问题。禁用它可以解决问题。

    【讨论】:

      【解决方案3】:

      我在运行 RELEASE(与 DEBUG)构建(产品->方案...->编辑方案...->信息,然后将构建配置设置为“调试”时看到这一点。

      【讨论】:

        【解决方案4】:

        我在使用标志 -Og 编译时遇到了这个问题。出于某种原因,我认为这意味着“优化调试”。我认为实际情况并非如此。删除该标志为我解决了这个问题。

        【讨论】:

        • -Og 确实应该针对调试进行优化。我通过从 clang++ 5 升级到 clang++ 7 解决了这个问题。从 -Og 切换到 -O0 也修复了“无法实现”错误,但后来我无法在同一个函数中检查一些 std::strings。
        猜你喜欢
        • 1970-01-01
        • 2020-05-20
        • 2016-07-10
        • 2020-07-03
        • 2017-07-17
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多