2008-10-31 3 views
185

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

+3

Похожий вопрос: Http: // StackOverflow .com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb (ссылка в ответе очень интересная). – 2009-06-26 15:47:49

+0

Новый, лучший способ сделать это в этом вопросе: http://stackoverflow.com/questions/2492020/how-to-view-contents-of-stl-containers-using-gdb-7-x/2492341# 2492341 – dshepherd 2013-04-19 11:19:09

+0

Не-векторный характер: https://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb – 2017-09-24 10:29:36

ответ

68

Для просмотра вектор зЬй :: содержимое вектор myVector, просто введите в GDB:

(gdb) print myVector 

Это даст результат, похожий:

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

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

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

230

С GCC 4.1.2, чтобы напечатать весь в станд :: вектор <INT> называется 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 элементов массива, начиная с указателя Р:

print [email protected] 

Или, короткая форма (для стандартного .gdbinit):

p [email protected] 
+3

Хе-хе, это то, что меня прослушивало раньше, поэтому я просто посмотрел его сегодня утром и добавил его как памятку для себя (как рекомендовал сам Джефф). – 2008-10-31 11:10:42

+2

Также, если вы хотите только определенный векторный элемент, myVector._M_impl._M_start + n (для n-го элемента) – mariner 2014-01-07 01:26:43

13

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

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

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

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

6

введите следующее в ~ /.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 
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0,  payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}} 
Смежные вопросы