español - ¿Cómo imprimo los elementos de un vector C++ en GDB?
function vector c++ (4)
''Observar'' los contenedores STL mientras se realiza 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 de "impresión" (o método) 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 cualquier lugar en el código g ++ se eliminará el código muerto y GDB no encontrará la función de "imprimir" (recibirá un mensaje que dice que la función está en línea). Así que compila con funciones de mantenimiento en línea
Quiero examinar el contenido de un std::vector
en GDB, ¿cómo lo hago? Digamos que es un std::vector<int>
por simplicidad.
Con GCC 4.1.2, para imprimir la totalidad 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, haz:
print *(myVector._M_impl._M_start)@N
Explicación
Probablemente esto 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 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):
p P@N
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, necesitas tener gdb 7 (lo probé en gdb 7.01) y algo de 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 la GUI del depurador de Eclipse C ++ (y cualquier otro IDE que use GDB, como creo).
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 gdb (o sourcing ~ / .gdbinit), muestre la ayuda asociada así
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 de uso:
(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''}}