2009-09-14 12 views
6

Tengo un std::vector<uint8_t> que contiene cadenas en desplazamientos específicos. He aquí un vertedero acortada:std :: string :: assign() causa segfault

... 
@128 00 00 00 00 00 00 00 00 73 6F 6D 65 74 68 69 33 ........somethin 
@144 38 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ng.............. 
@160 00 00 00 00 00 00 00 00 31 2E 32 2E 33 00 00 00 ........1.2.3... 
@176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
... 

Estoy tratando de extraer los datos en el desplazamiento 136 y ponerlo en un std::string:

std::string x; 
x.assign(vec.begin()+136, vec.begin()+168); 

Esto, sin embargo, hace que mi solicitud a segfault. Ahora estoy bastante nuevo en el desarrollo de software bajo Linux, pero sí sé cómo empezar mi aplicación en el BGF y conseguir una traza, y rastreado el problema aquí abajo:

(gdb) backtrace 
#0 0xb7536d78 in ??() from /lib/i686/cmov/libc.so.6 
#1 0xb7538cd5 in malloc() from /lib/i686/cmov/libc.so.6 
#2 0xb7708957 in operator new(unsigned int)() from /usr/lib/libstdc++.so.6 
#3 0xb76e4146 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&)() from /usr/lib/libstdc++.so.6 
#4 0xb76e63b0 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int)() from /usr/lib/libstdc++.so.6 
#5 0xb76e654a in std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int)() from /usr/lib/libstdc++.so.6 
#6 0x0806d651 in std::string::_M_replace_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0xbfffe464, __i1=..., __i2=..., __k1=..., __k2=...) at /usr/include/c++/4.3/bits/basic_string.tcc:637 
#7 0x0806d26e in std::string::replace<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:1390 
#8 std::string::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (
    this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:958 
#9 myclass::somemethod (this=0x811c730, vec=...) at myclass.cpp:135 

impresión vec.size() devuelve 200 e incluso más de un bucle el vector y la impresión de los datos no me causa ningún problema (¡exactamente encima del fragmento que se cuelga!).

Estoy compilando en Debian con g ++ 4.3.4. ¿Alguna sugerencia sobre cuál podría ser este problema?

Respuesta

13

Es probable que haya un error de eliminación/eliminación en algún otro lugar de su código que esté retrasando el síntoma hasta ahora. Cuando usa memoria liberada, el sistema operativo puede continuar mientras lo crea conveniente.

Intenta ejecutar el programa en valgrind. valgrind usa su propio malloc y es gratuito para que pueda avisarle sobre noticias y borrados incorrectos. Asegúrese de que compile without optimisations y con -g :

g++ -g main.cc -o binary 
valgrind --leak-check=full ./binary 

asegurarse de que no se crea un puntero desde una variable de pila que se sale del ámbito. Por ejemplo, esto es un error común entre los nuevos desarrolladores:

int *foo() { 
    int a = 0; 
    // do something to a here 
    return &a; 
} 

Como ha ido fuera de su alcance, devuelve un puntero a memoria liberada.


Sobre -g, desde la página de manual: Producir información de depuración en el formato del sistema operativo nativo (puñaladas, COFF, XCOFF o ENANO 2). GDB puede trabajar con esta información de depuración.

+0

Dado que la memoria ya está en un vector, dudo que el problema radique en una falta de coincidencia nueva/eliminar. –

+0

Lo curioso es que si lo ejecuto a través de valgrind, no ocurre segfault ... –

+0

Para no profundizar en detalles, estaba intentando eliminar una estructura addrinfo inexistente. llamaba a freeaddrinfo() pero no establecía el puntero a NULL, esto me hizo tratar de borrar la misma memoria de nuevo. –

Cuestiones relacionadas