Подтвердить что ты не робот

Проверка контейнеров STL в Visual Studio 2015

Я запускаю Visual Studio Enterprise 2015, версия 14.0.23107.0 D14REL.

При отладке программы на С++ я не вижу содержимое контейнеров STL.

У меня есть опция "Показывать необработанную структуру объектов в окнах переменных" (Tools- > Options- > Debugging- > General).

Вот пример, иллюстрирующий проблему:

#include <list>
#include <string>
#include <vector>

int main()
{
    std::string string = "test";
    std::vector<int> vector{ 4, 5, 6 };
    std::list<std::string> list{ "one", "two", "three" };
    return 0;
}

В окнах Locals или Watch я вижу следующее:

list         [...]()
vector       [...](...
  (error)    0
  (error)    0
string       {npos=4294967295}
  (error)    0
  (error)    0

Если я затем проверю параметр "Показывать необработанную структуру...", я могу правильно развернуть объекты вектора и строки, но все же не список!

Есть ли другой вариант, который я пропустил, или это подлинная ошибка в VS?

4b9b3361

Ответ 1

У меня была такая же проблема.

Вам нужно зайти в Инструменты- > Параметры- > Отладка- > Общие и снять флажок "Использовать управляемый режим совместимости" и "Использовать основной режим совместимости".

Ответ 2

У меня такая же проблема, но только если Debugger Type "Mixed" (или если мой проект содержит код С++/CLI, а тип - "Авто" ). С помощью типа отладчика "Только для родного", как std::vector в целом, так и его единственный элемент отображаются правильно.

Вы можете использовать Debugger Type "Native Only" для отладки чистой части C/С++ смешанного проекта, вы просто не можете входить в код С++/CLI.

Дополнение: если у вас возникла проблема с просмотром в собственном отладчике, вы можете прочитать это: https://msdn.microsoft.com/en-us/library/jj620914.aspx

Ответ 3

"Работает на моем ящике"... наконец... наконец-то... но конкретно должен был сделать следующие шаги:

  • Установите VS2015 Update 2, занимает около трех часов
  • Снимите флажок "Использовать режим совместимой совместимости" и "Использовать режим основной совместимости" в меню "Инструменты" | Варианты | Отладка
  • Добавьте этот переключатель reg, как указано в "Как это сделать" :

Ключ Reg:   HKCU\Software\Microsoft\VisualStudio\14.0_Config\AD7Metrics\ExpressionEvaluator\{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}\{994B45C4-E6E9-11D2-903F-00C04FA302A1} Добавьте DWORD LoadInShimManagedEE в значение 0

Теперь я могу просмотреть стандартные контейнеры , как я никогда раньше не делал до , как я делал в более ранних версиях. Большая часть нашего кода на С++ вызывается из кода С++/CLI, поэтому это исправление совершенно необходимо.

Ответ 4

Нет, это не ошибка в Visual Studio!

Microsoft Visual Studio 2005 была первой версией Visual Studio для поддержки визуализаторов отладчика, используемых для классов шаблонов.

На самом деле у вас нет визуализатора для std::<list>

Добавьте правило форматирования в файл autoexp.dat.

Здесь вы можете найти файл

%VSINSTALLDIR%\Common7\Packages\Debugger\autoexp.dat

Добавить новое правило в раздел [Visualizer].

например. Чтобы просмотреть размер списка

std::list<*,*>{
  preview
    (
      #("[list size=", $e._Mysize, "]")
    )
}

Мы получаем доступ к _Mysize члену реализации std::<list>. _Mysize дает вам количество элементов в списке.

Соответствие шаблону:

std::list<*,*> будет соответствовать std::list<int> и std::list<int,std::allocator<int> >

std::list<*,*> будет соответствовать std::list<string> и std::list<string,std::allocator<string> >

Чтобы просмотреть дочерние элементы

std::list<*,*>{
  children
  (
    #(
      first item: $e._Myhead->_Next->_Myval,
      second item: $e._Myhead->_Next->_Next->_Myval,
      [third item]: $e._Myhead->_Next->_Next->_Next->_Myval
    )
  )
}

