Данный механизм в частности позволяет получить содержимое STL классов в удобочитаемой форме.
Для примера возьмем такой код:
std::string fred(“abc”); |
Если вы попытаетесь распечатаь содержимое переменной fred в GDB, вы увидите кучу недружелюбной и не всегда нужной информации.
(gdb) print fred $1 = { static npos = <optimized out="">, _M_dataplus = { <std::allocator<char>> = { <__gnu_cxx::new_allocator</char><char>> = {<no data="" fields="">}, </no><no data="" fields="">}, members of std::basic_string<char, std::char_traits<char="">, std::allocator<char> >::_Alloc_hider: _M_p = 0×601048 “abc” } } </char></char,></no></char></std::allocator<char></char></optimized> |
Но есть способ это поправить.
Отредактируйте файл ~/.gdbinit, и вставьте такие строки:
python import sys sys.path.insert(0, ‘/usr/share/gdb/python’) from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None) end |
Вот и все дела. Теперь распечатка std::string покажет
(gdb) print fred $1 = “abc” |
Гораздо лаконичнее.
GDB поставляется с адаптерами (pretty-printers) для большинства C++ STL контейнеров — set, list. Эти самые адаптеры (pretty-printers) созданы в предположении, что вы хотите увидеть в выводе содержимое контейнера, а не типы STL, которые использованы неявно.
Как это работает
Если вы используете последнюю версию GDB, то в ней есть встроенный интерпретатор Python. Там есть Python модуль “gdb”. Помимо использования адаптеров, этот модуль позволяет создавать новые команды и добывать информацию из отлаживаемой корки (core dump) или процесса.