Использование структурной распечатки (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><char>&gt; = {<no data="" fields="">}, </no><no data="" fields="">}, 
 members of std::basic_string<char, std::char_traits<char="">, std::allocator<char> &gt;::_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) или процесса.

You can leave a response, or trackback from your own site.

Leave a Reply