【问题标题】:c++ stl - manually using standard gdb pretty printersc++ stl - 手动使用标准 gdb 漂亮打印机
【发布时间】:2018-08-17 20:15:51
【问题描述】:

如何使用 https://github.com/gcc-mirror/gcc/blob/gcc-6_3_0-release/libstdc%2B%2B-v3/python/libstdcxx/v6/printers.py 的 StdVectorPrinter 创建自己的输出样式?
IE。使用现有的元素访问工具,但我自己驱动输出。

例如对于

#include <string>
#include <vector>
#include <iostream>

int main(int, char**)
{
    std::vector<std::string> data = { "hello", "world", "all", "is", "fine" };

    for ( auto && i : data) {
        std::cout << i << std::endl;
    }
    return 0;
}

输出不应是

(gdb) p data
$2 = std::vector of length 5, capacity 5 = {"hello", "world", "all", "is", "fine"}

但是

(gdb) p data
$2 = "hello|world|all|is|fine"

使用 StdVectorPrinter(例如)的通用打印机的骨架代码在哪里?

【问题讨论】:

    标签: python c++ stl gdb


    【解决方案1】:

    使用 StdVectorPrinter 的通用打印机的骨架代码在哪里

    这可能取决于您的操作系统。在 Ubuntu 上:

    $ dpkg -L libstdc++6:amd64 | grep '\.py'
    /usr/share/gcc-8/python/libstdcxx/__init__.py
    /usr/share/gcc-8/python/libstdcxx/v6/__init__.py
    /usr/share/gcc-8/python/libstdcxx/v6/printers.py
    /usr/share/gcc-8/python/libstdcxx/v6/xmethods.py
    /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25-gdb.py
    

    printers.py 包含这一行:

        libstdcxx_printer.add_container('std::', 'vector', StdVectorPrinter)
    

    StdVectorPrinterstd::vector 相关联。您可以覆盖StdVectorPrinter 本身,或者您可以将std::vector 与不同的漂亮打印机相关联。

    【讨论】:

      【解决方案2】:

      这可以完成工作 - 但它不使用 StdVectorPrinter 迭代器:

      (gdb) py
      >data = gdb.parse_and_eval("data")
      >count = data['_M_impl']['_M_finish'] - data['_M_impl']['_M_start']
      >result = ''
      >data = data['_M_impl']['_M_start']
      >for x in range(int(count)):
      > result = result + str((data + x).dereference())[1:-1] + '|'
      >print (result)
      >end
      hello|world|all|is|fine|
      (gdb)
      

      使用迭代器也适用于其他容器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多