Quiero examinar el contenido de un std::vector
en GDB, ¿cómo lo hago? Digamos que es std::vector<int>
en aras de la simplicidad.¿Cómo imprimo los elementos de un vector C++ en GDB?
Respuesta
Para ver std :: vector vector de contenidos myvector, sólo tiene que escribir el BGF:
(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 python pretty-printer. 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 Eclipse GUI del depurador de C++ (y cualquier otro IDE usando 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
con GCC 4.1.2, para imprimir la totalidad de un std :: vector <int> llamada myVector, haga lo siguiente:
print *(myVector._M_impl._M_start)@myVector.size()
Para imprimir sólo los primeros N elementos, hacer:
print *(myVector._M_impl._M_start)@N
Explicación
Esta es probablemente depende en gran medida de la versión del compilador , Pero para GCC 4.1.2, el puntero a la matriz interna es:
myVector._M_impl._M_start
Y la orden GDB a los elementos de impresión N de una matriz a partir de puntero P es:
print [email protected]
O, en una forma corta (para una .gdbinit estándar):
p [email protected]
Hehe, es algo que me ha molestado antes, así que lo busqué esta mañana y lo agregué como una nota para mí (como el propio Jeff me recomendó). –
Además, si solo desea un elemento de vector en particular, myVector._M_impl._M_start + n (para el enésimo elemento) – mariner
No funciona para mí. 'No se puede evaluar la función: puede estar en línea' – wallyk
'Mirar' contenedores STL durante la depuración es algo de un problema. Aquí hay 3 soluciones diferentes que he usado en el pasado, ninguna de ellas es perfecta.
1) Utilice scripts GDB desde 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 fantástico soporte para ver contenedores STL. Esto funciona para contenedores anidados pero esto es para su implementación solo para STL y no funciona si está colocando un contenedor STL en un contenedor Boost.
3) Escriba su propia función 'impresión' (o método) para el elemento específico que desea imprimir durante la depuración y use 'call' mientras esté en GDB para imprimir el elemento. Tenga en cuenta que si su función de impresión no se llama en ningún lugar del código, g ++ eliminará el código muerto y GDB no encontrará la función 'imprimir' (aparecerá un mensaje que indica que la función está en línea). Así compilar con -fkeep-inline-funciones
Ese enlace es un 404. – kristopolous
http://clith.com/gdb_stl_utils/ – swalog
ponga lo siguiente en ~ /.gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
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 el BGF (o fuente ~/.gdbinit), mostrar la ayuda asociada al igual que este uso
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
Ejemplo:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}
¡gracias por el código! Supongo que hay un error tipográfico y "print * ($ arg0._M_impl._M_start + $ elem) @ 1" debe ser "print * ($ arg0._M_impl._M_start + $ arg1) @ 1"? utilizo la siguiente modificación: definen print_vector si $ argc == 2 si $ arg1> = $ arg0.size() - 1 printf "Error,% s.size() =% d, impresión último elemento: \ n", "$ arg0", arg0.size $() - 1 final de impresión * ($ arg0._M_impl._M_start + $ arg1) @ 1 demás de impresión *($arg0._M_impl._M_start)@$ arg0.size() final final – user1541776
- 1. ¿Cómo imprimo una matriz Java en gdb?
- 2. ¿Cómo eliminarías los elementos de un std :: vector en función de alguna propiedad de los elementos?
- 3. ¿Cómo insertar elementos en un vector?
- 4. múltiples elementos en un vector
- 5. ¿Cómo crear un vector binario con 1 si los elementos son parte del mismo vector?
- 6. Construcción predeterminada de elementos en un vector
- 7. C - Cómo acceder a los elementos del vector utilizando GCC SSE extensión vector
- 8. Borrando elementos de un vector
- 9. ¿Cómo "mirar" el tamaño de un C++ std :: vector en gdb?
- 10. R: eliminación de los últimos elementos de un vector
- 11. ¿Cómo imprimo un bit?
- 12. ¿Cómo obtener los primeros n elementos (en términos de frecuencia) de un vector en R?
- 13. ¿Cómo imprimo el valor completo de una cadena larga en gdb?
- 14. Rieles: ¿Cómo imprimo los parámetros de solicitud?
- 15. usando STL para encontrar todos los elementos de un vector
- 16. Eliminar un grupo particular de elementos en un vector?
- 17. Imprimir tablas C++ usando GDB
- 18. inicializando un vector de vector <doubles> C++
- 19. Cómo imprimo caracteres UTF-8 C++?
- 20. std :: elementos de vector inicializando
- 21. Reutilizando un vector en C++
- 22. cómo inicializar un vector en C++
- 23. ¿Hay alguna manera de pegar los elementos de un vector en R sin usar un bucle?
- 24. ¿Cómo funciona C++ std :: vector?
- 25. ¿Cómo obtener los elementos en un conjunto en C++?
- 26. comparar los elementos adyacentes del mismo vector (bucles evitando)
- 27. ¿Cómo imprimir valores de registro en GDB?
- 28. ¿Cómo agregar todos los elementos de una matriz String a un vector en Java?
- 29. ¿La inserción de elementos en un vector daña un puntero del vector?
- 30. En clojure, cómo aplicar una función a los elementos seleccionados en un vector [gran]
Pregunta similar: http: // stackoverflow .com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb (el enlace en la respuesta es muy interesante). –
La nueva y mejor forma de hacerlo es en esta pregunta: http://stackoverflow.com/questions/2492020/how-to-view-contents-of-stl-containers-using-gdb-7-x/2492341# 2492341 – dshepherd
No específico del vector: https://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb –