2012-02-01 9 views
6

He configurado lindas impresoras usando http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_inspect_the_contents_of_STL_containers.3F. Funciona con éxito para vectores y otros contenedores. Sin embargo no puedo llegar a inspeccionar los mapas como en el ejemplo siguiente:Impresoras bonitas para mapas que arrojan un error de tipo

#include <map> 
#include <iostream> 

using namespace std; 

int main() 
{ 
map <int, string> mapIntToString; 
map <int, int> mapInt2; 
mapIntToString.insert (map <int, string>::value_type (3, "Three")); 
mapInt2.insert (map <int, int>::value_type (3, 4)); 
return 0; 
} 

me sale el siguiente error al imprimir usando GDB:

(gdb) p mapInt2 
$1 = std::map with 1 elementsTraceback (most recent call last): 
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 422, in children 
rep_type = find_type(self.val.type, '_Rep_type') 
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 45, in find_type 
raise ValueError, "Cannot find type %s::%s" % (str(orig), name) 
ValueError: Cannot find type std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::_Rep_type 
+3

que llegó hasta descubriendo que '_Rep_type' es [al menos en algunos sistemas] un typedef privado en std :: map. perhap esa suposición no siempre es verdad. Te sugiero que avises a los desarrolladores de lindas impresoras. –

Respuesta

0

En mi sistema del tipo _Rep_type no es de tipo público std::map de (es typedef privada) para que el script está tratando de encontrar un tipo de <yourmap>._M_t variable que es de tipo _Rep_type ...

he intentado:

typedef std::map<int,int> map_t; 
map_t m; 
m.insert(map_t::value_type(3,4)); 

después en gdb puedo imprimir la clave 3 como esto (después de la función de impresión a partir de la secuencia de comandos he vinculado a continuación):

p *(int*)(void*)(m._M_t._M_impl._M_header._M_left+1) 

Cuando el _M_t en std::map es de _Rb_tree tipo, pero el tipo no es público en el mapa (puede verlo en su encabezado map, específicamente en el archivo de encabezado <path/to/std-headers/dir/bits/stl_map.h).

No estoy seguro de si eso ayuda un poco, básicamente parece que hay un problema con la función de impresión bonita que está cargando.

acabo intentado añadir a .gdbinit cosas de GNU GDB Debugger Command Cheat Sheet from yolinux.com (Busqué en Google para gdb pretty print) y con eso me da salida razonable:

(gdb) pmap m int int 
elem[0].left: $3 = 3 
elem[0].right: $4 = 4 
+3

El hecho de que '_Rep_type' sea un typedef privado es irrelevante: GDB conoce * all * types (y typedefs) cuando la información de depuración está disponible. Y el 'pmap' es una forma muy antigua y torpe de imprimir STL. Las lindas impresoras de Python son * mucho * más bonitas (cuando funcionan ;-) –

+0

Bueno, me parece que por alguna razón mi GDB no 'conoce' estos tipos. Preferiría quedarme con las impresoras lindas de Python, pero no sé cómo solucionar este problema. '_Rep_type' es privado en stl_map.h, en mi caso. – agestrada

+0

Supongo que es un problema con el script de python como se señaló anteriormente por otros ... – stefanB

18

Qué compilador (y qué versión) usó para construir su fuente de prueba?

Supongo que no fue una versión reciente de g++. Aquí está lo que me pasa con g++ 4.4.3-4ubuntu5:

$ gdb -q ./a.out 
Reading symbols from /tmp/a.out...done. 
(gdb) b 12 
Breakpoint 1 at 0x400de3: file t.cc, line 12. 
(gdb) r 

Breakpoint 1, main() at t.cc:12 
12 return 0; 
(gdb) p mapInt2 
$1 = std::map with 1 elements = {[3] = 4} 

Actualización:

Esto es lo que me pasa por la versión: g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Veo el problema. Las instrucciones a las que ha hecho referencia son incorrectamente.

En particular, las instrucciones indican: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python, pero el problema es que el código Python llega a libstdc++internos, y por lo tanto debe coincidir estos elementos internos (esta es la razón por la que las impresoras bonitas son parte de GCC y no parte de GDB, un hecho del que se quejó bruce.banner).

Cuando usted hizo un nuevo svn co ..., se recogió una copia del código Python que ya no se adapte a sus libstdc++ internos, y eso es lo que está causando problemas.

En particular, svn log muestra que find_type se añadió aquí:

r183732 | tromey | 2012-01-30 08:25:11 -0800 (Mon, 30 Jan 2012) | 27 lines 

Eso es mucho más tardar gcc-4.4.3. Lo que se quiere hacer, entonces, es conseguir que las impresoras bonitas que coinciden con la versión de libstdc++, así:

svn co svn://gcc.gnu.org/svn/gcc/branches/gcc_4_4_3_release/libstdc++-v3/python 

Excepto comando anterior no funciona, porque gcc 4.4.3 anterior a las impresoras bonitas.

No importa, la implementación de std::map (y gran parte del resto de los componentes internos STL) no ha cambiado entre 4.4.3 y 4.6, y este comando hace trabajo:

svn co svn://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python 
+0

Cuando construyo gdb 7.3 desde el código fuente en Ubuntu 7.3 no puedo imprimir elementos stl por defecto, tengo que instalar las lindas impresoras. ¿No sientes que esto es un paso atrás? –

+0

Esto es lo que obtengo para la versión: g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 – agestrada

+0

¡Gracias ruso empleado! Tuve este problema en mi trabajo. Estamos usando gcc/g ++ que viene de fábrica con RHEL5 y estaba teniendo dificultades para seguir las instrucciones sobre cómo configurar PrettyPrinters y estaba obteniendo el mismo problema de std :: map antes de su ayuda. – Setheron

Cuestiones relacionadas