Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » SegFault

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.08.2006, 18:14 Uhr
FunnyDingo



Hallo zusammen,

ich habe die Anwendung die ich gerade schreibe (noch im Anfangsstadium) mal unter ein wenig Last gesetzt und dann verabschiedet sich das Programm. Hab es mal mit gdb debugged und dabei kommt dies raus:

Code:
Program received signal SIGSEGV, Segmentation fault.
0xb7eedca7 in std::string::length () from /usr/lib/libstdc++.so.6

Via bt habe ich dann die stelle im Code gefunden:

C++:
vector<string> header = explode(headerString, "\r\n");
if (header[0].length() <= 0)
    return false;


Die Abfrage der länge habe ich nur mal zum testen eingebaut, da der Fehler vorher bei einem std::string.substr() aufgetreten ist. Hat jemand von euch eine Idee was dort passiern könnte? Hier mal der Code der explode-Funktion (hab sie mal irgendwo im Inet gefunden):

C++:
vector<string> explode(string s, string e) {
    
    vector<string> ret;
    int iPos = s.find(e, 0);
    int iPit = e.length();
    
    while(iPos>-1) {
        if(iPos!=0)
            ret.push_back(s.substr(0,iPos));
        s.erase(0,iPos+iPit);    // poistetaan stringistä ylimääräiset scheißet
        iPos = s.find(e, 0);    // haetaan erottimen sijainti
    }
    if(s!="")
        ret.push_back(s);
    return ret;
}

--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 15.08.2006 um 18:14 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.08.2006, 19:51 Uhr
FunnyDingo



Ok, habe den Fehler gefunden. Aufgrund eines Fehler ein paar Schritte vorher (ich weiß noch nicht genau wo) ist der String, den die explode-Funktion zerlegen soll, leer. Dadurch ist der vector leer und ein Zugriff auf header[0] schlägt natürlich fehl.

Ich habe dies nun korrigiert in dem ich vorher die Größe des vectors pürfen, aber leider hat sich nun ein neuer SegFault aufgetan.

Code:
Program received signal SIGPIPE, Broken pipe.
0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7e2b811 in send () from /lib/libc.so.6
#2  0x080525f8 in netlib::sendData (this=0x805f1b8, s=7, m=@0xbfecdfbc) at src/core/net.cpp:659
#3  0x0804a51d in enginelib::handleMessage (this=0x805f558, cookieOfUser=@0x8060784, messageToSend=@0x80607c4) at src/objects/engine.cpp:585
#4  0x080551a7 in netlib::serverListen (this=0x805f1b8) at src/core/net.cpp:312
#5  0x08059e0a in main (argc=1, argv=0xbfecf2d4) at src/core/server.cpp:140


Ich werde mich nun mal auf die Suche danach machen, aber sollte jemand von euch zufällig eine spontane Idee haben, wäre ich über einen Tipp erfreut.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.08.2006, 21:48 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi das ist kein Segfault, das ist ein Sigpipe, d.h du schreibst auf ein geschlossenes socket/file oder was auch immer.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.08.2006, 09:40 Uhr
FunnyDingo



Jupp, das habe ich gestern Nacht auch raus gefunden - da war ich erstmal auf dem falschen Weg *g*.

Habe einen Thread bei google Groups dazu gefunden (Link). In dieser Diskussion meinte jemand, dass eine Applikation, die viele Netzwerk-Verbindungen verarbeitet, den SIGPIPE ignorieren könnte, denn darauf zu reagieren würde keinen besonders großen Sinn machen.

Nun habe ich folgendes überlegt: das SIGPIPE Signal zu ignorieren und eine entsprechende Fehlerüberprüfung zu generieren. Das wäre doch der passende Zeitpunkt den Umgang mit Exceptions zu lernen (irgendwann sollte man ja mal damit anfangen ;-)
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.08.2006, 12:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi, in dem fall ists einfach so:

sigaction mit entsprechenden parametern zum ignorieren von sigpipe aufrufen (am beginn der main z.b) das deaktiviert das SIGPIPE. Nun liefert dir ein send/write auf ein geschlossenes socket/file einfach nur -1 zurück, was du dann abfragen kannst und solltest.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: