Ermitteln des Stack-Speicherplatzes mit Visual Studio

7

Ich programmiere in C in Visual Studio 2005. Ich habe ein Multi-Thread-Programm, aber das ist hier nicht besonders wichtig.

Wie kann ich (ungefähr) bestimmen, wie viel Stapelspeicherplatz meine Threads verwenden?

Die Technik, die ich verwenden wollte, ist, den Stapelspeicher auf einen vorbestimmten Wert zu setzen, sagen wir 0xDEADBEEF, das Programm für eine lange Zeit laufen zu lassen, das Programm zu pausieren und den Stapel zu untersuchen.

Wie lese und schreibe ich Stapelspeicher mit Visual Studio?

EDIT: Siehe zum Beispiel "So ermitteln Sie die maximale Stack-Nutzung." Diese Frage bezieht sich auf ein eingebettetes System, aber hier versuche ich, die Antwort auf einem normalen PC zu bestimmen.

    
JXG 16.11.2009, 08:48
quelle

4 Antworten

15

Windows stellt den Stapelspeicher nicht sofort fest; Stattdessen reserviert es den Adressraum dafür und bestätigt es Seite für Seite, wenn auf es zugegriffen wird. Lesen Sie diese Seite , um weitere Informationen zu erhalten.

Der Stack-Adressraum besteht daher aus drei zusammenhängenden Bereichen:

  • Reservierter aber nicht festgeschriebener Speicher, der für das Stack-Wachstum verwendet werden kann (wurde aber noch nie aufgerufen);
  • Guard-Seite, auf die noch nie zugegriffen wurde, und dazu dient, das Stack-Wachstum auszulösen, wenn auf sie zugegriffen wird;
  • Engagierter Speicher, d. h. Stapelspeicher, auf den der Thread jemals zugegriffen hat.

Dadurch können wir eine Funktion erstellen, die die Stapelgröße (mit Seitengranularität) erhält:

%Vor%

Eine Sache, die Sie beachten sollten: CreateThread ermöglicht die Angabe der anfänglichen Stack-Commit-Größe (über dwStackSize -Parameter, wenn STACK_SIZE_PARAM_IS_A_RESERVATION flag nicht gesetzt ist). Wenn dieser Parameter ungleich Null ist, gibt unsere Funktion den korrekten Wert nur zurück, wenn die Stack-Nutzung größer als dwStackSize value wird.

    
atzz 17.11.2009 09:07
quelle
7

Sie können Informationen im Win32-Thread-Informationsblock

verwenden

Wenn Sie in einem Thread herausfinden möchten, wie viel Stack-Speicherplatz verwendet wird, können Sie Folgendes tun:

%Vor%     
Sergei Kurenkov 17.11.2009 07:55
quelle
1

Der Stapel funktioniert nicht so, wie Sie es erwarten. Der Stapel ist eine lineare Folge von Seiten, deren letzte (oberste) mit einem Seitenschutz-Bit markiert ist. Wenn diese Seite berührt wird, wird das Schutzbit entfernt und die Seite kann verwendet werden. Für weiteres Wachstum wird eine neue Wachseite vergeben.

Daher lautet die Antwort, die Sie möchten, dass die Gaurd-Seite zugeordnet ist. Aber die Technik, die Sie vorschlagen, würde die fragliche Seite berühren, und als Ergebnis würde es genau die Sache ungültig machen, die Sie versuchen zu messen.

Der nicht-invasive Weg, um festzustellen, ob eine (Stapel-) Seite das Schutz-Bit hat, ist über VirtualQuery() .

    
MSalters 16.11.2009 09:17
quelle
-1

Sie können die Funktion GetThreadContext () verwenden, um den aktuellen Stapelzeiger des Threads zu ermitteln. Verwenden Sie dann VirtualQuery (), um Stapelbasis für diesen Zeiger zu suchen. Wenn Sie diese beiden Zeiger abziehen, erhalten Sie die Stapelgröße für den angegebenen Thread.

    
denisenkom 17.11.2009 12:13
quelle