gdb Impossible de trouver l’opérateur

double var1, var2; std::vector x; var1 = 1; var2 = 2; x.push_back(&var1); x.push_back(&var2); 

Lorsque je débogue ce code dans gdb et que j’essaie d’imprimer x [0] ou * x [0], j’obtiens: opérateur introuvable []. Maintenant, si j’inclus cette ligne après le push_back:

 x[0] = &var1; 

Je peux accéder à n’importe quel élément spécifique de gdb. La même chose se produit avec d’autres membres tels que front (), at (), etc. Je pense que le compilateur / éditeur de liens inclut uniquement les fonctions membres présentes dans le code source et celles que je peux utiliser dans gdb. Est-il possible d’inclure chaque fonction membre de std :: vector afin que je puisse y accéder dans gdb?

D’après ce que j’ai compris, le compilateur / éditeur de liens n’inclut que les fonctions membres présentes dans le code source et celles que je peux utiliser dans gdb.

Votre compréhension est incorrecte / incomplète.

std::vector est une classe de modèle. Sans instanciation explicite, le compilateur doit instancier uniquement les méthodes appelées (généralement un sous-ensemble de méthodes présentes dans la source).

Est-il possible d’inclure chaque fonction membre de std :: vector afin que je puisse y accéder dans gdb?

Pour un type donné T , vous devriez pouvoir explicitement instancier tout le vecteur de ce T en le demandant, par exemple:

 template class std::vector; 

Essayez d’imprimer par membre interne du vecteur.

print *(x._M_impl._M_start+0)

Ici 0 est l’index des données que vous voulez inspecter.

Inspiré de cette réponse .

Alternativement, vous pouvez utiliser l’extension GDB ci-dessous, qui passera aux champs std::vector de GNU libstdc ++ et fonctionnera ainsi que l’ operator[] soit instancié ou non.

Charger avec:

 (gdb) guile (load "the-file.scm") 

Cela crée une nouvelle commande vref :

 (gdb) vref my_vector 0 

Code (nécessite GDB construit avec le support Guile ):

 (use-modules (gdb) (ice-9 match)) (define (std::vector-ref vector index) (let* ((impl (value-field vector "_M_impl")) (start (value-field impl "_M_start"))) (value-subscript start index))) (define %vector-ref-command (make-command "vref" #:command-class COMMAND_OBSCURE #:doc "Access an element of an std::vector." #:invoke (lambda (self args tty?) (match (ssortingng-tokenize args) ((variable index) (let* ((value (std::vector-ref (parse-and-eval variable) (ssortingng->number index))) (index (history-append! value))) (format #t "$~a = ~a~%" index (value-print value))))) #t))) (register-command! %vector-ref-command)