Использование структурной распечатки (pretty-printing) в GDB

Данный механизм в частности позволяет получить содержимое STL классов в удобочитаемой форме.  Для примера возьмем такой код:
std::string fred(“abc”);
 Если вы попытаетесь распечатаь содержимое переменной fred в GDB, вы увидите кучу недружелюбной и не всегда нужной информации.
(gdb) print fred
$1 = {
 static npos = <optimized out="">, 
 _M_dataplus = {
 <std::allocator <char>&gt; = {
 &lt;__gnu_cxx::new_allocator<char>&gt; = {<no data="" fields="">}, </no><no data="" fields="">}, 
 members of std::basic_string<char , std::char_traits<char="">, std::allocator</char><char> &gt;::_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
Вот и все дела. Теперь распечатка std::string покажет
(gdb) print fred
$1 = “abc”
Гораздо лаконичнее. GDB поставляется с адаптерами (pretty-printers) для большинства C++ STL контейнеров — set, list. Эти самые адаптеры (pretty-printers) созданы в предположении, что вы хотите увидеть в выводе содержимое контейнера, а не типы STL, которые использованы неявно.

Как это работает

Если вы используете последнюю версию GDB, то в ней есть встроенный интерпретатор Python. Там есть Python модуль “gdb”. Помимо использования адаптеров, этот модуль позволяет создавать новые команды и добывать информацию из отлаживаемой корки (core dump) или процесса. [sc:social_networks ]
You can leave a response, or trackback from your own site.

Leave a Reply