Вопрос

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

Это было полезно?

Решение

Чтобы просмотреть содержимое вектора std :: vector 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 ++ отладчиком GUI (и любой другой IDE, использующей GDB, как мне кажется).

Другие советы

С помощью GCC 4.1.2, чтобы напечатать весь std::vector<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 элементов массива, начинающихся с указателя 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 (или поиска ~ / .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'}}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top