Question

Si j'ai une variable std :: vector ou std :: map et que je souhaite voir le contenu, il est très pénible de voir le nième élément alors débogage. Existe-t-il un plugin ou une astuce permettant de visualiser plus facilement les variables de conteneur STL lors du débogage (VS2003 / 2005/2008) ?

Était-ce utile?

La solution

Pour les vecteurs, cette fil sur les forums msdn contient un extrait de code permettant de définir une surveillance sur un index vectoriel susceptible de vous aider.

Autres conseils

Si vous souhaitez surveiller plusieurs éléments à la fois, vous pouvez ajouter une virgule et le nombre d'éléments de la manière suivante:

(v._Myfirst) [startIndex], count

Cependant, notez que le compte doit être une constante, il ne peut pas être le résultat d'une autre expression.

Dans VS2005 et VS 2008, vous pouvez voir le contenu des conteneurs STL. Les règles pour obtenir les données se trouvent dans autoexp.dat " c: \ Program Files \ Microsoft Visual Studio 9 \ Common7 \ Packages \ Debugger \ autoexp.dat " ;.

AutoExp.dat est destiné à être personnalisé. Cependant, les définitions STL se trouvent dans une section appelée [Visualizer]. Si vous pouvez comprendre le langage utilisé dans cette section, vous aurez plus de pouvoir, mais je vous conseillerais de laisser cette partie toute seule.

Autoexp.dat existait dans VS2003, mais les conteneurs STL n’étaient pas pris en charge ([Visualizer] n’existait pas). Dans VS2003, vous devez naviguer manuellement dans la représentation de données sous-jacente.

En modifiant autoexp.dat, il est possible d’ajouter des règles pour naviguer dans la représentation des données de vos propres types afin de faciliter leur débogage. Si vous faites cela, vous ne devriez ajouter que les éléments sous [AutoExp]. Soyez prudent et conservez une copie de sauvegarde de ce fichier avant de le modifier.

Pour afficher le nième élément d'un conteneur dans le débogueur Visual Studio, utilisez:

container.operator[](n)

Vous pouvez créer un visualiseur personnalisé. Découvrez ceci: http://www.virtualdub.org/blog/pivot /entry.php?id=120

La méthode la plus simple consiste à préparer un pointeur pour regarder une variable comme celle-ci.

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

J'ai essayé "a._Myfirst [0]". dans VisualStudio2015, mais il ne s'agissait pas d'un tableau d'affichage.

Si vous pouvez utiliser le natvis " ;, it résoudra vos problèmes.

Il s'agit de "sample.natvis". pour afficher les données vectorielles std :: pour Visual studio 2015.

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <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>

Avant entrer la description de l'image ici

Après entrer la description de l'image ici

Visual Studio 2008, du moins pour moi, affiche le contenu des conteneurs STL dans la zone de contenu standard de la souris.

Vous pouvez également cliquer avec le bouton droit de la souris sur toute valeur de votre montre et choisir "ajouter une montre". Cela peut être utile si vous n’avez besoin que de regarder un seul élément d’une carte ou d’un ensemble.

Cela conduit également à la solution publiée par christopher_f pour les vecteurs - ((v) ._ Myfirst) [index]

La méthode décrite ci-dessus [((v) ._ Myfirst) [index]] ne fonctionnera que pour un conteneur spécifique (std :: vector), mais pas pour tous les conteneurs STL possibles. Par exemple, si vous voulez voir le contenu de std :: deque, vous devez rechercher une autre méthode pour parcourir le contenu dans std :: deque.

Peut-être pouvez-vous essayer le même paramètre pour résoudre votre problème

[J'ai testé ce paramètre uniquement pour la version de Visual Studio 2010 Professional installée avec le Service Pack 1 de Microsoft Visual Studio 2010]

Étape 1: Désinstallez le Service Pack 1 de Microsoft Visual Studio 2010 - pour le travail sur mon projet, je n'ai pas vraiment besoin du Service Pack 1. Par conséquent, la désinstallation du Service Pack 1 ne posera aucun problème pour mon cas.

Étape 2: redémarrez votre système.

Étape 3: Cette étape n'est pas nécessaire si vous n'obtenez pas l'erreur 'LINK: erreur irrécupérable LNK1123: échec de la conversion en COFF: fichier non valide ou corrompu'. Sinon, parcourez

Propriété du projet - > Lieur (général) - > Définissez Activer la liaison incrémentielle sur Non (/ INCREMENTAL: NO)

En vs 2015, je ne pouvais obtenir aucun de ces travaux

Donc, j'ai écrit un peu de code

1: j'avais le vecteur du vecteur des éléments longs et longs

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

En gros, ce que j'ai fait a été converti en vecteur en chaîne J'avais un vecteur de vecteur donc j'avais un vecteur de chaîne à remplir.

2: si vous venez de créer un vecteur d'éléments longs et longs , convertissez-le simplement comme ci-dessous:

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

espérons que cela vous a aidé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top