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++ выполнит удаление мертвого кода, а функция "print" не будет найдена 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'}}
Comments