Подтвердить что ты не робот

Проверка контейнеров STL в отладке Visual Studio

Если у меня есть переменная std::vector или std::map, и я хочу видеть содержимое, это большая боль, чтобы увидеть n-й элемент во время отладки. Есть ли плагин или какой-то трюк, чтобы упростить просмотр переменных контейнера STL при отладке (VS2003/2005/2008)?

4b9b3361

Ответ 1

Для векторов этот thread на форумах msdn имеет фрагмент кода для установки часов на векторном индексе, который может помочь.

Ответ 2

Если вы хотите смотреть несколько элементов одновременно, вы можете добавить запятую и количество элементов так:

(v._Myfirst)[startIndex], count

Однако обратите внимание, что count должно быть константой, оно не может быть результатом другого выражения.

Ответ 3

В VS2005 и VS 2008 вы можете увидеть содержимое контейнеров STL. Правила получения данных находятся в файле autoexp.dat "c:\Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat".

AutoExp.dat предназначен для настройки. Тем не менее, STL defs находится под разделом, называемым [Visualizer]. Если вы можете понять язык, используемый в этом разделе, больше энергии для вас, однако я бы рекомендовал просто оставить эту часть в одиночку.

Autoexp.dat существовал в VS2003, но поддержка контейнеров STL не поддерживалась ([Visualizer] не существовал). В VS2003 вам необходимо вручную перейти к базовому представлению данных.

При изменении autoexp.dat можно добавить правила для навигации по представлению данных ваших собственных типов, чтобы их было легче отлаживать. Если вы это сделаете, вы должны добавить только материал в [AutoExp]. Будьте осторожны и сохраняйте резервную копию этого файла, прежде чем изменять его.

Ответ 4

Чтобы просмотреть n-й элемент контейнера в отладчике Visual Studio, используйте:

container.operator[](n)

Ответ 6

Visual Studio 2008, по крайней мере для меня, отображает содержимое контейнеров STL в стандартном поле содержимого мыши.

Ответ 7

Самый простой метод - вы должны подготовить указатель на просмотр такой переменной.

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

Я попробовал "a._Myfirst [0]" в VisualStudio2015, но он не отображал данные массива.

Если вы можете использовать " natvis, он решит ваши проблемы.

Это "sample.natvis" для отображения std::vector данных для Visual studio 2015.

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
      <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

До введите описание изображения здесь

После введите описание изображения здесь

Ответ 8

Вы также можете щелкнуть правой кнопкой мыши любое значение в ваших часах и выбрать "добавить часы". Это может быть полезно, если вам нужно всего лишь взглянуть на один элемент карты или установить.

Это также приводит к решению, которое christopher_f отправил для векторов - ((v)._ Myfirst) [index]

Ответ 9

Вышеупомянутый метод [((v)._ Myfirst) [index]] будет работать только для конкретного контейнера (std::vector) не для всех возможных контейнеров STL. Например, если вы хотите увидеть содержимое std:: deque, тогда вам нужно искать какой-либо другой метод для просмотра содержимого в std:: deque.

Возможно, вы можете попробовать следующую подобную настройку, чтобы решить вашу проблему.

[Я тестировал этот параметр только для версии Visual Studio 2010 Professional, установленной в Microsoft Visual Studio 2010 Service Pack 1]

Шаг 1: Удалите пакет Microsoft Visual Studio 2010 с пакетом обновления 1 - для моей проектной работы мне действительно не нужен пакет обновления 1, поэтому удаление пакета обновления 1 не вызовет никаких проблем для моего случая.

Шаг 2: Перезагрузите систему.

Шаг 3: Этот шаг не требуется, если вы не получаете сообщение об ошибке "LINK: фатальная ошибка LNK1123: сбой при преобразовании в COFF: файл недействителен или поврежден". В противном случае просмотрите

Свойство проекта → Linker (Общее) → Изменить Включить инкрементное связывание с No (/INCREMENTAL: NO)

Ответ 10

В сравнении с 2015, я не мог получить ни один из этих рабочих поэтому я написал немного кода

1: у меня был вектор вектора длинномерных элементов

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

в основном, что я сделал, был преобразован вектор в строку. У меня был вектор вектора, поэтому у меня был вектор-строка для заполнения.

2: если у вас есть только вектор длинномерных элементов, тогда просто преобразуйте, как показано ниже:

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger

надеюсь, что это помогло.