Проверка контейнеров STL в отладке Visual Studio - PullRequest
28 голосов
/ 19 сентября 2008

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

Ответы [ 10 ]

18 голосов
/ 20 сентября 2008

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

(v._Myfirst)[startIndex], count

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

14 голосов
/ 20 сентября 2008

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

11 голосов
/ 21 сентября 2008

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

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

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

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

7 голосов
/ 28 марта 2015

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

container.operator[](n)
5 голосов
/ 20 сентября 2008

Вы можете создать собственный визуализатор Проверьте это: http://www.virtualdub.org/blog/pivot/entry.php?id=120

4 голосов
/ 31 октября 2016

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

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>

До enter image description here

* После 1021 * enter image description here

3 голосов
/ 20 сентября 2008

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

1 голос
/ 06 августа 2013

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

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

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

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

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

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

Свойство проекта -> Линкер (Общее) -> Изменить включение инкрементной ссылки на Нет (/ INCREMENTAL: NO)

1 голос
/ 20 сентября 2008

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

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

0 голосов
/ 08 июня 2016

В 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...