C++ GDB: Как отобразить диапазон элементов в векторе и в этом диапазоне, подмножество элементов элементов?

Этот ответ основан на комментарии bcumming в Как мне распечатать элементы вектора C++ в GDB? и был протестирован с Codelite 10.0.0, gcc 4.9.2 и gdb 7.7.1 на 64-битном Debian 8. Этот вопрос касался отображения всех элементов вектора. Недостаток ответа John Carter заключался в том, что он содержал имена, зависящие от внутренней библиотеки, и имел преимущество в том, что он прекрасно работал, даже если подчиненный (отлаживаемая программа) не скомпилировал в него код для оператора [ ]. (См.: gdb Не удалось найти оператор [].)

Если я хочу увидеть 4 элементы вектора vecVр начиная с индекса [3] тогда команда печати GDB:

p *(&vecV[3]) @ 4

Это мой ответ. Я пытался выяснить, как это сделать, годами, и, насколько я знаю, этого нет в руководстве по gdb. Текст ниже касается вариантов и принципов, лежащих в основе этой техники.

Одной из причин этого является уменьшение беспорядка отображения всех элементов вектора. Другой способ - сократить время, необходимое GDB для ответа на строки окна наблюдения, например, для каждой операции IDE "перешагнуть через". Я считаю, что gdb с его симпатичными механизмами печати на основе Python STL может занять секунды или десятки секунд, чтобы ответить на большое количество простых элементов или несколько более сложных.

Это приложение к векторам метода, описанного в разделе 10.4 руководства по gdb. Искусственные массивы, где бинарный оператор @ отлично работает с массивами в стиле C: p arrA[3] @ 4 но не векторы и тому подобное из библиотеки контейнеров (STL).

Вышеуказанное использование @, начиная с определенного элемента вектора, прекрасно работает в окне Watch Codeite, где p часть выше не нужна. Единственную строку, которую отображает Codelite, можно открыть, щелкая стрелки вправо, чтобы показать все значения элементов и объектов, векторов строк и т. Д., Которые они содержат. Однако он не работает как основа для отображения только одного внутреннего элемента, такого как некоторый объект класса, целое число или строка, каждого из диапазона векторных элементов. Для этого необходимо создать четыре линии часов (добавить p для вождения GDB напрямую):

vec[3].log
vec[4].log
vec[5].log
vec[6].log

Это, конечно, утомительно. Решение состоит в том, чтобы добавить некоторые переменные к подчиненному, которые будут использоваться только GDB. Они могут быть статическими, вне какой-либо функции и, таким образом, "глобальными":

static int XX = 0;
static int YY = 0;
static int ZZ = 0;

Их значения могут быть установлены из Codelite, в то время как подчиненный объект останавливается в точке останова с помощью таких команд, как set XX = 3 вошел в панель "Отправить" в нижней части консоли GDB, которая находится на вкладке "(красный значок божьей коровки)" окна "Отладчик". Это позволяет мне использовать четыре линии Watch, каждая из которых фокусируется только на элементе "log" четырех выбранных элементов в векторе, который можно легко направить в любую часть вектора, изменив значение XX:

vecV[XX + 0].log
vecV[XX + 1].log
vecV[XX + 2].log
vecV[XX + 3].log

Более того, по моему опыту, меняется XX заставляет Codelite не только отображать новые данные, но и выделять красным любые, отличающиеся от тех, которые отображались с предыдущим значением XX,

Если log был объект, содержащий строку, которая была слишком длинной для просмотра в окне "Просмотр" ("Настройки"> "Настройки GDB"> "Отладчик GNU GDB"> "Основные"> "Отображение"> "Количество элементов, отображаемых для массивов / строк"), затем я могу использовать приведенную выше схему и substr() с некоторыми другими переменными gdb-set для управления отображаемым диапазоном строк:

vecV[XX + 0].log.strS.substr(AA, BB)
vecV[XX + 1].log.strS.substr(AA, BB)
vecV[XX + 2].log.strS.substr(AA, BB)
vecV[XX + 3].log.strS.substr(AA, BB)

Такие переменные могут быть применены к основной технике, чтобы обеспечить управляемое окно отображения с изменяемым размером в векторе, вводя одну или две команды в консоль gdb, а не редактируя строку окна наблюдения, которая обычно включает много мыши / трекбола нажав, чтобы заново открыть все ветви объектов, которые представляют интерес:

(&vecV[YY]) @ ZZ

0 ответов

Другие вопросы по тегам