español - map c++
Mostrar iteradores de STL sin referencias en gdb (5)
Así es como lo hago:
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) list
1 #include <iostream>
2 #include <map>
3
4 int main()
5 {
6 std::map<int, int> a;
7 a[10] = 9;
8 std::map<int, int>::iterator it = a.begin();
9 ++it;
10 }
(gdb) b test.cpp:9
Breakpoint 1 at 0x8048942: file test.cpp, line 9.
(gdb) r
Starting program: /home/js/cpp/a.out
Breakpoint 1, main () at test.cpp:9
9 ++it;
(gdb) set print pretty on
(gdb) p it
$1 = {
_M_node = 0x94fa008
}
(gdb) p *it
$2 = (class std::pair<const int, int> &) @0x94fa018: {
first = 10,
second = 9
}
(gdb)
Tengo un iterador para un elemento de mapa, y me gustaría que gdb me muestre los valores de los elementos "primero" y "segundo" de ese iterador. Por ejemplo:
std::map<int,double> aMap;
...fill map...
std::map<int,double>::const_iterator p = aMap.begin();
Puedo usar p.primer y p.segundo en el código, pero no puedo verlos en gdb. Por lo que vale, en dbx uno podría hacer algo como "imprimir p.node.second_", pero puedo encontrar algo similar en gbd.
Estoy totalmente dispuesto a tener una función en la que pase los tipos de objeto, pero tampoco he podido hacer que funcione.
¿Algunas ideas? ¡Gracias!
p
será un iterador para std::pair<const int, double>
, entonces lo que realmente quiere es p->first
. No creo que GDB maneje bien a los operadores sobrecargados, entonces probablemente quieras p.
{algún miembro que represente el objeto pair
} .first
. Existe documentación de Doxygen para libstdc ++, por lo que puede averiguar qué miembro desea, en este caso parece ser ((_Rb_tree_node<pair<const int, double> >*)(p._M_node))-> _M_value_field.first
. Como esto es bastante detallado, verificaría si la sobrecarga del operador funciona primero (y no, no creo que haya nada más simple, lo siento). También podría intentar llamar explícitamente a los operadores, pero no creo que gcc pueda hacer eso tampoco (por ejemplo, it.operator*().first
).
EDITAR: espera, la publicación de litb parece mostrar que gcc soporta sobrecargas de operador en *. ¡Extraño, siempre encontré que no funcionó!
Puede probar Archer , una rama de desarrollo de gdb dedicada principalmente a mejorar la experiencia de depuración de C ++. Haga clic aquí para ver la demostración de la impresora bonita para C ++. Este nuevo proyecto también permite controlar gdb con script python. El desarrollador principal, Tom Tromey , escribió bastantes blogs sobre este emocionado proyecto.
Puede usar p (* it) -> second
Me doy cuenta de que esta es una vieja pregunta, pero creo que he encontrado la mejor respuesta aún. Al buscar, encontré un archivo .gdbinit que desreferencia los tipos stl muy bien. Aparentemente hay muchas versiones de esto flotando, pero esta es la más nueva que he podido encontrar:
http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt