¿Cómo puedo imprimir los elementos de un vector C++ en GDB?


Quiero examinar el contenido de un std::vector en GDB, ¿cómo lo hago? Digamos que es un std::vector<int> en aras de la simplicidad.

Author: John Carter, 2008-10-31

4 answers

Para ver el contenido del 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, necesita 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 Eclipse C++ debugger GUI (y cualquier otro IDE que use GDB, como creo).

 70
Author: Michał Oniszczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-23 13:23:51

Con GCC 4.1.2, para imprimir la totalidad de un std::vector 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 su 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 forma breve (para una norma .gdbinit):

p P@N
 240
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-03 18:53:17

' Ver ' contenedores STL mientras se depura es un problema. Aquí hay 3 soluciones diferentes que he utilizado en el pasado, ninguna de ellas es perfecta.

1) Usar 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 soporte fantástico para ver contenedores STL. Esto funciona para anidados contenedores, pero esto es solo para su implementación para STL y no funciona si está poniendo un contenedor STL en un contenedor Boost.

3) Escriba su propia función (o método) 'print' para el elemento específico que desea imprimir mientras está depurando y use 'call' mientras está en GDB para imprimir el elemento. Tenga en cuenta que si su función de impresión no está siendo llamada en cualquier parte del código g++ hará la eliminación de código muerto y la función 'print' no será encontrada por GDB (obtendrá un mensaje diciendo que la función está en línea). Así que compila con-fkeep-inline-functions

 14
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 15:25:01

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), muestra 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'}}
 8
Author: badeip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-26 06:57:03