Aracılığıyla paylaş


_CrtSetDbgFlag

Hata ayıklama yığını yöneticisinin ayırma davranışını denetlemek için bayrağın _crtDbgFlag durumunu alır veya değiştirir (yalnızca hata ayıklama sürümü).

Sözdizimi

int _CrtSetDbgFlag(
   int newFlag
);

Parametreler

newFlag
için _crtDbgFlagyeni durum.

Dönüş değeri

önceki durumunu _crtDbgFlagdöndürür.

Açıklamalar

işlevi, _CrtSetDbgFlag uygulamanın hata ayıklama yığını yöneticisinin bayrağın bit alanlarını değiştirerek bellek ayırmalarını nasıl izlediğini denetlemesine _crtDbgFlag olanak tanır. Uygulama, bit alanlarını ayarlayarak hata ayıklama yığını yöneticisine özel hata ayıklama işlemleri gerçekleştirmesi için talimat verebilir. Birkaç olası işlem vardır:

  • Uygulamadan çıkıldığında bellek sızıntılarını denetleme ve varsa raporlama,
  • Boş bellek bloklarının yığının bağlı listesinde kalması gerektiğini belirterek düşük bellek koşullarının benzetimini yaparak,
  • Her ayırma isteğindeki her bellek bloğunu inceleyerek yığının bütünlüğünü doğrulama.

Tanımlanmadığında _DEBUG , çağrısı _CrtSetDbgFlag ön işleme sırasında kaldırılır.

Aşağıdaki tabloda için _crtDbgFlag bit alanları listelenip davranışları açıklanmaktadır. Bitlerin ayarlanması tanılama çıktısının artmasına ve program yürütme hızının azalmasına neden olduğundan, bu bitler varsayılan olarak ayarlanmamıştır (kapalıdır). Bu bit alanları hakkında daha fazla bilgi için bkz . Yığın durumu raporlama işlevleri.

Bit alanı Varsayılan Açıklama
_CRTDBG_ALLOC_MEM_DF AÇIK ON: Hata ayıklama yığın ayırmalarını ve gibi _CLIENT_BLOCKbellek bloğu türü tanımlayıcılarının kullanımını etkinleştirin. KAPALI: Yığının bağlı listesine yeni ayırmalar ekleyin, ancak blok türünü olarak _IGNORE_BLOCKayarlayın.

Ayrıca, yığın sıklığı denetimi makrolarından herhangi biriyle birleştirilebilir.
_CRTDBG_CHECK_ALWAYS_DF KAPALI ON: Her ayırma ve serbest bırakma isteğinde çağrısı _CrtCheckMemory . KAPALI: _CrtCheckMemory açıkça çağrılmalıdır.

Bu bayrak ayarlandığında yığın sıklığı denetimi makrolarının hiçbir etkisi olmaz.
_CRTDBG_CHECK_CRT_DF KAPALI ON: Türleri sızıntı algılama ve bellek durumu fark işlemlerine dahil edin _CRT_BLOCK . KAPALI: Çalışma zamanı kitaplığı tarafından dahili olarak kullanılan bellek bu işlemler tarafından yoksayılır.

Ayrıca, yığın sıklığı denetimi makrolarından herhangi biriyle birleştirilebilir.
_CRTDBG_DELAY_FREE_MEM_DF KAPALI AÇIN: Boş bellek bloklarını yığının bağlı listesinde tutun, türü atayın _FREE_BLOCK ve 0xDD bayt değeriyle doldurun. KAPALI: Serbest blokları yığının bağlı listesinde tutmayın.

Ayrıca, yığın sıklığı denetimi makrolarından herhangi biriyle birleştirilebilir.
_CRTDBG_LEAK_CHECK_DF KAPALI AÇIN: Program çıkışında bir çağrısı _CrtDumpMemoryLeaks aracılığıyla otomatik sızıntı denetimi gerçekleştirin ve uygulama ayrılan tüm belleği boşaltamadıysa bir hata raporu oluşturun. KAPALI: Program çıkışında otomatik olarak sızıntı denetimi yapmayın.

Ayrıca, yığın sıklığı denetimi makrolarından herhangi biriyle birleştirilebilir.

