2011-11-23 16 views
19

Tengo un std :: vector como parte de una clase, que contiene un tipo personalizado. Su contenido parece haber cambiado misteriosamente desde algún lugar del programa. Tengo problemas para tratar de descubrir dónde está sucediendo esto.¿Cómo "mirar" el tamaño de un C++ std :: vector en gdb?

¿Hay alguna manera de "ver" el contenido (o tamaño) de un estándar :: vector de gdb?

Gracias.

+0

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. –

+0

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

+0

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) –

Respuesta

10

¿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... 
+0

¿Podría explicarme su método en detial ya que todavía no puedo entender su método? Muchas gracias. –

Cuestiones relacionadas