c++ stl map gdb

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.



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)