Вопрос по c++, stl, visual-studio – Проверка контейнеров STL в отладке Visual Studio

28

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

Ваш Ответ

10   ответов
4

чтобы посмотреть переменную, подобную этой.

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

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

Если вы можете использовать & quot;natvis& quot ;, это решит ваши проблемы.

Это «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;">
    <Di,splayString>{{ 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>

Before enter image description here

After enter image description here

Error: User Rate Limit Exceededa._Mypair._Myval2._Myfirst, 10Error: User Rate Limit Exceeded10Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
11

ла получения данных находятся в файле autoexp.dat & quot; c: \ Program Files \ Microsoft Visual Studio 9 \ Common7 \ Packages \ Debugger \ autoexp.dat & quot ;.

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

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

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

1

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

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

[I tested this setting only for Visual Studio 2010 Professional version installed with Microsoft Visual studio 2010 Service pack 1]

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

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

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

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

0


Итак, я написал немного кода

1: I had vector of vector of long long elements
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: if you have just a vector of long long elements, then just convert as below:
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

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

5
1

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

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

3

по крайней мере для меня, отображает содержимое контейнеров STL в стандартном окне содержимого при наведении курсора.

Error: User Rate Limit Exceeded
18

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

(v._Myfirst)[startIndex], count

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

Error: User Rate Limit Exceeded(v._Myfirst + startIndex),countError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded(v._M_start)[startIndex], count
Error: User Rate Limit Exceededv._Myfirst(), countError: User Rate Limit Exceeded
14

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

Error: User Rate Limit Exceeded((v)._Myfirst)[index]
7

используйте:

container.operator[](n)
Error: User Rate Limit Exceeded

Похожие вопросы