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

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

Ответ 1

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

Ответ 2

С 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 [email protected]

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

p [email protected]

Ответ 3

"Наблюдение" контейнеров 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-inline-functions

Ответ 4

поставьте следующее в ~/.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'}}