【问题标题】:LLDB: How to inspect unordered_mapLLDB:如何检查 unordered_map
【发布时间】:2013-09-14 23:30:43
【问题描述】:

大多数其他 STL 容器打印正常,但 unordered_map 是一团糟。

我使用operator << 进行打印,但这不是关于打印,而是关于当我崩溃并且我想从 LLDB 提示符打印出我的哈希值时。

我不能打电话给call cout << var,因为那不起作用。

除了例如,没有其他解决方案吗?链接一个本身使用cout <<的模板函数?那还能用吗? (我正在尝试,但它不起作用,因为我必须提前知道模板参数类型将是什么,以便为它们生成和链接代码)

【问题讨论】:

    标签: c++ xcode c++11 lldb


    【解决方案1】:

    您应该能够检查unordered_map 对象本身,而无需对其调用方法。

    以这个简单的程序为例:

    #include <iostream>
    #include <string>
    #include <unordered_map>
    
    using namespace std;
    
    int main() {
        unordered_map<int, string> map;
        map[0] = "mary";
        map[1] = "had";
        map[2] = "a";
        map[3] = "little";
        map[4] = "lamb";
    
        return 0;
    }
    
    $ clang++ -std=c++11 -stdlib=libc++ -g unmap.cpp -o unmap
    $ lldb unmap
    Current executable set to 'unmap' (x86_64).
    (lldb) break set --name main
    

    lldb 为简洁起见未显示输出

    (lldb) proc launch
    

    n 输入 5 次,直到 return 0; 声明

    (lldb)
    Process 18063 stopped
    * thread #1: tid = 0x1c03, 0x0000000100000aea unmap`main + 1082 at unmap.cpp:15, stop reason = step over
        frame #0: 0x0000000100000aea unmap`main + 1082 at unmap.cpp:15
       12       map[3] = "little";
       13       map[4] = "lamb";
       14
    -> 15       return 0;
       16   }
       17
    

    然后使用p检查对象:

    (lldb) p map[0]
    (std::__1::unordered_map<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >::mapped_type) $2 = "mary"
    (lldb) p map[1]
    (std::__1::unordered_map<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >::mapped_type) $3 = "had"
    (lldb) quit
    

    您使用的lldb 版本会有所不同,因为它一直在改进:

    $ lldb -version
    LLDB-179.5
    

    (即Xcode 5 DP 6命令行包自带的那个)

    【讨论】:

    • 如何从命令行从 lldb 附加到 ARM 进程?我可以将两个实例附加到同一个正在运行的程序吗? (有些东西告诉我没有......)在不升级Xcode的情况下升级Xcode中的lldb版本怎么样? (由于 vim 插件,我想保留 Xcode 4)我确实有 lldb 项目本身通过 Xcode 成功编译。
    • @StevenLu 不,我不知道你会怎么做,但你可以使用调试器控制台从 Xcode 中与 LLDB 交互。我会尝试使用 LLDB 的版本,看看你是否可以做类似p map[0] 这样的事情。
    • 我有 LLDB 179.6。它失败了:p this-&gt;memberUnorderedMap[0] error: invalid use of 'this' outside of a non-static member functionp memberUnorderedMap[0] error: use of undeclared identifier 'memberUnorderedMap'(我可以使用p this-&gt;memberUnorderedMap获得整个地图本身的超级丑陋转储)
    • @StevenLu 你为什么用this-&gt;
    • 这是让它在对象实例中打印任何内容的唯一方法
    【解决方案2】:

    如果您愿意使用开源 lldb 并自己手动构建,可以使用 unordered_map 的合成提供程序:

    作者:enrico 日期:2013 年 9 月 4 日星期三 12:48:52 新修订:189964

    网址:http://llvm.org/viewvc/llvm-project?rev=189964&view=rev 日志:这个 是 libc++ unordered (multi) maps&set 的示例合成提供程序 感谢 Jared Grubb 编写并分享它!

    【讨论】:

    • 不清楚如何将它与 Xcode 集成,这样我就可以附加和调试 ARM 应用程序,而无需每次都进行复杂的设置过程
    • 是的,在手机上调试可能是所有这些方法中的棘手问题。你可以尝试的,不保证它会工作,只是从 ToT 源中提取 Python 脚本,然后“命令脚本导入”到你的 Xcode 会话中。这取决于您使用的 Xcode/LLDB 的版本,以及从那时起 SB API 的发展程度(就可用的调用/修复的错误而言),这可能会或可能不会起作用。通常,编写这些脚本时不会考虑与旧的 LLDB 兼容,也不会进行此类测试。它可能会起作用。如果是这样,那是你的幸运日:)
    • 是的。不过,我的模板漂亮打印机非常有效,因此足够粒度的日志记录几乎可以完成任何可以想象的工作。我可能会更好地使用基于网络的记录器系统,而不是尝试调整调试器。
    猜你喜欢
    • 2018-01-10
    • 2021-09-22
    • 2012-11-23
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多