¿Hay alguna manera de "ver" el contenido (o tamaño) de un estándar :: vector de gdb?
Suponiendo que está usando GCC, puntos de observación establecidos en theVector->_M_impl._M_start
y _M_finish
. Si está utilizando alguna otra implementación de std :: vector, ajuste en consecuencia.
Ejemplo:
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
}
g++ -g t.cc
gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x40090f: file t.cc, line 5.
Temporary breakpoint 1, main() at t.cc:5
5 std::vector<int> v;
(gdb) n
7 v.push_back(1);
(gdb) p v._M_impl._M_start
$1 = (int *) 0x0
(gdb) p v._M_impl._M_finish
$2 = (int *) 0x0
(gdb) p &v._M_impl._M_finish
$3 = (int **) 0x7fffffffd878
(gdb) watch *$3
Hardware watchpoint 2: *$3
(gdb) p &v._M_impl._M_start
$4 = (int **) 0x7fffffffd870
(gdb) watch *$4
Hardware watchpoint 3: *$4
(gdb) c
Hardware watchpoint 3: *$4
Old value = (int *) 0x0
New value = (int *) 0x604010
std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:365
365 this->_M_impl._M_finish = __new_finish;
(gdb) bt
#0 std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:365
#1 0x0000000000400a98 in std::vector<int, std::allocator<int> >::push_back (this=0x7fffffffd870, [email protected]) at /usr/include/c++/4.4/bits/stl_vector.h:741
#2 0x0000000000400935 in main() at t.cc:7
(gdb) c
Hardware watchpoint 2: *$3
Old value = (int *) 0x0
New value = (int *) 0x604014
std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:366
366 this->_M_impl._M_end_of_storage = __new_start + __len;
(gdb) bt
#0 std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:366
#1 0x0000000000400a98 in std::vector<int, std::allocator<int> >::push_back (this=0x7fffffffd870, [email protected]) at /usr/include/c++/4.4/bits/stl_vector.h:741
#2 0x0000000000400935 in main() at t.cc:7
... etc...
Se puede aislar y definir las partes de código entre los que el aumento de tamaño sucede y proporcionar un poco de más información (por ejemplo, ¿cuál es tu tipo personalizado, por sí mismo no asignar memoria, etc.)? Todavía podría colocar un punto de interrupción dentro del allocate() del vector ya que std :: vector debería tener una implementación de plantilla solamente, por lo que la fuente debe ser accesible. –
Sé dónde ocurre el aumento de tamaño, pero cuando la función de tamaño es llamada en otro momento por otra función, informa su tamaño como 0, y parece que no puedo averiguar dónde. El vector contiene punteros a una estructura de datos que no hace explícitamente new/delete. – endbegin
Entonces tal vez sería útil si nos hubiera mostrado algún código sobre esa área en particular. De lo contrario (y con respecto a su comentario a la primera respuesta publicada) mi clang vudú solo me muestra silencio; o) –