2008-11-26 7 views
15

Je veux examiner le contenu d'un vecteur std :: dans gdb mais je n'ai pas accès à _M_impl car j'utilise icc, pas gcc, comment le faire? Disons que c'est un vecteur std :: par souci de simplicité.Comment examiner le contenu d'un vecteur std :: dans gdb, en utilisant le compilateur icc?

Il ya une très bonne réponse here mais cela ne fonctionne pas si j'utilise icc, le message d'erreur est "Il n'y a aucun membre ou méthode nommé _M_impl". Il semble y avoir un bon jeu d'outils de débogage here mais il repose également sur _M_impl.

+2

Il est dommage que 7 ans plus tard, gdb ne puisse toujours pas afficher les conteneurs de manière raisonnable. pas même des chaînes ... –

+0

pas de restriction icc: https://stackoverflow.com/questions/253099/how-do-i-print-the-elements-of-ac-vector-in-gdb –

Répondre

10

Je ne suis pas sûr que cela fonctionne avec votre vecteur, mais cela a fonctionné pour moi.

#include <string> 
#include <vector> 

int main() { 
    std::vector<std::string> vec; 
    vec.push_back("Hello"); 
    vec.push_back("world"); 
    vec.push_back("!"); 
    return 0; 
} 

gdb:

(gdb) break source.cpp:8 
(gdb) run 
(gdb) p vec.begin() 
$1 = { 
    _M_current = 0x300340 
} 
(gdb) p $1._M_current->c_str() 
$2 = 0x3002fc "Hello" 
(gdb) p $1._M_current +1 
$3 = (string *) 0x300344 
(gdb) p $3->c_str() 
$4 = 0x30032c "world" 
0

Le modèle std::vectorguarantees the data is stored contiguously. Si vous prenez l'adresse de l'élément frontal (par exemple, &v[0], par exemple), vous pouvez accéder à tout autre élément du vecteur via un tableau de style C. Cela ne vous oblige pas à avoir le code source de la STL disponible pour votre débogueur.


Après déconner avec ce certains, il semble que v.front() et v.begin() sont susceptibles inline et GDB n'est pas les trouver. Je vais continuer à chercher, mais personnellement, je voudrais simplement ajouter la ligne int* i = &v[0] au fichier source, puis utiliser les commandes GDB sur i lors du débogage. Notez que le compilateur est libre de supprimer ce code mort. Vous devrez peut-être afficher la valeur i pour éviter cela ou simplement ne pas augmenter les optimisations.

+0

Comment puis-je accéder au premier élément? myvector [0] ne fonctionne pas dans gdb ..? –

+0

merci pour votre aide. gdb ne me laisse pas appeler myvector.front() sur la ligne d'impression? -> Impossible de trouver la méthode std :: vector > :: front –

+0

Désolé, la dernière fois que j'ai essayé d'appeler des fonctions membres dans gdb, je devais passer le nom de nom brouillé (c'est-à-dire , le symbole qui apparaît réellement dans le binaire). Je suis sûr qu'ils l'ont réparé maintenant. & v [0] est plus commun à voir que & (v.front()), j'ai donc changé la réponse pour l'utiliser. –

3

En général, quand je traite avec les classes de conteneurs dans un débogueur, je construis une référence à l'élément, comme une variable locale, il est donc facile de voir dans le débogueur , sans déblayer dans la mise en œuvre du conteneur.

Voici un exemple inventé.

vector<WeirdStructure> myWeird; 

/* push back a lot of stuff into the vector */ 

size_t z; 
for (z = 0; z < myWeird.size(); z++) 
{ 
    WeirdStructure& weird = myWeird[z]; 

    /* at this point weird is directly observable by the debugger */ 

    /* your code to manipulate weird goes here */ 
} 

C'est l'idiome que j'utilise.

Questions connexes