Frage

Ich habe eine std::vector<uint8_t>, die Strings in bestimmten Offsets enthält. Hier ist eine verkürzte dump:

...
@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 versuche, um die Daten zu extrahieren, bei 136 versetzt und in eine std::string setzen:

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

Druck vec.size() liefert 200 und sogar über den Vektor Looping und das Drucken von Daten verursacht mir keine Probleme (genau über dem Krachen Snippet!).

Ich bin Kompilieren in Debian mit g ++ 4.3.4. Alle Hinweise auf das, was das Problem sein könnte?

War es hilfreich?

Lösung

Es ist wahrscheinlich eine nicht übereinstimmen frei / löschen woanders in Ihrem Code, der das Symptom verzögert, bis jetzt. Wenn Sie freigegebene Speicher verwenden, das Betriebssystem ist frei, so lange fortzusetzen, wie es für richtig hält.

Versuchen Sie das Programm in valgrind läuft. valgrind verwendet seine eigenen malloc und frei, so dass es Ihnen falsche Nachrichten und Löschungen alarmieren können. Stellen Sie sicher, href="https://stackoverflow.com/q/8299643/834176"> zum und mit -g 1 :

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

Stellen Sie sicher, dass Sie einen Zeiger von einem Stapel Variable nicht erstellen zu tun, die den Gültigkeitsbereich verlässt. Zum Beispiel ist dies ein häufiger Fehler bei neueren Entwicklern:

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

Als hat den Gültigkeitsbereich gegangen, Sie einen Zeiger auf freigegebenen Speicher zurück.


1 Über -g von der manpage: Produce Debug-Informationen in das Betriebssystem des nativen Format (ersticht, COFF, XCOFF oder ZWERG 2). GDB kann mit diesen Debug-Informationen arbeiten.

scroll top