2009-05-28 10 views
5

Viele C/C++/Fortran und andere Programmierer wären auf "Stack Overflow" -Fehler gestoßen. Meine Frage ist, gibt es ein Tool, ein Programm oder ein einfaches Code-Snippet, mit dem wir die Größe des Stacks überwachen oder überprüfen können, während das Programm läuft? Dies kann hilfreich sein, um festzustellen, wo der Stapel angesammelt wird und schließlich einen Überlauf verursacht.Wie verhindert man einen Stacküberlauf durch Überwachung der Stackgröße?

Antwort

1

Ich weiß nicht, ob es ein Programm gibt, das es für Sie tun wird, aber Sie können einfach innerhalb einer Funktion überprüfen, wo der Stapelzeiger ist (zumindest in C und C++). Schauen Sie sich einfach den Speicherort jeder Variablen an. Es ist nicht der genaue Ort, sollte aber innerhalb weniger Bytes liegen (was für Ihre Zwecke gut ist), da lokale Variablen auf dem Stapel definiert sind. Wenn Sie den genauen Wert wollen, können Sie das durch die Montage erreichen, glaube ich.

Es kann jedoch einfacher sein, nur die Stack-Trace zu betrachten, wenn das Programm abstürzt.

+0

und, wenn Sie die Adresse einer lokalen Variablen aus dem niedrigsten Stapelrahmen (main()) in einer global zugänglichen Variable speichern, rufen Sie sie "g_my_stack_base" auf. Sie können dann die ungefähren Stapelgrößen in jeder Funktion mit ca_stack_size = my_local_function_variable - g_my_stack_base überprüfen. Hässlich aber funktioniert. Stellen Sie sicher, dass Sie char * -Zeiger verwenden, damit die Zeigerarithmetik Bytes zurückgibt. – tucuxi

1

Werfen Sie einen Blick auf diese question. Die akzeptierte Antwort zitiert Raymond Chen:

If you have to ask, you're probably doing something wrong. 

Wenn Sie es auf jeden Fall tun müssen, dann wird die Lösung/Werkzeug-Plattform abhängig sein wird. Ein einfacher Trick besteht darin, den Stapel mit einem bekannten Bytewert (z. B. AA) zu füllen und die Position des ersten Bytes zu überwachen, das diesen Wert nicht aufweist. Dadurch erhalten Sie die maximale verwendete Stapelgröße und nicht die aktuelle Stapelgröße.

+0

Ich stimme zu. Zum Beispiel füllt das DSP/BIOS-Betriebssystem einen neu zugewiesenen Stapel mit dem Muster 0xDEADBEEF und verwendet es, um die Stapelbenutzung zu verfolgen. Eine alternative Methode auf einem x86-Prozessor (nicht einfach zu implementieren, muss vom Betriebssystem durchgeführt werden) wäre, den Stack in einem separaten Segment zu platzieren. Das OS kann dann den Segmentdeskriptor auf die zugeordnete Länge einstellen, so dass ein Überlauf eine GPF verursachen würde, an welcher Stelle der Stapelinhalt nach oben verschoben und erweitert würde. Nicht sicher, ob jemand das tatsächlich umsetzen würde! –