example español c++ debugging stl vector gdb

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''}}