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&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 сценарии сеанса отладки С++ будут отображаться первые три элемента в отладчике DisplayString в формате, аналогичном старому дисплею autoexp.dat.

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

Ответ 3

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

Ответ 4

FYI, чтобы использовать autoexp.dat в VS2015, установите "Использовать основной режим совместимости" в разделе

Options > Debugging > General