отладка — Visual Studio 2013 C ++: элементы контейнера STL отображаются в отладчике

MSVS 2013 во время отладки C ++ (окна Autos и Watch) показывает только размер контейнера STL:

MSVS 2010: "[9](9,8,7,6,5,4,3,2,1)"MSVS 2013: "{ size=9 }"

Расширение строки требуется, чтобы увидеть значение элемента в MSVS 2013.
Есть ли способ заставить MSVS 2013 показывать контейнеры STL, такие как MSVS 2010, в отладчике?
Я пытался удалить stl.natvis (используется в 2013 году), но это не помогает: autoexp.dat до сих пор не используется.
Возможно ли принудительное использование MSVS 2013 autoexp.dat?
Можно ли изменить stl.natvis сценарии (построить DisplayString из значений элемента контейнера)?
Любым другим путем?

11

Решение

В качестве частичного решения вы можете добавить несколько условных DisplayString элементы информации каждого типа контейнера в .natvis файл.

Ограничением является то, что вы можете указать, что элементы только до некоторого фиксированного максимума будут отображаться в DisplayString вывод отладчика (однако все элементы по-прежнему отображаются в области расширения, которую вы получаете при нажатии на переменную + войдите в дисплей отладчика).

Например, поместите это в файл с именем %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\custom.stl.natvis:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

<Type Name="std::vector&lt;*&gt;">
<DisplayString Condition="(_Mylast - _Myfirst) >  3">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]}, {_Myfirst[2]}, ...)</DisplayString>
<DisplayString Condition="(_Mylast - _Myfirst) == 3">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]}, {_Myfirst[2]})</DisplayString>
<DisplayString Condition="(_Mylast - _Myfirst) == 2">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]})</DisplayString>
<DisplayString Condition="(_Mylast - _Myfirst) == 1">[{_Mylast - _Myfirst}] ({_Myfirst[0]})</DisplayString>
<DisplayString>{{ size={_Mylast - _Myfirst} }}</DisplayString>
<Expand>
<Item Name="[size]">_Mylast - _Myfirst</Item>
<Item Name="[capacity]">_Myend - _Myfirst</Item>
<ArrayItems>
<Size>_Mylast - _Myfirst</Size>
<ValuePointer>_Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>

</AutoVisualizer>

И в вашем следующем отладочном сеансе VS2013 C ++ векторы будут отображаться до первых трех элементов в отладчике DisplayString вывод в формате, аналогичном старому отображению autoexp.dat.

Вы можете внести очевидные дополнительные изменения в пользовательский natvis, чтобы отобразить более 3 элементов. К сожалению, вам нужно будет сделать что-то похожее для каждого типа контейнера, который вы хотите отобразить таким образом; вероятно, хорошая работа для стажера.

7

Другие решения

Я нашел один способ заставить MSVS 2012/2013 использовать autoexp.dat: set «Включить редактирование и продолжить» а также «Включить собственное редактирование и продолжить».
Он отключает «улучшения просмотра данных» (natvis) для C ++, и элементы std :: vector (std :: list, std :: map, …) отображаются в основной строке переменной (стиль MSVS 2010).
Но, все равно было бы интересно, можно ли изменить stl.natvis получить тот же результат отображения?

2

К вашему сведению, чтобы использовать autoexp.dat в VS2015, установите «Использовать собственный режим совместимости» под

Options > Debugging > General

1

Снимите флажок «Показать необработанную структуру объектов в окнах переменных» в Options > Debugging > General,

1