_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 _crtDbgFlag
yeni durum.
Dönüş değeri
önceki durumunu _crtDbgFlag
dö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_BLOCK bellek 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_BLOCK ayarlayı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 , , realloc
free
ve _msize
çağrılarının malloc
sayı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
, free
ve _msize
çağrılarının malloc
sayı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 malloc realloc sayı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
, , realloc
free
ve _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
, , realloc
free
ve _msize
her ç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
Geçerli
_crtDbgFlag
durumu almak için eşittir_CRTDBG_REPORT_FLAG
ilenewFlag
çağrısı_CrtSetDbgFlag
yapın ve döndürülen değeri geçici bir değişkende depolayın.Geçici değişkenin bit düzeyindeki "veya" () bit bitlerini ilgili bit maskeleriyle (
|
uygulama kodunda bildirim sabitleriyle temsil edilir) açın.Değişkenin bit tabanlı "ve" (
&
) ile diğer bitleri, uygun bit maskelerinin bit tabanlı "not" (~
) ile kapatın.için
_crtDbgFlag
yeni durumu ayarlamak için geçici değişkende depolanan değere eşit olaraknewFlag
ç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 _crtDbgFlag
dö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 );
}