Как распечатать элементы вектора C++ в GDB?

Я хочу изучить содержание std::vector в GDB, как мне это сделать? Допустим, это std::vector<int> для простоты.

4 ответов


для просмотра векторного содержимого std:: vector myVector просто введите GDB:

(gdb) print myVector

это приведет к выходу, аналогичному:

 = std::vector of length 3, capacity 4 = {10, 20, 30}

чтобы достичь выше, вам нужно иметь gdb 7 (я тестировал его на gdb 7.01) и некоторый python pretty-printer. Процесс установки описан на gdb wiki.

более того, после установки выше, это хорошо работает с затмение C++ отладчик GUI (и любой другой IDE с использованием GDB, как я думать.)


С помощью GCC 4.1.2 для печати всего std:: vector , называемого myVector, выполните следующие действия:

print *(myVector._M_impl._M_start)@myVector.size()

чтобы напечатать только первые N элементов, выполните:

print *(myVector._M_impl._M_start)@N

объяснение

Это, наверное, сильно зависит от версии компилятора, но для GCC 4.1.2, указатель на внутренний массив:

myVector._M_impl._M_start 

и команда GDB для печати N элементов массива, начиная с указателя P:

print P@N

или, в краткой форме (для стандарта .gdbinit):

p P@N

"просмотр" контейнеров STL во время отладки является некоторой проблемой. Вот 3 различных решения, которые я использовал в прошлом, ни одно из них не идеально.

1) Используйте скрипты GDB изhttp://clith.com/gdb_stl_utils/ эти сценарии позволяют печатать содержимое почти всех контейнеров STL. Проблема в том, что это не работает для вложенных контейнеров, таких как стопка наборов.

2) для Visual Studio 2005 имеет фантастическую поддержку для просмотра контейнеры STL. Это работает для вложенных контейнеров, но это для их реализации только для STL и не работает, если вы помещаете контейнер STL в контейнер Boost.

3) Напишите свою собственную функцию "печать" (или метод) для конкретного элемента, который вы хотите напечатать во время отладки, и используйте "вызов" в GDB для печати элемента. Обратите внимание, что если ваша функция печати не вызывается нигде в коде, g++ выполнит удаление мертвого кода, а функция "печать" не будет найдена GDB (вы получите сообщение о том, что функция встроена). Поэтому компилируйте с-fkeep-inline-functions


поместите следующее в~/.файл gdbinit

define print_vector
    if $argc == 2
        set $elem = $arg0.size()
        if $arg1 >= $arg0.size()
            printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
            set $elem = $arg1 -1
        end
        print *($arg0._M_impl._M_start + $elem)@1
    else
        print *($arg0._M_impl._M_start)@$arg0.size()
    end
end

document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end

после перезапуска gdb (или sourcing~/.gdbinit), показать связанную помощь, как это

gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display

пример использования:

(gdb) print_vector videoconfig_.entries 0
 = {{subChannelId = 177 '1', sourceId = 0 '0', hasH264PayloadInfo = false, bitrate = 0,     payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '0', temporalLayers = 0 '0'}}