C++ STL - вручную, используя стандартные GDB красивые принтеры

Как я могу использовать StdVectorPrinter из https://github.com/gcc-mirror/gcc/blob/gcc-6_3_0-release/libstdc%2B%2B-v3/python/libstdcxx/v6/printers.py чтобы создать свой собственный вывод стиль?
Т.е. использовать существующие инструменты для доступа к элементам, но управлять выводом самостоятельно.

Например, для

#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 (например)?

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)

Использование итераторов будет работать и для других контейнеров.

Где находится скелетный код для универсального принтера, который использует 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)

кто ассоциирует StdVectorPrinter с std::vector, Вы можете переопределить StdVectorPrinter сам, или вы можете связать std::vector с другим симпатичным принтером.

Другие вопросы по тегам