или даже

std::list<*,*>{
  children
  (
    #list(size: $c._Mysize,
          head: $c._Myhead->_Next,
          next: _Next
    ) : $e._Myval
  )
}

Ответ 5

Для VS2015 мне пришлось изменить autoexp.dat для списка как такового:

std::list<*>{
    preview (
        #(
            "[",
            $e._Mypair._Myval2._Mysize,
            "](",
        #list(
            head: $e._Mypair._Myval2._Myhead->_Next,
            size: $e._Mypair._Myval2._Mysize,
            next: _Next
        ) : $e._Myval,
            ")"
        )
    )  

    children (
        #list(
            head: $e._Mypair._Myval2._Myhead->_Next,
            size: $e._Mypair._Myval2._Mysize,
            next: _Next
        ) : $e._Myval
    )
}    

Эти изменения произошли от проверки VS2015 stl.natvis и учета изменений, которые были внесены в различные структуры данных, отмеченные <!-- VC 2015 -->

Я также внес соответствующие изменения в другие stl-структуры, хотя буду предупрежден, что не тестировал их все

std::unique_ptr<*>{
    preview (
        #if ($e._Mypair._Myval2 == 0) (
            "empty"
        ) #else (
            #(
                "unique_ptr ",
                *$e._Mypair._Myval2
             )
        )
    )

    children (
        #if ($e._Mypair._Myval2 == 0) (
            #array(expr: 0, size: 0)
        ) #else (
            #([ptr] : $e._Mypair._Myval2)
        )
    )
}

std::_Bind<*>{
    preview (
        #(
            "bind(", $e._Mypair,
            ", ", $e._Mypair._Myval2,
            ")"
        )
    )

children (
        #(
            #([f] : $e._Mypair),
            #([bound_args] : $e._Mypair._Myval2)
            )
    )
}

std::_Mem_fn_wrap<*>{
    preview (
        ; We preview the functor returned by mem_fn() with "mem_fn(<stored member function pointer>)".
        #(
            "mem_fn(",
            $e._Pm,
            ")"
        )
    )

    children (
        ; Member function pointers have no children.
        #array(expr: 0, size: 0)
    )
}

std::_Func_impl<*>{
    preview ( $e._Mypair._Myval2 )
    children (
        #(
            #([functor] : $e._Mypair._Myval2),
            #([allocator] : $e._Mypair)
        )
    )
}

