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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
32
0
32 652
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

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

Для тех, кому лень переходить по ссылке, решение - ((v)._Myfirst)[index].

Izzy 28.11.2014 16:36

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

Я тоже, и я уверен, что VS2005 сделал то же самое.

Rob 20.09.2008 00:38

Вы можете создать собственный визуализатор Проверьте это: 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

M Katz 09.04.2012 10:28

Мне пришлось сделать (v._Myfirst + startIndex),count в VS2010 SP1

Gadi 01.07.2015 23:35

Мне пришлось сделать v._Myfirst(), count в VS2015.

Neptilo 10.08.2017 11:47

В 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, я использовал & для просмотра необработанного буфера в окне памяти

paulm 02.07.2015 15:44

В vs 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

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

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

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&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>

Перед

После

Спасибо, не использовал natvis, но использовал выражение указателя в окне Watch, добавив суффикс массива: a._Mypair._Myval2._Myfirst, 10 (замените 10 на размер вектора). Кстати, это единственный ответ, в котором упоминаются _Mypair и _Myval2, может быть, они появились в VS 2015?

hsandt 02.01.2019 14:06

Это может быть опубликовано как ответ

Deepak Kiran 24.02.2020 12:03

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