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)