c++ - ver - Inspección de contenedores STL en la depuración de Visual Studio
ventana de depuracion visual studio (10)
Para los vectores, este hilo en los foros msdn tiene un fragmento de código para configurar un reloj en un índice vectorial que podría ayudar.
Si tengo una variable std::vector
o std::map
, y quiero ver el contenido, es un gran dolor ver el enésimo elemento mientras se depura. ¿Hay algún complemento o algún truco para facilitar la visualización de las variables del contenedor STL durante la depuración (VS2003/2005/2008)
?
Puede crear un visualizador personalizado. Consulte esto: http://www.virtualdub.org/blog/pivot/entry.php?id=120
Si desea ver más de un elemento al mismo tiempo, puede agregar una coma y la cantidad de elementos de la siguiente manera:
(v._Myfirst)[startIndex], count
Sin embargo, tenga en cuenta que el recuento debe ser una constante, no puede ser el resultado de otra expresión.
También puede hacer clic con el botón derecho en cualquier valor de su reloj y elegir "agregar reloj". Esto puede ser útil si solo necesita mirar un elemento de un mapa o conjunto.
También conduce a la solución que christopher_f publicó para los vectores - ((v) ._ Myfirst) [índice]
Visual Studio 2008, al menos para mí, muestra el contenido de los contenedores STL en el cuadro de contenido mouseover estándar.
En VS2005 y VS 2008 puede ver el contenido de los contenedores STL. Las reglas para acceder a los datos se encuentran en autoexp.dat "c: / Archivos de programa / Microsoft Visual Studio 9 / Common7 / Packages / Debugger / autoexp.dat".
AutoExp.dat está destinado a ser personalizado. Sin embargo, las defs de STL están bajo una sección llamada [Visualizador]. Si puedes descifrar el lenguaje utilizado en esa sección, más poder para ti, sin embargo, recomendaría simplemente dejar esa parte en paz.
Autoexp.dat existía en VS2003, pero no había soporte para contenedores STL ([Visualizer] no existía). En VS2003, debe navegar manualmente por la representación de datos subyacente.
Al modificar autoexp.dat, es posible agregar reglas para navegar la representación de datos de sus propios tipos para que sean más fáciles de depurar. Si haces esto, solo deberías agregar lo que está debajo de [AutoExp]. Tenga cuidado y mantenga una copia de seguridad de este archivo antes de modificarlo.
El método anteriormente mencionado [((v) ._ Myfirst) [index]] funcionará solo para contenedores específicos (std :: vector), no para todos los contenedores STL posibles. Por ejemplo, si desea ver el contenido de std :: deque, debe buscar otro método para navegar por el contenido en std :: deque.
Tal vez puedas probar la siguiente configuración similar para resolver tu problema
[Probé esta configuración solo para la versión de Visual Studio 2010 Professional instalada con el paquete de servicio de Microsoft Visual Studio 2010 1]
Paso 1: Desinstale el Service Pack 1 de Microsoft Visual Studio 2010: para el trabajo de mi proyecto, realmente no necesito el Service Pack 1, por lo que la desinstalación del Service Pack 1 no causará ningún problema en mi caso.
Paso 2: reinicia tu sistema.
Paso 3: Este paso no es necesario si no está obteniendo el error ''LINK: error fatal LNK1123: error durante la conversión a COFF: el archivo no es válido o está corrupto''. De lo contrario, navegue
Propiedad del proyecto -> Enlazador (General) -> Cambiar Habilitar enlace incremental a No (/ INCREMENTAL: NO)
Para ver el enésimo elemento de un contenedor en el depurador de Visual Studio, use:
container.operator[](n)
En vs 2015, no pude conseguir ninguno de estos trabajando
entonces, escribí un poco de código
1: tenía vector de vector de elementos largos largos
std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
vs[i].append(std::to_string(n));
});
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger
Básicamente, lo que hice fue convertir el vector en cadena. Tenía vector de vector, así que tenía vector de cadena para llenar.
2: si solo tiene un vector de elementos largos , simplemente conviértalo de la siguiente manera:
std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
s.append(std::to_string(n));
});
// now s is ready for use, for your debugger
Espero que haya ayudado.
El método más simple es que tienes que preparar un puntero para ver variables como esta.
vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".
Intenté "a._Myfirst [0]" en VisualStudio2015, pero no fue mostrar datos de matriz.
Si puede usar " natvis ", resolverá sus problemas.
Esto es "sample.natvis" para visualizar std :: datos vectoriales para Visual studio 2015.
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="std::vector<*>">
<DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
<ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>