_CrtSetDbgFlag
Alır veya durumunu değiştirir _crtDbgFlag hata ayıklama yığın yöneticisinin (yalnızca hata ayıklama sürümü) ayırma davranışını denetlemek için kullanılan bayrak.
int _CrtSetDbgFlag(
int newFlag
);
Parametreler
- newFlag
Yeni bir durum _crtDbgFlag.
Dönüş Değeri
Önceki durumuna döndüren _crtDbgFlag.
Notlar
_CrtSetDbgFlag İşlevi sağlayan uygulamanın hata ayıklama yığın yöneticisinin bit alanları değiştirerek nasıl bellek ayırmalar izler _crtDbgFlag bayrağı. (Açma) bitlerini ayarlayarak, uygulama için uygulama çıktığında bellek sızıntıları denetleme ve herhangi bulundu, raporlama, bırakılmış belleğe bloklar öbek 's bağlantılı liste içinde kalması gerektiğini belirten ve her bellek ayırma isteği her bloğunda inceleyerek öbek bütünlüğünü doğrulama düşük bellek koşulları taklit de dahil olmak üzere özel hata ayıklama işlemleri gerçekleştirmek için hata ayıklama yığın yöneticisinin söyleyebilirsiniz. Zaman _debug tanımlı değilse, çağıran için _CrtSetDbgFlag ön-işleme sırasında kaldırılır.
Bit alanları aşağıdaki tabloda listelenmiştir _crtDbgFlag ve bunların neden olan davranış açıklanır. BITS sonuçları artan tanı çıktı ve azaltılmış program yürütme hızını ayarlamak için bu bit (varsayılan olarak kapalı) ayarlanmadı. Bunlar hakkında daha fazla bilgi için bit alanları, bkz: hata ayıklama öbek kullanarak.
Bit alanı |
Varsayılan |
Tanımlama |
---|---|---|
_CRTDBG_ALLOC_MEM_DF |
AÇIK |
on: yığın ayırma işlemleri hata ayıklama ve bellek bloğu türü tanıtıcıları, kullanımı gibi etkinleştirmek _CLIENT_BLOCK. off: yığın 's bağlantılı listesine yeni ayırmaları eklemek, ancak set engellemek için türü _IGNORE_BLOCK. Ayrıca herhangi bir yığın sıklığı onay makrolar ile birleştirilebilir. |
_CRTDBG_CHECK_ALWAYS_DF |
KAPALI |
on: Call _CrtCheckMemory her ayırma ve ayırmayı kaldırma isteği. Kapalı: _CrtCheckMemory açıkça çağrılmalıdır. Bu bayrak ayarlandığında yığın sıklığı onay makroları hiçbir etkisi yoktur. |
_CRTDBG_CHECK_CRT_DF |
KAPALI |
on: Dahil _CRT_BLOCK türlerini algılama ve bellek sızıntısı durumunda fark işlemleri. Kapalı: çalışma zamanı kitaplığı tarafından dahili olarak kullanılan bellek bu işlemleri tarafından göz ardı edilir. Ayrıca herhangi bir yığın sıklığı onay makrolar ile birleştirilebilir. |
_CRTDBG_DELAY_FREE_MEM_DF |
KAPALI |
on: Canlı bağlantılı liste bloklar halinde Öbek bellek serbest, bunları Ata _free_block yazın ve onları 0xDD bayt değeri ile doldurun. Kapalı: boşaltılmış blokları öbek 's bağlantılı listede tutmak değil. Ayrıca herhangi bir yığın sıklığı onay makrolar ile birleştirilebilir. |
_CRTDBG_LEAK_CHECK_DF |
KAPALI |
on: otomatik sızıntısı yapılan bir çağrıyla programdan çıkılırken denetimi gerçekleştirmek _CrtDumpMemoryLeaks ve onu ayrılmış tüm belleği boşaltmak uygulama başarısız olursa bir hata raporu oluşturur. Kapalı: otomatik olarak sızıntısı program Çıkışta denetimi gerçekleştirmez. Ayrıca herhangi bir yığın sıklığı onay makrolar ile birleştirilebilir. |
Yığın kontrolu sıklığı makrolar
Ne kadar sıklıkla c çalışma zamanı kitaplığı hata ayıklama öbek doğrulaması gerçekleştirir belirtebilirsiniz (_CrtCheckMemory) yapılan çağrı sayısı temel malloc, realloc, ücretsiz, ve _msize.
_CrtSetDbgFlagsonra üst 16 bitlik incelerken newFlag parametresi için bir değer. Belirtilen değer sayısıdır malloc, realloc, ücretsiz, ve _msize arasında çağırır _CrtCheckMemory çağırır. Önceden tanımlanmış dört makrolar bu amaçla sağlanır.
Makro |
_CrtCheckMemory yapılan çağrılar arasında malloc, realloc boş ve _msize yapılan çağrı sayısı |
---|---|
_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, herhangi bir yığın denetimi) |
Varsayılan olarak, _CrtCheckMemory , 1.024 her defa çağırmanız bir kez çağırılır malloc, realloc, ücretsiz, ve _msize.
Örneğin, bir yığın denetimi her 16 belirtebilirsiniz malloc, realloc, ücretsiz, ve _msize işlemleri ile aşağıdaki 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);
}
Üst 16 bit newFlag _crtdbg_check_always_df belirtildiğinde parametre yoksayılır. In this case, _CrtCheckMemory is called each time you call malloc, realloc, free, and _msize.
newFlaguygulamak için yeni durumu _crtDbgFlag ve değerleri her bit alanlarının birleşimidir.
Bayrak için yeni bir durum oluşturun ve bu bit alanlardan en az birini değiştirmek için
Call _CrtSetDbgFlag ile newFlag eşit _CRTDBG_REPORT_FLAG geçerli elde etmek için _crtDbgFlag belirtin ve döndürülen değer geçici bir değişkende depolayın.
Herhangi bir BITS tarafından Aç OR- ing (uygulama kodu içinde bildirim sabitler tarafından temsil edilen) karşılık gelen şeklin ile geçici değişken.
BITS tarafından devre dışı bırakma ve- ing bitwise bir değişkenle değil , uygun şeklin.
Call _CrtSetDbgFlag ile newFlag için yeni durumunu ayarlamak için geçici bir değişken depolanan değere eşit _crtDbgFlag.
Aşağıdaki kodda, düşük bellek benzetimini yapmak gösterilmiştir tutma tarafından koşulları öbek 's bağlantılı liste içinde bellek blok serbest ve önlemek _CrtCheckMemory her ayırma isteği üzerine çağrılan dan:
// 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önetimi ve hata ayıklama öbek genel bakış için bkz: bellek yönetimi ve hata ayıklama öbek.
Bir bayrakla devre dışı bırakmak için _CrtSetDbgFlag fonksiyonu, gereken ve bitwise değişkenle değil , bit maskesi.
newFlag Geçerli bir değer değil açıklandığı gibi bu işlevi geçersiz bir parametre işleyicisi çağırır Parametre doğrulama. Bu işlev yürütülmesine devam etmek için izin verilirse, ayarlar errno için EINVAL ve önceki durumuna döndüren _crtDbgFlag.
Gereksinimler
Yordamı |
Gerekli başlık |
---|---|
_CrtSetDbgFlag |
<crtdbg.h> |
Daha fazla uyumluluk bilgileri için bkz: Uyumluluk giriş.
Kitaplıkları
Hata ayıklama sürümlerini c çalışma zamanı kitaplıkları yalnızca.
Ö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 );
}
.NET Framework Eşdeğeri
Yoktur. Standart c işlevi çağırmak için kullanın PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.