
Данный механизм в частности позволяет получить содержимое STL классов в удобочитаемой форме.
Для примера возьмем такой код:
Если вы попытаетесь распечатаь содержимое переменной fred в GDB, вы увидите кучу недружелюбной и не всегда нужной информации.
(gdb) print fred
$1 = {
static npos = <optimized out="">,
_M_dataplus = {
<std::allocator <char>> = {
<__gnu_cxx::new_allocator<char>> = {<no data="" fields="">}, </no><no data="" fields="">},
members of std::basic_string<char , std::char_traits<char="">, std::allocator</char><char> >::_Alloc_hider:
_M_p = 0×601048 “abc”
}
}
</char></no></char></std::allocator></optimized> |
(gdb) print fred
$1 = {
static npos = <optimized out="">,
_M_dataplus = {
<std::allocator <char>> = {
<__gnu_cxx::new_allocator<char>> = {<no data="" fields="">}, </no><no data="" fields="">},
members of std::basic_string<char , std::char_traits<char="">, std::allocator</char><char> >::_Alloc_hider:
_M_p = 0×601048 “abc”
}
}
</char></no></char></std::allocator></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 |
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) print fred
$1 = “abc”
Гораздо лаконичнее.
GDB поставляется с адаптерами (pretty-printers) для большинства C++ STL контейнеров — set, list. Эти самые адаптеры (pretty-printers) созданы в предположении, что вы хотите увидеть в выводе содержимое контейнера, а не типы STL, которые использованы неявно.
Как это работает
Если вы используете последнюю версию GDB, то в ней есть встроенный интерпретатор Python. Там есть Python модуль “gdb”. Помимо использования адаптеров, этот модуль позволяет создавать новые команды и добывать информацию из отлаживаемой корки (core dump) или процесса.
[sc:social_networks ]