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 из значений элемента контейнера)?
Любым другим путем?
В качестве частичного решения вы можете добавить несколько условных 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<*>">
<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 элементов. К сожалению, вам нужно будет сделать что-то похожее для каждого типа контейнера, который вы хотите отобразить таким образом; вероятно, хорошая работа для стажера.
Я нашел один способ заставить MSVS 2012/2013 использовать autoexp.dat: set «Включить редактирование и продолжить» а также «Включить собственное редактирование и продолжить».
Он отключает «улучшения просмотра данных» (natvis) для C ++, и элементы std :: vector (std :: list, std :: map, …) отображаются в основной строке переменной (стиль MSVS 2010).
Но, все равно было бы интересно, можно ли изменить stl.natvis получить тот же результат отображения?
К вашему сведению, чтобы использовать autoexp.dat в VS2015, установите «Использовать собственный режим совместимости» под
Options > Debugging > General
Снимите флажок «Показать необработанную структуру объектов в окнах переменных» в Options > Debugging > General
,