2008-10-31 20 views
185

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?

+3

Pregunta similar: http: // stackoverflow .com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb (el enlace en la respuesta es muy interesante). –

+0

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

+0

No específico del vector: https://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb –

Respuesta

68

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).

+8

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

230

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] 
+3

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ó). –

+2

Además, si solo desea un elemento de vector en particular, myVector._M_impl._M_start + n (para el enésimo elemento) – mariner

+1

No funciona para mí. 'No se puede evaluar la función: puede estar en línea' – wallyk

13

'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

+6

Ese enlace es un 404. – kristopolous

+1

http://clith.com/gdb_stl_utils/ – swalog

6

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

¡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

Cuestiones relacionadas