Gibt es eine Möglichkeit, dass ein Programm vor main() abstürzt?
Antworten
Zu viele Anzeigen?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.
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).
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
- See previous answers
- Weitere Antworten anzeigen