67 Stimmen

Gibt es eine Möglichkeit, dass ein C/C++-Programm vor main() abstürzt?

Gibt es eine Möglichkeit, dass ein Programm vor main() abstürzt?

2voto

knightofhorizon Punkte 133

Ich hatte das gleiche Problem. Die gefundene Ursache war: Zu viele lokale Variablen (riesige Arrays) wurden im Hauptprozess initialisiert, was dazu führte, dass die Größe der lokalen Variablen 1,5 MB überstieg.
Dies führt zu einem großen Sprung, da der Stapelzeiger recht groß ist, und das Betriebssystem erkennt diesen Sprung als ungültig und bringt das Programm zum Absturz, da er bösartig sein könnte.

Um dies zu debuggen.
1. GDB einschalten
2. Fügen Sie einen Haltepunkt bei main
3. Hauptteil demontieren
4. Prüfung auf sub $0xGGGGGG,%esp
Wenn dieser GGGGGG-Wert zu hoch ist, werden Sie das gleiche Problem wie ich haben.

Überprüfen Sie also die Gesamtgröße aller lokalen Variablen in der Hauptdatei.

1voto

crazyscot Punkte 11509

Sie haben nicht gesagt, welche Plattform/Libc. In der Embedded-Welt gibt es häufig viele Dinge, die vor der main() - weitgehend mit der Einrichtung der Plattform zu tun, die schief gehen kann. (Oder tatsächlich, wenn Sie einen funky Linker-Skript auf einem regulären OS verwenden, sind alle Wetten aus, aber ich denke, das ist ziemlich selten).

1voto

smerlin Punkte 6156

Einige Plattformabstraktionsbibliotheken überschreiben (ich persönlich kenne nur C++-Bibliotheken wie Qt oder ACE, die dies tun, aber vielleicht tun auch einige C-Bibliotheken etwas Ähnliches) "main", so dass sie ein plattformspezifisches main wie ein int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); und einige Bibliotheken einrichten, die Kommandozeilen-Args in die normalen int argc, char* argv[] und rufen dann die normale int main(int argc, char* argv[])

Natürlich können solche Bibliotheken zu einem Absturz führen, wenn sie dies nicht korrekt implementiert haben (vielleicht wegen fehlerhafter Kommandozeilen-Args).

Und für Leute, die das nicht kennen, mag das wie ein Absturz aussehen main

0voto

imix Punkte 1060

Bestes Beispiel für den Absturz eines Programms vor main für Stapel Überlauf :

int main() {
    char volatile stackoverflow[1000000000] = {0};
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X