std::function<*>{
    preview (
        #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
            ; Detecting empty functions is trivial.
            "empty"
        ) #else (
            *$e._Mystorage._Ptrs[$e._Impl]
        )
    )

    children (
        #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
            ; We make empty functions appear to have no children.
            #array(expr: 0, size: 0)
        ) #else (
            #([functor and allocator] : *$e._Mystorage._ptrs[$e._Impl])
        )
    )
}
std::basic_string<char,*>{
    preview     ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,s] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,s] ))
    stringview  ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,sb] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,sb] ))

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mysize),
            #([capacity] : $e._Mypair._Myval2._Myres),
            #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
                #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize)
            ) #else (
                #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize)
            )
        )
    )
}
std::basic_string<unsigned short,*>|std::basic_string<wchar_t,*>{
    preview     ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,su] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,su] ))
    stringview  ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,sub] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,sub] ))

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mysize),
            #([capacity] : $e._Mypair._Myval2._Myres),
            #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
                #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize)
            ) #else (
                #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize)
            )
        )
    )
}
std::deque<*>{
    preview (
            #(
            "[",
            $e._Mypair._Myval2._Mysize,
            "](",
            #array(
                expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff) / $e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS],
                size: $e._Mypair._Myval2._Mysize
            ),
            ")"
        )
    )

    children (
        #(
            #array(
                expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff) / $e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS],
                size: $e._Mypair._Myval2._Mysize
            )
        )
    )
}
std::forward_list<*>{
    preview (
        #(
            "(",
            #list(
                head: $e._Mypair._Myval2._Myhead,
                next: _Next
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #list(
            head: $e._Mypair._Myval2._Myhead,
            next: _Next
        ) : $e._Myval
    )
}
std::vector<bool,*>{
    preview (
        #(
            "[",
            $e._Mysize,
            "](",
            #array(
                expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i / $e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1),
                size: $e._Mysize
            ),
            ")"
        )
    )

    children (
        #(
            #([size] : $e._Mysize),
            #([capacity] : ($e._Myvec._Mypair._Myval2._Myend - $e._Myvec._Mypair._Myval2._Myfirst) * $e._EEN_VBITS),
            #array(
                expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i / $e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1),
                size: $e._Mysize
            )
        )
    )
}
std::vector<*>{
    preview (
        #(
            "[",
                $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst,
            "](",
            #array(
                expr: $e._Mypair._Myval2._Myfirst[$i],
                size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst
            ),
            ")"
        )
    )

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst),
            #([capacity] : $e._Mypair._Myval2._Myend - $e._Mypair._Myval2._Myfirst),
            #array(
                expr: $e._Mypair._Myval2._Myfirst[$i],
                size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst
            )
        )
    )
}
std::map<*>|std::multimap<*>|std::set<*>|std::multiset<*>{
    preview (
        #(
            "[",
            $e._Mypair._Myval2._Myval2._Mysize,
            "](",
            #tree(
                head: $e._Mypair._Myval2._Myval2._Myhead->_Parent,
                skip: $e._Mypair._Myval2._Myval2._Myhead,
                left: _Left,
                right: _Right,
                size: $e._Mypair._Myval2._Myval2._Mysize
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #(
            #tree(
                head: $e._Mypair._Myval2._Myval2._Myhead->_Parent,
                skip: $e._Mypair._Myval2._Myval2._Myhead,
                left: _Left,
                right: _Right,
                size: $e._Mypair._Myval2._Myval2._Mysize
            ) : $e._Myval
        )
    )
}
std::unordered_map<*>|std::unordered_multimap<*>|std::unordered_set<*>|std::unordered_multiset<*>|stdext::hash_map<*>|stdext::hash_multimap<*>|stdext::hash_set<*>|stdext::hash_multiset<*>{
    preview (
        #(
            "[",
            $e._List._Mysize,
            "](",
            #list(
                head: $e._List._Myhead->_Next,
                size: $e._List._Mysize,
                next: _Next
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #list(
            head: $e._List._Myhead->_Next,
            size: $e._List._Mysize,
            next: _Next
            ) : $e._Myval
    )
}

Ответ 6

Были те же проблемы. Моя среда: Win 10 prof. x64, VS 2015, обновление 3, набор инструментов v140, проект С++. Я даже не мог видеть строки. Кажется, что проблема связана с обновлением или расширением.

Решение: Я сделал новую установку VS2015 на другой системе (выиграл 7 проф. X64). Это было установлено с обновлением 3 (net. install). На этой машине все работало нормально: могли видеть строки (без расширения всплывающей подсказки dbg). Для контейнеров размер отображается при перемещении, и вы можете проверять элементы. Совершенная.

В чем разница? Я не знаю. Я сравнил файлы .natvis на обоих машин и C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\autoexp.dat

Нет различий.

Таким образом, решение было довольно обычным в таких случаях: Удалить VS2015. Запустите регенератор. Переустановка. Начало. Мои старые настройки присутствовали при первом запуске и проверке отладки снова работал. Проблема решена.

Ответ 7

Я запускаю VS2015 SP3. Я потратил 2 часа, пытаясь исправить все, что сказал мне интернет. Ничего не получилось! Моим последним прибежищем была переустановка VS (это занимает много часов). Поэтому я перешел на "Установка и удаление программ" > "Microsoft Visual Studio Professional 2015". Однако вместо деинсталляции я попытался сделать "Ремонт". Я не знаю, что вызвало проблему, но исправление установки исправило ее.