c++ - studio - gdb No se pudo encontrar el operador
debug visual studio code (3)
double var1, var2;
std::vector<double *> x;
var1 = 1;
var2 = 2;
x.push_back(&var1);
x.push_back(&var2);
Cuando depuro este código en gdb e intento imprimir x [0] o * x [0], obtengo: No se pudo encontrar el operador []. Ahora si incluyo esta línea después del push_back:
x[0] = &var1;
Puedo acceder a cualquier elemento específico en gdb. Lo mismo sucede con otros miembros como front (), at (), etc. Mi entendimiento es que el compilador / enlazador incluye solo las funciones miembro presentes en el código fuente y esas son las que puedo usar en gdb. ¿Hay alguna forma de incluir todas las funciones miembro de std :: vector para que pueda acceder a ellas en gdb?
Mi entendimiento es que el compilador / enlazador incluye solo las funciones miembro presentes en el código fuente y esas son las que puedo usar en gdb.
Su comprensión es incorrecta / incompleta.
std::vector
es una clase de plantilla. Sin una creación de instancias explícita, se requiere que el compilador ejemplifique solo los métodos llamados (generalmente, un subconjunto de métodos presentes en la fuente).
¿Hay alguna forma de incluir cada función miembro de std :: vector para que pueda acceder a ellas en gdb?
Para un tipo T
dado, debería poder crear una instancia explícita de todo el vector para esa T
, solicitándolo, por ejemplo:
template class std::vector<double>;
Como alternativa, puede utilizar la extensión GDB a continuación, que se insertará en los campos std::vector
de GNU libstdc ++ y, por lo tanto, funciona independientemente de si se crea una instancia del operator[]
.
Cargar con:
(gdb) guile (load "the-file.scm")
Esto crea un nuevo comando vref
:
(gdb) vref my_vector 0
Código (requiere GDB construido con soporte de 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 (string-tokenize args)
((variable index)
(let* ((value (std::vector-ref (parse-and-eval variable)
(string->number index)))
(index (history-append! value)))
(format #t "$~a = ~a~%"
index (value-print value)))))
#t)))
(register-command! %vector-ref-command)
Intente imprimir por miembro interno del vector.
print *(x._M_impl._M_start+0)
Aquí 0
es el índice de datos que desea inspeccionar.
Inspirado en esta respuesta .