c++ queue - Posso ottenere i limiti dello stack in C / C ++?





visual-c++ (4)


Dovresti mettere in dubbio le tue ipotesi sul layout dello stack.

Forse lo stack non ha solo una cima e un fondo

Forse non ha alcun fondo fisso

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

Da Visual C ++, tuttavia, è possibile utilizzare l'API Win32, a seconda della versione di Windows.

Su Windows 8 è molto semplice, basta chiamare GetCurrentThreadStackLimits

Le versioni precedenti devono utilizzare VirtualQueryEx e 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 un post sul blog che mostra i dettagli di trovare l'indirizzo inferiore dello stack

La mia domanda è piuttosto semplice e diretta: se ho ad esempio 1MB di RAM assegnata allo stack del programma, posso ottenere gli indirizzi di inizio e fine, o l'inizio e la lunghezza?

Sto usando Visual Studio 2013.




Su Windows prima delle 8, implementa GetCurrentThreadStackLimits () tu stesso:

#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



GetCurrentThreadStackLimits sembra fare ciò che stai cercando, ottenendo i limiti inferiore / superiore dello stack in indirizzi di puntatore:

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

Sembra che sia disponibile solo su Windows 8 e Server 2012.

Controlla il MSDN




La risposta per eseguire valgrind --tool=callgrind non è del tutto completa senza alcune opzioni. Di solito non vogliamo profilare 10 minuti di tempo di avvio lento con Valgrind e vogliamo profilare il nostro programma quando sta svolgendo qualche compito.

Quindi questo è quello che raccomando. Esegui prima il programma:

valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp

Ora quando funziona e vogliamo iniziare la profilazione, dovremmo eseguire in un'altra finestra:

callgrind_control -i on

Questo attiva la profilazione. Per disattivarlo e interrompere l'intera attività, potremmo utilizzare:

callgrind_control -k

Ora abbiamo alcuni file chiamati callgrind.out. * Nella directory corrente. Per vedere i risultati del profilo utilizzare:

kcachegrind callgrind.out.*

Raccomando nella prossima finestra di cliccare sull'intestazione di colonna "Self", altrimenti mostra che "main ()" è un'attività che richiede molto tempo. "Self" mostra quanto ogni funzione stessa abbia richiesto del tempo, non insieme ai dipendenti.







c++ c visual-c++