Ответ 1
У меня была такая же проблема.
Вам нужно зайти в Инструменты- > Параметры- > Отладка- > Общие и снять флажок "Использовать управляемый режим совместимости" и "Использовать основной режим совместимости".
Я запускаю 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?
У меня была такая же проблема.
Вам нужно зайти в Инструменты- > Параметры- > Отладка- > Общие и снять флажок "Использовать управляемый режим совместимости" и "Использовать основной режим совместимости".
У меня такая же проблема, но только если Debugger Type "Mixed" (или если мой проект содержит код С++/CLI, а тип - "Авто" ). С помощью типа отладчика "Только для родного", как std::vector в целом, так и его единственный элемент отображаются правильно.
Вы можете использовать Debugger Type "Native Only" для отладки чистой части C/С++ смешанного проекта, вы просто не можете входить в код С++/CLI.
Дополнение: если у вас возникла проблема с просмотром в собственном отладчике, вы можете прочитать это: https://msdn.microsoft.com/en-us/library/jj620914.aspx
"Работает на моем ящике"... наконец... наконец-то... но конкретно должен был сделать следующие шаги:
Ключ Reg: HKCU\Software\Microsoft\VisualStudio\14.0_Config\AD7Metrics\ExpressionEvaluator\{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}
Добавьте DWORD LoadInShimManagedEE
в значение 0
Теперь я могу просмотреть стандартные контейнеры , как я никогда раньше не делал до , как я делал в более ранних версиях. Большая часть нашего кода на С++ вызывается из кода С++/CLI, поэтому это исправление совершенно необходимо.
Нет, это не ошибка в 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
)
}
Для 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
)
}
Были те же проблемы. Моя среда: 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. Запустите регенератор. Переустановка. Начало. Мои старые настройки присутствовали при первом запуске и проверке отладки снова работал. Проблема решена.
Я запускаю VS2015 SP3. Я потратил 2 часа, пытаясь исправить все, что сказал мне интернет. Ничего не получилось! Моим последним прибежищем была переустановка VS (это занимает много часов). Поэтому я перешел на "Установка и удаление программ" > "Microsoft Visual Studio Professional 2015". Однако вместо деинсталляции я попытался сделать "Ремонт". Я не знаю, что вызвало проблему, но исправление установки исправило ее.