Я хочу изучить содержимое std::vector
в GDB, как это сделать? Скажем, для простоты это std::vector<int>
.Как распечатать элементы вектора C++ в GDB?
ответ
Для просмотра вектор зЬй :: содержимое вектор 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, как я думаю).
С 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]
Хе-хе, это то, что меня прослушивало раньше, поэтому я просто посмотрел его сегодня утром и добавил его как памятку для себя (как рекомендовал сам Джефф). – 2008-10-31 11:10:42
Также, если вы хотите только определенный векторный элемент, myVector._M_impl._M_start + n (для n-го элемента) – mariner 2014-01-07 01:26:43
«Просмотр» 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-инлайн-функций
введите следующее в ~ /.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'}}
- 1. Как распечатать элементы вектора C++ в GDB на OSX 10.9?
- 2. Как я могу распечатать элементы вектора объекта?
- 3. Как распечатать содержимое вложенного вектора в C++?
- 4. gdb - как распечатать результат оценки для C++
- 5. C++ Как распечатать содержимое составного вектора
- 6. GDB: печать содержимого вектора
- 7. C++ вычитать элементы вектора
- 8. Элементы копирования вектора C++?
- 9. GDB & C++: печать вектора указателей на объекты
- 10. Как эмулировать «удвоенные» элементы вектора в C++
- 11. Как объединить элементы вектора в C++
- 12. Как мне получить доступ и распечатать отдельные элементы вектора векторов?
- 13. Пытается распечатать содержимое вектора
- 14. Как распечатать последний полученный сигнал в GDB?
- 15. Как распечатать массив Java в gdb?
- 16. Как распечатать содержимое списка указателей в gdb?
- 17. C++ удаляет определенные элементы вектора
- 18. мои элементы вектора C++ удаляются
- 19. Как эффективно удалить элементы из вектора C++
- 20. Печать вектора в C++
- 21. Как заменить определенные элементы вектора на элементы вектора строки?
- 22. Как распечатать элементы класса
- 23. C++ толкающие элементы вектора векторов в вектор
- 24. Умножить элементы вектора соответственно в C++
- 25. Элементы удаления и сортировки вектора в C++
- 26. Как вычитать элементы вектора г
- 27. Распечатать весь список связанных ссылок в gdb?
- 28. C++: элементы-элементы уничтожены после вектора, заполненного в конструкторе класса
- 29. C++, быстро удалить элементы из вектора уникального для другого вектора
- 30. Как распечатать элементы в списке в JTextArea?
Похожий вопрос: Http: // StackOverflow .com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb (ссылка в ответе очень интересная). – 2009-06-26 15:47:49
Новый, лучший способ сделать это в этом вопросе: 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
Не-векторный характер: https://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb – 2017-09-24 10:29:36