Блог пользователя pyloolex

Автор pyloolex, история, 8 лет назад, По-русски

Всем доброго дня!

Столкнулся с проблемой при дебаге в VS 2013 Community. Дело в том, что раньше я писал в VS 2008, очень привык к тому отладчику, а именно к разделу "watch". Он очень удобный. При наведении мышью на std::vector я видел все содержимое вектора. Тоже самое и в "watch".

Особенно удобно это в случае двумерного вектора, когда в любой момент дебага можно посмотреть на двумерный вектор как на матрицу (то есть видны все элементы). Вот скрины:

Недавно поставил 2013 Visual Studio. И все бы ничего, удобно, красиво, но нет теперь такого просмотра вектора. Вместо отображения всех элементов вылазиют всякие size, capacity, адреса в 0x системе.

Конечно, можно увидеть каждый элемент, но для этого надо раскрыть каждую строчку (при том по очереди), да и открываются они в столбик. То есть пока все откроешь, уже пропадает представление о том, где что должно стоять.

Собственно, сабж.

  1. Есть ощущение, что это можно настроить, так как в универе у меня на VS 2010 все нормально, а у друга на том же 10 вижаке такая же проблема. Если это возможно настроить, подскажите как, у меня не получилось найти.

  2. Если кто-то пишет на 2015(бесплатной), посмотрите, как у вас с отображением двумерных векторов и скажите, пожалуйста.

PS Кстати, тоже самое касается queue, string, stack, map и т. д.

Кто чем может помогите, был бы очень рад.

  • Проголосовать: нравится
  • +42
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Автокомментарий: текст был обновлен пользователем pyloolex (предыдущая версия, новая версия, сравнить).

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

Наверно, вывод этих структур зависит от используемой версии STL. Хотя вы, наверно, исп-те "родной" и он должен бы выводиться красиво.

Сомневаюсь, что есть настройка вывода таких структур.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Вот я сильно не рылся в исходном коде STL от Dinkumware, использующемся вместе с VC++, но ведь стандарт C++ же не предусматривает наличие функции-члена наподобие toString() в Java?

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Попробовал в VS 2015 Community на дефолтных настройках — все так же, как и на Ваших скриншотах.

»
8 лет назад, # |
  Проголосовать: нравится +23 Проголосовать: не нравится

В VS2015 стало очень просто добавлять свои визуализаторы — достаточно просто добавить .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>{_Mypair._Myval2._Myfirst,[_Mypair._Myval2._Mylast-_Mypair._Myval2._Myfirst]}</DisplayString>
    <Expand>      
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>
»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Самого интересует, решения не знаю, но есть пара мыслей.

Вроде как утверждается, что формат отображения должен задаваться файлом <ProgramFiles>\Microsoft Visual Studio <vs_version>\Common7\Packages\Debugger\autoexp.dat Но только вот у меня в VS2012 содержимое этого файла вроде бы адекватное, а показывает так же плохо, как и у топикстартера.

Если есть доступ к экземплярам VS, в которых имеется разное отображение -- может, имеет смысл сравнить эти самые файлы autoexp.dat этих экземпляров VS?

И, кстати, у универовских лаборантов пытались спрашивать? Вы ж говорите, что там всё настроено правильно -- может имеет смысл там и спросить? (А потом рассказать тут!)

»
8 лет назад, # |
Rev. 4   Проголосовать: нравится +3 Проголосовать: не нравится

Удалось найти кривое частичное решение. Возможно, кто-то сумеет сделать его более адекватным и удобным.

Для VS2012, берём файл C:\Program Files\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers\stl.natvis. Его строки 896--897 имеют вид:

<Type Name="std::vector&lt;bool,*&gt;">
    <DisplayString>{{ size={_Mysize} }}</DisplayString>

Меняем вторую из этих строк на

    <DisplayString>{{ sz={_Mysize} [0]={_Myfirst[0]} [1]={_Myfirst[1]} [2]={_Myfirst[2]} [3]={_Myfirst[3]} [4]={_Myfirst[4]} [5]={_Myfirst[5]} [6]={_Myfirst[6]} [7]={_Myfirst[7]}}}</DisplayString>

В результате получаем бредовое показывание ровно по восемь элементов (независимо от реального числа), но всё же показывание в одной строке и показывание в виде матрицы.

Опять-таки: если есть экземпляр VS, где STL-контейнеры показываются удобно — пожалуйста, возьмите файлы из <ProgramFiles>\Microsoft Visual Studio <version>\Common7\Packages\Debugger\Visualizers (например, сразу все) и разместите архивчик где-нибудь в общедоступном месте.