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