Question

J'ai un std::vector<uint8_t> qui contient des chaînes à des décalages spécifiques. Voici un dump raccourci:

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

J'essaie d'extraire les données du décalage 136 et de les mettre dans un std::string:

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

Cependant, cela cause une erreur de segmentation à mon application. Maintenant, je suis assez novice en développement logiciel sous Linux, mais je sais comment démarrer mon application dans GDB et obtenir une trace, et j'ai suivi le problème ici:

(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

L'impression vec.size() renvoie 200 et même une boucle sur le vecteur et l'impression des données ne me causent aucun problème (exactement au-dessus de l'extrait de code qui plante!).

Je compile dans Debian avec g ++ 4.3.4. Des indicateurs sur ce que ce problème pourrait être?

Était-ce utile?

La solution

Il existe probablement dans votre code une suppression / suppression non concordante qui retarde le symptôme jusqu'à maintenant. Lorsque vous utilisez de la mémoire libérée, le système d'exploitation est libre de continuer tant qu'il le juge utile.

Essayez d’exécuter le programme dans valgrind. valgrind utilise son propre malloc et free pour pouvoir vous alerter des actualités incorrectes et des suppressions. Assurez-vous de compiler sans optimisations et avec -g 1 :

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

Assurez-vous de ne pas créer de pointeur à partir d'une variable de pile hors de portée. Par exemple, il s’agit d’une erreur courante chez les nouveaux développeurs:

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

Comme a disparu de la portée, vous renvoyez un pointeur sur la mémoire libérée.

1 À propos de <=>, à partir de la page de manuel: Produit des informations de débogage au format natif du système d’exploitation (poignées, COFF, XCOFF ou DWARF 2). GDB peut utiliser ces informations de débogage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top