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.
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:
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.
Sie können Informationen im Win32-Thread-Informationsblock
verwendenWenn Sie in einem Thread herausfinden möchten, wie viel Stack-Speicherplatz verwendet wird, können Sie Folgendes tun:
%Vor%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()
.
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.
Tags und Links c memory visual-studio stack memory-management