librerias - vector stl c++ ejemplos
Inspección de contenedores STL en Visual Studio 2015 (7)
Estoy ejecutando Visual Studio Enterprise 2015, versión 14.0.23107.0 D14REL.
Al depurar un programa C ++, no puedo ver el contenido de los contenedores STL.
Tengo la opción "Mostrar la estructura sin procesar de los objetos en las ventanas de variables" desactivada (Herramientas-> Opciones-> Depuración-> General).
Aquí hay un ejemplo que ilustra el problema:
#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;
}
En las ventanas Locales o Watch veo lo siguiente:
list [...]()
vector [...](...
(error) 0
(error) 0
string {npos=4294967295}
(error) 0
(error) 0
Si a continuación, marque la opción "Mostrar estructura sin procesar ...", puedo profundizar en el vector y en los objetos de cadena, pero aún no en la lista.
¿Hay alguna otra opción que me he perdido, o es esto un error genuino en VS?
"Funciona en mi caja" ... finalmente ... por fin ... pero específicamente tenía que seguir estos pasos:
- Instalar VS2015 Actualización 2 , toma alrededor de tres horas
- Desmarque las opciones "Usar el modo de compatibilidad administrado" y "Usar el modo de compatibilidad nativo" desde Herramientas | Opciones | Depuración
- Agregue este modificador de registro, como se indica en "Cómo probarlo" :
Clave de HKCU/Software/Microsoft/VisualStudio/14.0_Config/AD7Metrics/ExpressionEvaluator/{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}/{994B45C4-E6E9-11D2-903F-00C04FA302A1}
: HKCU/Software/Microsoft/VisualStudio/14.0_Config/AD7Metrics/ExpressionEvaluator/{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}/{994B45C4-E6E9-11D2-903F-00C04FA302A1}
Agregar DWORD LoadInShimManagedEE
establecido en 0
Ahora puedo ver los contenedores estándar como nunca lo había hecho antes, como solía hacer en versiones anteriores . La mayor parte de nuestro código C ++ nativo se llama desde el código C ++ / CLI, por lo que esta solución es bastante necesaria.
Estoy ejecutando VS2015 SP3. Pasé 2 horas intentando cada solución que Internet me dijo que hiciera. ¡Nada funcionó! Mi último recurso fue reinstalar VS (que lleva horas.) Así que fui a "Agregar / Quitar programas"> "Microsoft Visual Studio Professional 2015". Sin embargo, en lugar de desinstalar, intenté hacer una "Reparación". No sé qué causó el problema, pero la reparación de la instalación lo solucionó.
No, ¡esto no es un error en Visual Studio!
Microsoft Visual Studio 2005 fue la primera de las versiones de Visual Studio para admitir visualizadores de depuración utilizables para clases de plantillas.
En realidad, no tiene un visualizador para su std::<list>
Agregue una regla de formato en el archivo autoexp.dat
.
Puedes encontrar el archivo aquí
%VSINSTALLDIR%/Common7/Packages/Debugger/autoexp.dat
Agregue una nueva regla a la sección [Visualizer]
.
Por ejemplo, para ver el tamaño de la lista
std::list<*,*>{
preview
(
#("[list size=", $e._Mysize, "]")
)
}
Estamos accediendo al miembro _Mysize
de la implementación std::<list>
. _Mysize
te da la cantidad de elementos en la lista.
La coincidencia de patrones:
std::list<*,*>
coincidirá con std::list<int>
y std::list<int,std::allocator<int> >
std::list<*,*>
coincidirá con std::list<string>
y std::list<string,std::allocator<string> >
Para ver elementos de niños
std::list<*,*>{
children
(
#(
first item: $e._Myhead->_Next->_Myval,
second item: $e._Myhead->_Next->_Next->_Myval,
[third item]: $e._Myhead->_Next->_Next->_Next->_Myval
)
)
}
o incluso
std::list<*,*>{
children
(
#list(size: $c._Mysize,
head: $c._Myhead->_Next,
next: _Next
) : $e._Myval
)
}
Para VS2015, tuve que modificar autoexp.dat para la lista como tal:
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
)
}
Estos cambios se produjeron al inspeccionar el stl.natvis de VS2015 y al observar los cambios que se realizaron en varias estructuras de datos marcadas con <!-- VC 2015 -->
También realicé los cambios apropiados en otras estructuras stl, aunque ten en cuenta que no las he probado todas.
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
)
}
Tengo el mismo problema, pero solo si el tipo de depurador es "mixto" (o si mi proyecto contiene código C ++ / CLI y el tipo es "Auto"). Con Debugger Type "Native Only", tanto std :: vector como un todo y su único elemento se muestran correctamente.
Puede usar el tipo de depuración "solo nativo" para depurar la parte C / C ++ pura de un proyecto mixto, simplemente no puede ingresar al código C ++ / CLI.
Además: si tiene un problema con la visualización en el depurador nativo, le recomendamos que lea esto: https://msdn.microsoft.com/en-us/library/jj620914.aspx
Tuve el mismo problema
Debe ir a Herramientas-> Opciones-> Depuración-> General y desmarque tanto "Usar modo de compatibilidad habilitada" como "Usar modo de compatibilidad nativa".
Tuve el mismo problema. Mi entorno: gana 10 prof. x64, VS 2015, actualización 3, conjunto de herramientas v140, proyecto c ++. Incluso no podía ver cadenas adicionales. El problema parece haber sido introducido por una actualización o una extensión.
Solución: Hice una nueva instalación de VS2015 en otro sistema (ganar 7 prof. X64). Esto fue instalado con la actualización 3 (instalación de red). En esta máquina todo funcionó bien: podía ver cadenas (sin expandir la información sobre herramientas de DBG). Para los contenedores, el tamaño se muestra al pasar y se pueden inspeccionar los elementos. Perfecto.
Cuál es la diferencia ? No lo sé. Comparé los archivos .natvis en ambas máquinas y C: / Archivos de programa (x86) / Microsoft Visual Studio 14.0 / Common7 / Packages / Debugger / autoexp.dat
Sin diferencias
Por lo tanto, la solución fue bastante habitual en tales casos: Desinstalar VS2015. Ejecutar un reg limpiador Reinstalar. Comienzo. Mi configuración anterior estaba presente desde el principio y la inspección de depuración funcionó de nuevo. Problema resuelto.