【问题标题】:gdb how to print vector<bool> valuegdb如何打印向量<bool>值
【发布时间】:2014-12-04 18:31:04
【问题描述】:

我只是调试c++程序,我有价值

vector<bool> B(n, 0);

我的问题是如何在 gdb 控制台中打印它的值?因为 eclipse IDE 不太聪明,无法以 redable 格式呈现。

当我有整数向量时,我可以这样做:

 printf "%x %x %x", B[0], B[1], B[2]...

所以我能够阅读这个向量。但是使用布尔值很难,因为 printf 没有格式来打印它,我也无法在控制台中输入 p B[0]; p B[1] ...

所以也许有人知道如何调试这样的东西?

【问题讨论】:

    标签: c++ command-line stl gdb


    【解决方案1】:

    bitset 是比vector&lt;bool&gt; 更好的选择。

    还有其他原因,因为它支持流操作符,所以你可以把这个东西流出来。

    这当然假设数据类型在您的控制之下。

    使用printf,您可以使用bitsetto_string

    编辑回复Enrico

    如果不能使用bitset,则可以从GDB 打印vector&lt;bool&gt; 元素,但需要了解vector&lt;bool&gt; 在GCC 中是如何实现的。 vector&lt;bool&gt; 的索引运算符不是返回bool,而是返回vector&lt;bool&gt;::reference,它不是bool,而是为bool 提供了一个转换运算符。

    在 GCC 中,这个 reference 有一个 _M_p 成员,它是一个指向为 vector&lt;bool&gt; 类分配的存储空间的指针和一个 _M_mask 成员,它可以用来屏蔽除索引位之外的所有内容。这两者的组合产生零值或非零值。零表示该位未设置,非零表示该位已设置。

    对于vector&lt;bool&gt; foo,您可以使用 GDB 命令打印此组合:

    打印 *(foo[i]._M_p) & foo[i]._M_mask

    【讨论】:

    • 尽管这是一个很好的建议,但这不是问题所在。 bitset 需要编译时大小,而 vector 不需要,所以有几次 bitset 不适合,我在这里遇到了同样的问题。
    • @Enrico 公平点。我已经更新以解释被困在vector&lt;bool&gt; 实现中的可怜的灵魂如何实现这一点(在 GCC 上)。
    • 答案似乎不对。使用大小为 2 的向量,我使用 i=1 得到结果(无符号长整数)2。任何非零结果是否代表真实?如果是这样,为了清楚起见,答案应该是print !!(*(foo[i]._M_p) &amp; foo[i]._M_mask)
    • @rwst 自从我在 gdb 工作以来已经有一段时间了。但是是的,我似乎确实记得非零意味着该位已设置,正如我在回答中所说的那样。您的评论很有帮助,因为它会将整数转换为实际的“真”/“假”。如果您愿意添加答案,您肯定会得到我的支持!
    猜你喜欢
    • 2010-09-20
    • 2015-01-08
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多