2012-04-10 7 views
13

Ich habe einen komplexen C++ Code.Wie debugge 'Stack smashing detected'?

Es ist ein FastCGI-Programm, mit http://althenia.net/fcgicc

Als ich es für eine looooong url fragen, ich

*** stack smashing detected ***: ./tileserve terminated 
Erreur de segmentation 

Für wirkliche Leben, es ist kein Problem, da ich noch nie so lange Urls verwenden, aber es bedeutet, dass irgendjemand meinen Server beenden könnte ... das mag ich nicht.

Gibt es ein Tool (und wie man es benutzt?), Um herauszufinden, wo das Problem auftritt?

BEARBEITEN: Gelöst

Ok gelöst.

Ich war

int len; 
char uri[200]; 

len = strlen(request.params[std::string("REQUEST_URI")].c_str()); 
printf("%d\n", len); 

if (len > 200) return 1; 

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str()); 

tun Sieht aus wie die 200 zu Höhe für den len Test war. Es fehlt eigentlich an 194.

Also habe ich:

if (len > 190) return 1; 

Nun, es ist in Ordnung.

+2

Stack-Trace kann Ihnen einen Hinweis geben. – Mahesh

+4

+1 für'Erreur de segmentation' – trojanfoe

+0

Was ist Stack trace? – user1219721

Antwort

14

Wenn Sie die Website lesen, werden Sie feststellen, dass dies ein einfacher C++ - Wrapper über eine C-Bibliothek ist.

Ein typisches Problem mit C-Bibliothek sind Überschreitungen Puffer:

#include <cstring> 
#include <cstdio> 

int main(int argc, char* argv[]) { 
    char buffer[16]; // ought to be sufficient 

    strcpy(buffer, argv[1]); 
    printf("%s", buffer); 
} 

dieses Programm Versuchen:

> ./test "a" 
a 
> ./test "abcdefghijklmnoprqstuvwxyz" 
??? 

Da der Puffer nur 16 Zeichen enthalten kann, werden die restlichen Zeichen Vergangenheit sein Ende geschrieben werden . Dies ist Stapel zerschlagen und undefined Verhalten.

Eine Reihe von Implementierungen der Laufzeitbibliothek oder Ihres Betriebssystems kann diese Situation unter bestimmten Bedingungen erkennen und das Programm beenden.

Entweder Sie tun etwas falsch oder die Bibliothek ist.

Um das Problem zu finden, können Sie Valgrind verwenden oder Ihr Programm in einem Debugger ausführen. Alternativ, wenn Ihr System dies erlaubt, haben Sie möglicherweise einen Speicherabzug in dem Moment, in dem das Programm beendet wurde. Sie können diesen Speicherabbild auch in einem Debugger anzeigen.

+0

Ja, ich verstehe, was das Problem ist. Das Problem ist es zu finden ... – user1219721

+0

@ user1219721: oups Sorry, verpasste diesen Teil. Verwenden Sie einen Debugger (in VC++ oder gdb unter Linux integriert). –

+0

Valgrind ist hier unbrauchbar, da es stapelbasierte Speicherfehler nicht erkennt - nur Heapspeicherbeschädigung. –

0

Sie können etwas wie Valgrind verwenden, oder Ihr Compiler kann statische Analysen haben, die Orte finden können, an denen Sie Puffer überlaufen könnten.

Sie können auch Ihren Code für die Verwendung von fehleranfälligen Funktionen wie strcpy überprüfen und sie durch sichere Funktionen wie strncpy ersetzen, oder besser nur Objekte verwenden, die ihren eigenen Speicher wie std :: string verwalten.