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





Для векторов в этом нить на форумах msdn есть фрагмент кода для установки наблюдения за векторным индексом, который может помочь.
Visual Studio 2008, по крайней мере, для меня, отображает содержимое контейнеров STL в стандартном поле содержимого при наведении указателя мыши.
Я тоже, и я уверен, что VS2005 сделал то же самое.
Вы можете создать собственный визуализатор Проверьте это: http://www.virtualdub.org/blog/pivot/entry.php?id=120
Вы также можете щелкнуть правой кнопкой мыши любое значение на часах и выбрать «Добавить часы». Это может быть полезно, если вам нужно взглянуть только на один элемент карты или набора.
Это также приводит к решению, которое christopher_f опубликовал для векторов - ((v) ._ Myfirst) [index]
Если вы хотите просматривать более одного элемента одновременно, вы можете добавить запятую и количество элементов следующим образом:
(v._Myfirst)[startIndex], count
Однако обратите внимание, что count должно быть константой и не может быть результатом другого выражения.
небольшая разница в именах в Visual Studio 2010 (и, возможно, в других версиях?): (v._M_start)[startIndex], count
Мне пришлось сделать (v._Myfirst + startIndex),count в VS2010 SP1
Мне пришлось сделать v._Myfirst(), count в VS2015.
В 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]. Будьте осторожны и сделайте резервную копию этого файла, прежде чем изменять его.
Вышеупомянутый метод [((v) ._ Myfirst) [индекс]] будет работать только для определенного контейнера (std :: vector), а не для всех возможных контейнеров STL. Например, если вы хотите увидеть содержимое std :: deque, вам нужно найти другой метод для просмотра содержимого в std :: deque.
Возможно, вы можете попробовать следующую аналогичную настройку, чтобы решить вашу проблему
[Я тестировал этот параметр только для версии Visual Studio 2010 Professional, установленной с пакетом обновления 1 для Microsoft Visual Studio 2010]
Шаг 1. Удалите пакет обновления 1 для Microsoft Visual studio 2010 - для моей работы над проектом мне действительно не нужен пакет обновления 1, поэтому удаление пакета обновления 1 не вызовет каких-либо проблем в моем случае.
Шаг 2: Перезагрузите вашу систему.
Шаг 3. В этом шаге нет необходимости, если вы не получаете сообщение об ошибке «ССЫЛКА: фатальная ошибка LNK1123: сбой при преобразовании в COFF: файл недействителен или поврежден». В противном случае просмотрите
Свойство проекта -> Компоновщик (Общие) -> Изменить Включить инкрементное связывание на Нет (/ INCREMENTAL: NO)
Чтобы просмотреть n-й элемент контейнера в отладчике Visual Studio, используйте:
container.operator[](n)
кажется проще, чем параметр _Myfirst, я использовал & для просмотра необработанного буфера в окне памяти
В vs 2015 я не мог получить ни одного из этих рабочих
Итак, я написал немного кода
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
в основном то, что я сделал, было преобразовано вектором в строку. У меня был вектор вектора, поэтому мне нужно было заполнить строковый вектор.
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
надеюсь, что это помогло.
Самый простой способ - подготовить указатель для просмотра такой переменной.
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, но это не отображало данные массива.
Если вы можете использовать «Натвис», это решит ваши проблемы.
Это «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<*>">
<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>
Спасибо, не использовал natvis, но использовал выражение указателя в окне Watch, добавив суффикс массива: a._Mypair._Myval2._Myfirst, 10 (замените 10 на размер вектора). Кстати, это единственный ответ, в котором упоминаются _Mypair и _Myval2, может быть, они появились в VS 2015?
Это может быть опубликовано как ответ
Для тех, кому лень переходить по ссылке, решение -
((v)._Myfirst)[index].