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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top