Inspección del contenido del contenedor estándar (std :: map) con gdb
Pregunta
Suponiendo tener algo como esto:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Me gustaría poder inspeccionar el contenido del mapa que ejecuta el programa desde gdb.
Si intento usar el operador de subíndice, obtengo:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Usar el método find no produce mejores resultados:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
¿Hay alguna manera de lograr esto?
Solución
Creo que no, al menos no si su fuente está optimizada, etc. Sin embargo, hay algunas macros para gdb que pueden inspeccionar los contenedores STL por usted:
http://sourceware.org/ml/gdb/2008-02/ msg00064.html
Sin embargo, no uso esto, así que YMMV
Otros consejos
Las respuestas existentes a esta pregunta están muy desactualizadas. Con un GCC y GDB recientes, simplemente funciona TM gracias al soporte incorporado de Python en GDB 7.xy las bonitas impresoras libstdc ++ que vienen con GCC.
Para el ejemplo del OP obtengo:
(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}
Si no funciona automáticamente, verá el primer punto en el Soporte STL página de la wiki de GDB.
También puede escribir impresoras bonitas de Python para sus propios tipos, consulte Pretty Printing en el manual de GDB.
Siempre existe lo obvio: define tu propia función de prueba ... Llámalo desde gdb. Por ejemplo:
#define SHOW(X) cout << # X " = " << (X) << endl
void testPrint( map<int,int> & m, int i )
{
SHOW( m[i] );
SHOW( m.find(i)->first );
}
int
main()
{
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0; // Line 15.
}
Y:
....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD
Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb)
La stl-views.gdb
solía ser la mejor respuesta que había, pero ya no.
Esto aún no está integrado en la línea principal GDB
, pero esto es lo que obtienes usando 'archer-tromey-python' rama :
(gdb) list
1 #include <map>
2 int main(){
3 std::map<int,int> m;
4 m[1] = 2;
5 m[2] = 4;
6 return 0;
7 }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run
Breakpoint 1, main () at map.cc:6
6 return 0;
(gdb) print m
$1 = std::map with 2 elements = {
[1] = 2,
[2] = 4
}
(gdb) quit
Pruebe la eliminación de referencias de contenedores STL: en esta página: http: //www.yolinux .com / TUTORIALS / GDB-Commands.html
Puede solucionar el segundo problema (Cannot evaluate function -- may be inlined
) asegurándose de que su compilador usa información de depuración DWARF-2 (o 3 o 4) cuando compila su programa. DWARF-2 incluye información en línea, por lo que debería poder utilizar cualquiera de los métodos que describió para acceder a los elementos de su std::map
contenedor.
Para compilar con información de depuración DWARF-2, agregue la bandera -gdwarf-2
a su comando de compilación.
Las respuestas anteriores están funcionando y bien. En caso de que esté usando stl-views.gdb, esta es la forma correcta de ver los mapas y elementos que contiene.
Deje que su mapa sea el siguiente:
std::map<char, int> myMap;
(gdb) pmap myMap char int
es decir pmap <variable_name> <left_element_type> <right_element_type>
para ver los elementos en el mapa.
Espero que eso ayude.