Ich habe eine std::vector<uint8_t>
, die Strings bei bestimmten Offsets enthält. Hier ist eine verkürzte dump:std :: string :: assign() verursacht 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 ................
...
ich die Daten zu extrahieren, ich versuche, bei Offset 136 und steckte es in eine std::string
:
std::string x;
x.assign(vec.begin()+136, vec.begin()+168);
Dies führt jedoch zu meiner Anwendung segfault. Jetzt bin ich ziemlich neu in der Software-Entwicklung unter Linux, aber ich weiß, wie mein app in GDB starten und eine Rückverfolgung erhalten, und verfolgen das Problem hier unten:
(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
Printing vec.size()
200 zurückkehrt und sogar Schleifen über Der Vektor und das Drucken der Daten verursacht mir keine Probleme (genau über dem Crash-Snippet!).
Ich kompiliere in Debian mit g ++ 4.3.4. Irgendwelche Hinweise darauf, was dieses Problem sein könnte?
Da der Speicher bereits in einem Vektor ist, bezweifle ich das Problem liegt in neuen/löschen nicht übereinstimmen. –
Die lustige Sache ist, dass, wenn ich es durch Valgrind ausführen, keine segfault auftritt ... –
Um nicht zu tief in die Details zu gehen, versuchte ich, eine nicht vorhandene addrinfo Struktur zu löschen. Ich habe freeaddrinfo() aufgerufen, aber den Zeiger nicht auf NULL gesetzt, was dazu führte, dass ich versuchte, denselben Speicher wieder zu löschen. –