Yığın Denetimi Sıklığı Makroları

C çalışma zamanı kitaplığının , , reallocfreeve _msizeçağrılarının mallocsayısına göre hata ayıklama yığınının (_CrtCheckMemory) doğrulamasını ne sıklıkta gerçekleştireceğini belirtebilirsiniz.

_CrtSetDbgFlag ardından parametrenin üst 16 bitini newFlag bir değer için inceler. Belirtilen değer, çağrılar arasındaki _CrtCheckMemory , realloc, freeve _msize çağrılarının mallocsayısıdır. Bu amaçla önceden tanımlanmış dört makro sağlanır.

Makro Aramalar arasındaki , , ve _msize çağrılarının mallocreallocsayısı free_CrtCheckMemory
_CRTDBG_CHECK_EVERY_16_DF 16
_CRTDBG_CHECK_EVERY_128_DF 128
_CRTDBG_CHECK_EVERY_1024_DF 1024
_CRTDBG_CHECK_DEFAULT_DF 0 (varsayılan olarak yığın denetimi yoktur)

Varsayılan olarak, _CrtCheckMemory bellek işlemleri sırasında çağrılmaz. Yukarıda _CrtSetDbgFlag()gösterilen bayrakları olarak göndererek bunu değiştirebilirsiniz.

Örneğin, aşağıdaki kodla her 16 malloc, , reallocfreeve _msize işlemi için bir yığın denetimi belirtebilirsiniz:

#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 frequency
    tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

    // Set the new bits
    _CrtSetDbgFlag(tmp);
}

Parametresinin üst 16 biti newFlag belirtildiğinde _CRTDBG_CHECK_ALWAYS_DF yoksayılır. Bu durumda, _CrtCheckMemory , , reallocfreeve _msizeher çağırışınızda mallocçağrılır.

newFlag , uygulamasına uygulanacak _crtDbgFlag yeni durumdur ve bit alanlarının her biri için değerlerin bir bileşimidir.

Bu bit alanlarından birini veya daha fazlasını değiştirmek ve bayrak için yeni bir durum oluşturmak için

  1. Geçerli _crtDbgFlag durumu almak için eşittir _CRTDBG_REPORT_FLAG ile newFlag çağrısı _CrtSetDbgFlag yapın ve döndürülen değeri geçici bir değişkende depolayın.

  2. Geçici değişkenin bit düzeyindeki "veya" () bit bitlerini ilgili bit maskeleriyle (|uygulama kodunda bildirim sabitleriyle temsil edilir) açın.

  3. Değişkenin bit tabanlı "ve" (&) ile diğer bitleri, uygun bit maskelerinin bit tabanlı "not" (~) ile kapatın.

  4. için _crtDbgFlagyeni durumu ayarlamak için geçici değişkende depolanan değere eşit olarak newFlag çağrısı _CrtSetDbgFlag yapın.

Aşağıdaki kod, boş bellek bloklarını yığının bağlı listesinde tutarak düşük bellek koşullarının benzetimini yapmayı ve her ayırma isteğinde çağrılmasını önlemeyi _CrtCheckMemory gösterir:

// 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 );

Bellek yönetimine ve hata ayıklama yığınına genel bakış için bkz . CRT hata ayıklama yığını ayrıntıları.

işleviyle _CrtSetDbgFlag bir bayrağı devre dışı bırakmak için bit maskesinin bit tabanlı "not" (&) ile bit tabanlı "ve" (~) değişkenini kullanın.

Geçerli bir değer değilsenewFlag, bu işlev Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisini çağırır. Yürütmenin devam etmesi için izin verilirse, bu işlev olarak EINVAL ayarlanır errno ve önceki durumunu _crtDbgFlagdöndürür.

Gereksinimler

Yordam Gerekli başlık
_CrtSetDbgFlag <crtdbg.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Kitaplıklar

Yalnızca C çalışma zamanı kitaplıklarının sürümlerinde hata ayıklama.

Örnek

// 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 );
}

Ayrıca bkz.

Hata ayıklama yordamları
_crtDbgFlag
_CrtCheckMemory