c++ - Inspeccionar los contenidos del contenedor estándar(std:: map) con gdb
stl (6)
Creo que no, al menos no si su fuente está optimizada, etc. Sin embargo, hay algunas macros para gdb que pueden inspeccionar contenedores STL por usted:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
Sin embargo, no uso esto, entonces YMMV
Supongamos que tenemos 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índices, 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?
El stl-views.gdb
solía ser la mejor respuesta que había, pero ya no.
Esto aún no está integrado en el GDB
principal, pero esto es lo que obtienes al usar la branch ''arquero-tromey-python'':
(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
Las respuestas existentes a esta pregunta están muy desactualizadas. Con un GCC y un GDB recientes, Just Works TM se beneficia del soporte integrado de Python en GDB 7.x y de las lindas impresoras libstdc ++ que vienen con GCC.
Para el ejemplo de OP, obtengo:
(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}
Si no funciona automáticamente, puede ver el primer punto en la página de Soporte de STL del wiki de GDB.
También puede escribir impresoras bonitas de Python para sus propios tipos, consulte Pretty Printing en el manual de GDB.
Pruebe la desreferencia 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 la información de depuración DWARF-2 (o 3 o 4) cuando compila su programa. DWARF-2 incluye información de entrada, por lo que debería poder usar cualquiera de los métodos que describió para acceder a los elementos de su contenedor std::map
.
Para compilar con información de depuración DWARF-2, agregue el -gdwarf-2
a su comando de compilación.
Siempre está lo obvio: defina su propia función de prueba ... Llámala desde gdb. P.ej:
#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)