Gibt es eine Möglichkeit, den verfügbaren Stapelspeicher zur Laufzeit zu ermitteln?

8

Ich weiß, dass die Stapelgröße fest ist. Daher können wir keine großen Objekte auf dem Stapel speichern und wir verschieben zu dynamischen Zuordnungen (z. B. malloc). Stack wird auch verwendet, wenn Funktionsaufrufe verschachtelt werden, daher vermeiden wir auch rekursive Funktionen. Gibt es eine Möglichkeit zur Laufzeit zu bestimmen, wie viel Stapelspeicher bisher verwendet wurde und wie viel noch übrig ist?

Hier nehme ich eine Linux-Umgebung (gcc-Compiler) mit x86-Architektur an.

    
vinit dhatrak 07.11.2009, 17:46
quelle

6 Antworten

2

Lesen Sie einfach% esp, und denken Sie daran, dass sein Wert sinkt. Sie kennen bereits Ihre Standardgröße aus der Umgebung sowie den Ausgangspunkt Ihrer Threads.

gcc hat eine großartige Unterstützung bei der Montage, im Gegensatz zu einigen Flocken da draußen.

    
rama-jka toti 07.11.2009, 17:53
quelle
5

Es gibt eine Pthread-API, um zu bestimmen, wo der Stapel liegt:

%Vor%

Bei i386 beginnt der Stapel unten und wächst nach oben.

Sie wissen also, dass Sie ($ ESP - StackAddress) Bytes zur Verfügung haben.

In meinem System habe ich einen Wrapper um pthread_create (), so dass jeder Thread in meiner privaten Funktion beginnt. In dieser Funktion finde ich den Stapel wie oben beschrieben, finde dann den unbenutzten Teil und initialisiere diesen Speicher dann mit einem unverwechselbaren Muster (oder "Patton", wie mein in Somerville, MA geborener Schwiegervater sagen würde). p>

Wenn ich dann wissen möchte, wie viel vom Stapel verwendet wurde, beginne ich oben und suche nach unten nach dem ersten Wert, der nicht mit meinem Muster übereinstimmt.

    
Martin Del Vecchio 09.11.2009 13:10
quelle
1

Sie können den Status des virtuellen Stack-Speicherbereichs sehen, indem Sie /proc/<pid>/smaps betrachten. Der Stapel vma wird automatisch kleiner, wenn Sie mehr Stapel-Spa verwenden. Sie können überprüfen, wie viel Stack-Platz Sie tatsächlich nutzen, indem Sie überprüfen, wie weit %esp vom oberen Limit des Stack-Bereichs auf smaps entfernt ist (wenn der Stack kleiner wird). Wahrscheinlich ist das erste Limit, das Sie treffen werden, wenn Sie zu viel Stack-Speicherplatz verwenden, der von ulimit gesetzte.

Aber denken Sie immer daran, dass diese Low-Level-Details ohne vorherige Ankündigung variieren können. Erwarten Sie nicht, dass alle Linux-Kernel-Versionen und alle glibc-Versionen dasselbe Verhalten aufweisen. Ich würde niemals mein Programm auf diese Informationen verlassen.

    
ehabkost 07.11.2009 19:30
quelle
0

Das hängt sehr von Ihrem Betriebssystem und seiner Speicherverwaltung ab. Unter Linux können Sie procfs verwenden. Es ist etwas wie / proc / $ PID / Speicher. Ich bin gerade nicht in einer Linux-Box.

GCC addiert im Allgemeinen 16 Bits für die Register (um zu dem Funktionskontext zurückzukehren, auf den verwiesen wird) zu dem Stapelrahmen. Normalerweise können Sie mehr Informationen darüber erhalten, wie das Programm genau kompiliert wird, indem Sie es zerlegen. Oder verwenden Sie -S, um die Baugruppe zu erhalten.

    
wishi 07.11.2009 17:59
quelle
0

Wenn Ihre Anwendung sicher sein muss, dass sie X MB Arbeitsspeicher verwenden kann, ist es üblich, dass der Prozess sie beim Systemstart zuweist (und nicht gestartet werden kann, wenn die Mindestanforderung nicht zugewiesen werden kann).

Dies bedeutet natürlich, dass die Anwendung ihre eigene Speicherverwaltungslogik verwenden muss.

    
diciu 07.11.2009 18:30
quelle
0

Tcl hatte zu irgendeinem Zeitpunkt einen Stack-Check, um einen Absturz aufgrund von ungekürzter Rekursion oder anderen Out-of-Stack-Problemen zu vermeiden. War nicht zu tragbar, z.B. abgestürzt auf einer der BSDs ..., aber Sie könnten versuchen, den Code zu finden, den sie verwendet haben.

    
schlenk 07.11.2009 18:44
quelle