Para ver el contenido de vector std :: vector myVector, simplemente escriba GDB:
(gdb)print myVector
Esto producirá una salida similar a:
$1 = std::vector of length 3, capacity 4={10,20,30}
Para lograr lo anterior, debe tener gdb 7 (lo probé en gdb 7.01) y alguna impresora bonita de Python. El proceso de instalación de estos se describe en gdb wiki .
Además, después de la instalación anterior, esto funciona bien con la GUI del depurador Eclipse C ++ (y cualquier otro IDE que use GDB, como creo).
Esto funciona bien siempre que los elementos vectoriales sean directamente interpretables. Pero no ayuda si el vector contiene punteros a los elementos de interés.
wallyk
Francamente, no encuentro la página de gdb wiki particularmente legible, ¿tal vez porque está "un poco" desactualizada ahora? Por ejemplo, tuve la impresión de que el contenido sugerido de la $HOME/.gdbinitera necesaria. En este momento termino sin tal archivo y gdbmostrando correctamente el contenido de std::vector. Sin embargo, dado que durante mis intentos de "divagación" acabo de instalar y luego desinstalar cgdb, y ya lo había libstdc++5instalado, no tengo idea de por qué la impresión bonita no funcionó mientras que ahora funciona.
Enrico Maria De Angelis
257
Con GCC 4.1.2, para imprimir el conjunto de un std :: vector <int> llamado myVector, haga lo siguiente:
print*(myVector._M_impl._M_start)@myVector.size()
Para imprimir solo los primeros N elementos, haga:
print*(myVector._M_impl._M_start)@N
Explicación
Esto probablemente depende en gran medida de la versión de su compilador, pero para GCC 4.1.2, el puntero a la matriz interna es:
myVector._M_impl._M_start
Y el comando GDB para imprimir N elementos de una matriz que comienza en el puntero P es:
print P@N
O, en una forma corta (para un .gdbinit estándar):
Jeje, es algo que me ha molestado antes, así que lo busqué esta mañana y lo agregué como una nota para mí (como recomendó el propio Jeff).
John Carter
3
Además, si solo desea un elemento vectorial en particular, myVector._M_impl._M_start + n (para el enésimo elemento)
mariner
1
No funciona para mi Cannot evaluate function -- may be inlined
wallyk
1
Para imprimir un solo elemento, por ejemplo, el segundo elemento: print (myVector._M_impl._M_start) [2]
jfritz42
2
Para encontrar los nombres especiales ( _M_impletc.) para su compilador en GDB 7.0+, useprint /r myVector
Eponymous
14
'Mirar' los contenedores STL durante la depuración es un problema. Aquí hay 3 soluciones diferentes que he usado en el pasado, ninguna de ellas es perfecta.
1) Use scripts GDB de http://clith.com/gdb_stl_utils/ Estos scripts le permiten imprimir el contenido de casi todos los contenedores STL. El problema es que esto no funciona para contenedores anidados como una pila de conjuntos.
2) Visual Studio 2005 tiene un soporte fantástico para ver contenedores STL. Esto funciona para contenedores anidados pero es solo para su implementación para STL y no funciona si está colocando un contenedor STL en un contenedor Boost.
3) Escriba su propia función (o método) de 'impresión' para el elemento específico que desea imprimir durante la depuración y use 'llamar' mientras está en GDB para imprimir el elemento. Tenga en cuenta que si no se llama a su función de impresión en ninguna parte del código, g ++ eliminará el código muerto y GDB no encontrará la función de 'impresión' (recibirá un mensaje que dice que la función está en línea). Así que compila con -fkeep-inline-functions
define print_vector
if $argc ==2set $elem = $arg0.size()if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n","$arg0", $arg0.size()set $elem = $arg1 -1endprint*($arg0._M_impl._M_start + $elem)@1elseprint*($arg0._M_impl._M_start)@$arg0.size()endend
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Después de reiniciar gdb (o buscar ~ / .gdbinit), muestre la ayuda asociada de esta manera
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Respuestas:
Para ver el contenido de vector std :: vector myVector, simplemente escriba GDB:
Esto producirá una salida similar a:
Para lograr lo anterior, debe tener gdb 7 (lo probé en gdb 7.01) y alguna impresora bonita de Python. El proceso de instalación de estos se describe en gdb wiki .
Además, después de la instalación anterior, esto funciona bien con la GUI del depurador Eclipse C ++ (y cualquier otro IDE que use GDB, como creo).
fuente
$HOME/.gdbinit
era necesaria. En este momento termino sin tal archivo ygdb
mostrando correctamente el contenido destd::vector
. Sin embargo, dado que durante mis intentos de "divagación" acabo de instalar y luego desinstalarcgdb
, y ya lo habíalibstdc++5
instalado, no tengo idea de por qué la impresión bonita no funcionó mientras que ahora funciona.Con GCC 4.1.2, para imprimir el conjunto de un std :: vector <int> llamado myVector, haga lo siguiente:
Para imprimir solo los primeros N elementos, haga:
Explicación
Esto probablemente depende en gran medida de la versión de su compilador, pero para GCC 4.1.2, el puntero a la matriz interna es:
Y el comando GDB para imprimir N elementos de una matriz que comienza en el puntero P es:
O, en una forma corta (para un .gdbinit estándar):
fuente
Cannot evaluate function -- may be inlined
_M_impl
etc.) para su compilador en GDB 7.0+, useprint /r myVector
'Mirar' los contenedores STL durante la depuración es un problema. Aquí hay 3 soluciones diferentes que he usado en el pasado, ninguna de ellas es perfecta.
1) Use scripts GDB de http://clith.com/gdb_stl_utils/ Estos scripts le permiten imprimir el contenido de casi todos los contenedores STL. El problema es que esto no funciona para contenedores anidados como una pila de conjuntos.
2) Visual Studio 2005 tiene un soporte fantástico para ver contenedores STL. Esto funciona para contenedores anidados pero es solo para su implementación para STL y no funciona si está colocando un contenedor STL en un contenedor Boost.
3) Escriba su propia función (o método) de 'impresión' para el elemento específico que desea imprimir durante la depuración y use 'llamar' mientras está en GDB para imprimir el elemento. Tenga en cuenta que si no se llama a su función de impresión en ninguna parte del código, g ++ eliminará el código muerto y GDB no encontrará la función de 'impresión' (recibirá un mensaje que dice que la función está en línea). Así que compila con -fkeep-inline-functions
fuente
ponga lo siguiente en ~ / .gdbinit
Después de reiniciar gdb (o buscar ~ / .gdbinit), muestre la ayuda asociada de esta manera
Ejemplo de uso:
fuente
Un poco tarde para la fiesta, ¡así que sobre todo un recordatorio para mí la próxima vez que haga esta búsqueda!
He podido usar:
para imprimir 4 elementos (como hexadecimal) a
vec
partir devec[2]
.fuente