Udostępnij za pośrednictwem


_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

  1. 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.

  2. Włącz wszystkie bity przez OR- ing zmiennej tymczasowej z odpowiednią masek bitowych (reprezentowane przez stałe manifestu w kodzie aplikacji).

  3. Wyłącz usługi bits przez i- ing zmienną z bitowe nie z odpowiednią masek bitowych.

  4. 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.

Zobacz też

Informacje

Procedury debugowania

_crtDbgFlag

_CrtCheckMemory