Как просмотреть содержимое контейнеров STL с помощью GDB 7.x - PullRequest
13 голосов
/ 22 марта 2010

Я использую решение для макроса, как оно указано здесь .Тем не менее, есть упоминание о том, как просматривать их без макросов.Я имею в виду GDB версии 7 и выше.

Кто-нибудь проиллюстрирует, как?

Спасибо

Ответы [ 2 ]

21 голосов
/ 22 марта 2010

Получите средства просмотра Python из SVN

svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

Добавьте следующее к вашему ~/.gdbinit

python
import sys
sys.path.insert(0, '/path/to/pretty-printers/dir')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

Тогда печать должна работать:

std::map<int, std::string> the_map;
the_map[23] = "hello";
the_map[1024] = "world";

В gdb:

(gdb) print the_map 
$1 = std::map with 2 elements = { [23] = "hello", [1024] = "world" }

Чтобы вернуться к старому виду, используйте print /r (/r для необработанного).

См. Также: http://sourceware.org/gdb/wiki/STLSupport

2 голосов
/ 12 июня 2012

libstdcxx_printers включены в последние версии GCC, поэтому, если вы используете GCC 4.5 или более поздней версии, вам не нужно ничего делать, просто печатать Just Works.

(gdb) p v
$1 = std::vector of length 3, capacity 3 = {std::set with 3 elements = {
    [0] = 1, [1] = 2, [2] = 3}, std::set with 2 elements = {[0] = 12, 
    [1] = 13}, std::set with 1 elements = {[0] = 23}}
(gdb) p v[1]
$2 = std::set with 2 elements = {[0] = 12, [1] = 13}

Чтобы отключить красивую печать, используйте p/r или print/r, чтобы получить «сырой» вывод.

...