2015-02-24 11 views
23

La mia domanda è piuttosto semplice e diretta: se ho per es. 1 MB di RAM assegnata allo stack del programma, posso ottenere gli indirizzi di inizio e fine, o l'inizio e la lunghezza?Posso ottenere i limiti dello stack in C/C++?

sto usando Visual Studio 2013.

+3

Penso che sia OS specifica, quindi non posso aiutarti, ma io sono interessato alla risposta. .. –

+3

http://en.wikipedia.org/wiki/Win32_Thread_Information_Block –

+0

Immagino che tu non sia realmente interessato a tutto tranne lo stack libero a sinistra, giusto? – Deduplicator

risposta

30

Si dovrebbe mettere in discussione i vostri presupposti circa il layout stack.

Forse the stack doesn't have just one top and bottom

Forse it has no fixed bottom at all

Chiaramente non c'è modo portatile per interrogare concetti che non sono portatili.

Da Visual C++, tuttavia, è possibile utilizzare l'API Win32, in base alla versione di Windows.

su Windows 8 è molto facile, basta chiamare GetCurrentThreadStackLimits

versioni precedenti devono usare VirtualQueryEx ed elaborare i risultati in qualche modo. Ottenere un indirizzo nello stack è facile, basta usare & su una variabile locale. Quindi devi trovare i limiti dell'area riservata che include quell'indirizzo. Joe Duffy ha scritto a blog post showing the details of finding the bottom address of the stack

+0

Come [Dimensioni stack thread] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686774%28v=vs.85%29 .aspx) dice, * le dimensioni iniziali e di riserva predefinite * possono essere ottenute dall'intestazione PE (non specifica * l'intestazione del modulo *). –

+0

@ivan_pozdeev: questa è la dimensione dello stack solo per il thread principale, sebbene funga anche da impostazione predefinita per i thread creati successivamente, la loro dimensione è impostata dinamicamente. E naturalmente è l'intestazione PE dell'immagine eseguibile, quella corrispondente a 'GetModuleHandle (NULL)'. –

+0

Il presupposto che Visual C++ == Win32 non sarà più [molto più lungo] (http://blogs.msdn.com/b/vcblog/archive/2014/11/12/cross-platform-mobile-development -with-visual-c.aspx) –

9

GetCurrentThreadStackLimits sembra di fare quello che stai cercando, ottenendo i limiti inferiori/superiori dello stack in indirizzi di puntatore:

ULONG_PTR lowLimit; 
ULONG_PTR highLimit; 
GetCurrentThreadStackLimits(&lowLimit, &highLimit); 

sembra che è disponibile solo su Windows 8 e Server 2012 però.

Controllare il MSDN

0

In Windows prima delle 8, implementare GetCurrentThreadStackLimits() voi stessi:

#include <windows.h> 
#if _WIN32_WINNT < 0x0602 
VOID WINAPI GetCurrentThreadStackLimits(LPVOID *StackLimit, LPVOID *StackBase) 
{ 
    NT_TIB *tib = (NT_TIB *) NtCurrentTeb(); 
    *StackLimit = tib->StackLimit; 
    *StackBase = tib->StackBase; 
} 
#endif 
+0

Dall'articolo di Joe Duffy che ho collegato nella mia risposta: * Sfortunatamente, lo 'StackLimit' viene aggiornato solo quando si toccano effettivamente le pagine nello stack, e quindi ** non è un modo affidabile per scoprire quanto rimane lo stack non eseguito * *. Il CLR usa 'kernel32! VirtualAlloc' per impegnare le pagine, non spostando effettivamente la pagina di guardia, quindi **' StackLimit' non è aggiornato come ci si sarebbe aspettato. *** Ma se leggi i commenti sotto la domanda prima di rispondere , avresti già saputo che il TIB non contiene le informazioni necessarie. –

Problemi correlati