【问题标题】:lldb cannot print values in debug codelldb 无法在调试代码中打印值
【发布时间】:2017-09-06 08:41:35
【问题描述】:

在 lldb 中打印值时,出现以下错误

error: no member named 'rec' in namespace '$__lldb_local_vars'

我的代码是由 -g 编译的。为什么 lldb 不能打印值?

【问题讨论】:

    标签: lldb


    【解决方案1】:

    $__lldb_local_vars 解决了 clang 为 lldb 的表达式解析器提供的名称查找功能中的一些问题。 hack 尝试通过将局部变量注入命名空间,然后将其导入到表达式中,将局部变量提升到名称查找的头部(在本地可见类和命名空间查找之前)。这有一些性能问题,而且它也很脆弱,因为它需要实现所有可见的局部变量。我们做了很多工作来删除我们可以说我们无法实现的本地人,但它仍然不能非常可靠地工作。

    Apple 发布的所有 lldb 中默认关闭此 hack,并通过设置进行控制:

    (lldb) set list target.experimental.inject-local-vars
      target.experimental.inject-local-vars -- If true, inject local variables explicitly into the
                                               expression text.  This will fix symbol resolution
                                               when there are name collisions between ivars and
                                               local variables.  But it can make expressions run
                                               much more slowly.
    

    您可以使用settings show 显示此设置的当前值,并使用settings set 更改它。

    如果您可以提供显示此故障的示例,向 llvm 错误报告者提交错误会很有帮助:https://bugs.llvm.org

    【讨论】:

    • 这种bug在最新的lldb中修复了吗?
    • 不,我们还没有找到更好的方法来告诉 clang 当地人。我们不得不做一堆基础工作,首先清理 lldb 表达式解析器和 clang 之间的接口,但还没有结果。
    • 在我的情况下,二进制文件是由 gcc 而不是 clang 编译的。 lldb是否支持调试gcc构建的代码?
    • lldb 主要使用 DWARF 调试格式。 gcc 和 clang 都发出 DWARF,因此 lldb 应该使用任一编译器的输出。 DWARF 现在是 gcc 的默认格式,-g 应该让你明白。当然,所有编译器在它们的调试信息发射中都有错误(或“是的,这是合法的,但为什么?”时刻),并且 lldb 在 clang 中的使用比在 gcc 输出中更频繁。因此,我们处理 gcc 调试信息时可能存在比 clang 更多的错误。但这应该在边缘。
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2016-07-10
    • 2013-03-26
    • 2017-02-02
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多