_CrtSetDbgFlag
Pobiera lub modyfikuje stan _crtDbgFlag Oznacz flagą, aby kontrolować sposób przydzielania menedżera stosu debugowania (tylko w wersji debugowania).
int _CrtSetDbgFlag( int newFlag );
Parametry
- newFlag
Nowy stan dla _crtDbgFlag.
Wartość zwracana
Zwraca poprzedni stan _crtDbgFlag.
Uwagi
_CrtSetDbgFlag Funkcja umożliwia aplikacji kontrolować, jak menedżera stosu debugowania śledzi alokacji pamięci, zmieniając pól bitowych _crtDbgFlag flagi.Ustawiając bity (Włączanie), aplikacji może wydać polecenie menedżera stosu debugowania do wykonywania operacji debugowania specjalne, w tym sprawdzanie pod kątem przeciek pamięci, gdy zakończenia aplikacji i raportowania, jeśli po znalezieniu, symulowanie warunków ilości pamięci przez określenie, czy pamięć zwalniane bloków, pozostają w połączonej listy stosu i sprawdzania integralności stosu, sprawdzając, czy każdy blok pamięci na każde żądanie alokacji.Gdy _DEBUG nie jest zdefiniowany, wywołania _CrtSetDbgFlag są usuwane podczas przetwarzania wstępnego.
Poniższa tabela zawiera listę pól bitowych dla _crtDbgFlag i opisano ich działanie.Ponieważ to ustawienie powoduje bitów zwiększone dane wyjściowe diagnostyki i szybkości wykonywania program zmniejszonej, bity te nie ustawiono (wyłączone) domyślnie.Aby uzyskać więcej informacji o tych bit pola, zobacz funkcji raportowania stanu stosu.
Pole bitowe |
Domyślny |
Opis |
---|---|---|
_CRTDBG_ALLOC_MEM_DF |
DALEJ |
Dalej: Włącz alokacji stosu debugowania i Użyj identyfikatorów typ bloku pamięci, takich jak _CLIENT_BLOCK.OFF: Dodaj nowe przydziały do połączonej listy jego stosu, ale ustawiony typ do bloku _IGNORE_BLOCK. Mogą być również połączone z żadnym z makra wyboru częstotliwość stosu. |
_CRTDBG_CHECK_ALWAYS_DF |
WYŁĄCZANIE |
ON: Wywołuje _CrtCheckMemory w każdym żądaniem alokacji i dezalokacji.OFF: _CrtCheckMemory musi zostać wywołany w sposób jawny. Częstotliwość stosu wyboru makra nie mają zastosowania podczas tej flagi. |
_CRTDBG_CHECK_CRT_DF |
WYŁĄCZANIE |
ON: Obejmują _CRT_BLOCK typów w stanie przeciek pamięci i wykrywania różnica operacji.WYŁĄCZANIE: Pamięci, do użytku wewnętrznego w bibliotece wykonywania jest ignorowana przez te operacje. Mogą być również połączone z żadnym z makra wyboru częstotliwość stosu. |
_CRTDBG_DELAY_FREE_MEM_DF |
WYŁĄCZANIE |
Dalej: Keep zwolnić pamięć bloki w stosie użytkownika związane z listy, przypisywanie ich _FREE_BLOCK wpisz i wypełniać wartości bajtów 0xDD.WYŁĄCZANIE: Nie jest przechowywana zwalniane bloki w połączonej listy stosu. Mogą być również połączone z żadnym z makra wyboru częstotliwość stosu. |
_CRTDBG_LEAK_CHECK_DF |
WYŁĄCZANIE |
ON: Przeciek automatyczne zaznaczenie w programie exit przez wywołanie wykonać _CrtDumpMemoryLeaks i wygenerować raport o błędach, jeśli aplikacja nie powiodło się zwolnić wszystkie jego przydzielono pamięci.Wyłącz: Nie automatycznie wykonuj przeciek sprawdzania, czy w chwili zakończenia programu. Mogą być również połączone z żadnym z makra wyboru częstotliwość stosu. |
Sprawdzanie stosu częstotliwość makra
Można określić, jak często biblioteki wykonawczej C przeprowadza weryfikację stosu debugowania (_CrtCheckMemory) w oparciu o liczbę wywołań malloc, realloc, wolnego, i _msize.
_CrtSetDbgFlagnastępnie bada górny 16 bitów newFlag parametru wartości.Określona wartość jest liczbą malloc, realloc, wolnego, i _msize wywołuje między _CrtCheckMemory wywołania.Cztery wstępnie zdefiniowane makra znajdują się w tym celu.
Makra |
Liczba połączeń malloc, realloc, bezpłatny i _msize między wywołaniami do _CrtCheckMemory |
---|---|
_CRTDBG_CHECK_EVERY_16_DF |
16 |
_CRTDBG_CHECK_EVERY_128_DF |
128 |
_CRTDBG_CHECK_EVERY_1024_DF |
1024 |
_CRTDBG_CHECK_DEFAULT_DF |
0 (domyślnie żadnych testów stosu) |
Domyślnie _CrtCheckMemory jest wywoływana po każdym 1024 razy wywołać malloc, realloc, wolnego, i _msize.
Na przykład można określić stosu Sprawdź co 16 malloc, realloc, wolnego, i _msize operacji z następującego kodu:
#include <crtdbg.h>
int main( )
{
int tmp;
// Get the current bits
tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
// Clear the upper 16 bits and OR in the desired freqency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;
// Set the new bits
_CrtSetDbgFlag(tmp);
}
Górny 16 bitów newFlag parametr są ignorowane, gdy określona jest _CRTDBG_CHECK_ALWAYS_DF.W takim przypadku _CrtCheckMemory jest wywoływana za każdym razem, należy wywołać malloc, realloc, wolnego, i _msize.
newFlagjest to nowy stan ma być stosowana do _crtDbgFlag i jest dla każdego pola bitowe połączenie wartości.
Zmień co najmniej jedną z tych pól bitowych i Utwórz nowy stan flagi
Wywołanie _CrtSetDbgFlag z newFlag równą _CRTDBG_REPORT_FLAG można uzyskać bieżącego _crtDbgFlag stanu i przechowywania zwracanej wartości w zmiennej tymczasowej.
Włącz wszystkie bity przez OR- ing zmiennej tymczasowej z odpowiednią masek bitowych (reprezentowane przez stałe manifestu w kodzie aplikacji).
Wyłącz usługi bits przez i- ing zmienną z bitowe nie z odpowiednią masek bitowych.
Wywołanie _CrtSetDbgFlag z newFlag taki sam, jak wartość przechowywana w zmiennej tymczasowej można ustawić nowy stan dla _crtDbgFlag.
Poniższy kod pokazuje, jak symulować ilości pamięci warunki utrzymując zwalniane bloków pamięci w połączonej listy stosu i zapobiegać _CrtCheckMemory z wywoływana w każdym żądaniem alokacji:
// Get the current state of the flag
// and store it in a temporary variable
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
// Turn On (OR) - Keep freed memory blocks in the
// heap's linked list and mark them as freed
tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
// Turn Off (AND) - prevent _CrtCheckMemory from
// being called at every allocation request
tmpFlag &= ~_CRTDBG_CHECK_ALWAYS_DF;
// Set the new state for the flag
_CrtSetDbgFlag( tmpFlag );
Aby zapoznać się z omówieniem zarządzania pamięcią i stosu debugowania, zobacz Szczegóły dotyczące stosu debugowania CRT.
Aby wyłączyć flagi z _CrtSetDbgFlag funkcji, należy i zmienną o wartości bitowych nie z maski.
Jeśli newFlag nie jest prawidłową wartością, ta funkcja wywołuje program obsługi nieprawidłowy parametr zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli jest dozwolone wykonywanie aby kontynuować, ta funkcja ustawia errno do EINVAL i zwraca poprzedni stan _crtDbgFlag.
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
_CrtSetDbgFlag |
< crtdbg.h > |
Aby uzyskać więcej informacji o zgodności, zobacz zgodności we wprowadzeniu.
Biblioteki
Debugowanie wersje C biblioteki czasu wykonywania tylko.
Przykład
// crt_crtsetdflag.c
// compile with: /c -D_DEBUG /MTd -Od -Zi -W3 /link -verbose:lib /debug
/*
* This program concentrates on allocating and freeing memory
* blocks to test the functionality of the _crtDbgFlag flag..
*/
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main( )
{
char *p1, *p2;
int tmpDbgFlag;
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
/*
* Set the debug-heap flag to keep freed blocks in the
* heap's linked list - This will allow us to catch any
* inadvertent use of freed memory
*/
tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);
/*
* Allocate 2 memory blocks and store a string in each
*/
p1 = malloc( 34 );
p2 = malloc( 38 );
strcpy_s( p1, 34, "p1 points to a Normal allocation block" );
strcpy_s( p2, 38, "p2 points to a Client allocation block" );
/*
* Free both memory blocks
*/
free( p2 );
free( p1 );
/*
* Set the debug-heap flag to no longer keep freed blocks in the
* heap's linked list and turn on Debug type allocations (CLIENT)
*/
tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;
tmpDbgFlag &= ~_CRTDBG_DELAY_FREE_MEM_DF;
_CrtSetDbgFlag(tmpDbgFlag);
/*
* Explicitly call _malloc_dbg to obtain the filename and
* line number of our allocation request and also so we can
* allocate CLIENT type blocks specifically for tracking
*/
p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );
p2 = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );
strcpy_s( p1, 40, "p1 points to a Normal allocation block" );
strcpy_s( p2, 40, "p2 points to a Client allocation block" );
/*
* _free_dbg must be called to free the CLIENT block
*/
_free_dbg( p2, _CLIENT_BLOCK );
free( p1 );
/*
* Allocate p1 again and then exit - this will leave unfreed
* memory on the heap
*/
p1 = malloc( 10 );
}
Odpowiednik w programie .NET Framework
Nie dotyczy. Aby wywołać standardową funkcję C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz przykłady wywołania platformy.