Aracılığıyla paylaş


Tanı Hizmetleri

Microsoft Foundation Sınıf Kitaplığı, programlarınızda hata ayıklamayı kolaylaştıran birçok tanılama hizmeti sağlar. Bu tanılama hizmetleri, programınızın bellek ayırmalarını izlemenize, çalışma zamanında nesnelerin içeriğini döküm etmenize ve çalışma zamanında hata ayıklama iletilerini yazdırmanıza olanak sağlayan makroları ve genel işlevleri içerir. Tanılama hizmetleri için makrolar ve genel işlevler aşağıdaki kategorilerde gruplandırılır:

  • Genel tanılama makroları

  • Genel tanılama işlevleri ve değişkenleri

  • Nesne tanılama işlevleri

Bu makrolar ve işlevler, MFC'nin Hata Ayıklama ve Sürüm sürümlerinden türetilen CObject tüm sınıflar için kullanılabilir. Ancak, DEBUG_NEW ve VERIFY dışındakilerin tümü Sürüm sürümünde hiçbir şey yapmaz.

Hata ayıklama kitaplığında, ayrılan tüm bellek blokları bir dizi "koruma baytları" ile köşeli ayraç içine alınır. Bu baytlar hatalı bir bellek yazma işlemi tarafından rahatsız edilirse tanılama yordamları bir sorun bildirebilir. Satırı eklerseniz:

#define new DEBUG_NEW

uygulama dosyanızda, için new yapılan tüm çağrılar bellek ayırmanın gerçekleştiği dosya adını ve satır numarasını depolar. CMemoryState::D umpAllObjectsSince işlevi bu ek bilgileri görüntüleyerek bellek sızıntılarını belirlemenize olanak tanır. Tanılama çıktısı hakkında ek bilgi için CDumpContext sınıfına da bakın.

Ayrıca, C çalışma zamanı kitaplığı uygulamalarınızda hata ayıklamak için kullanabileceğiniz bir dizi tanılama işlevini de destekler. Daha fazla bilgi için bkz . Çalışma Zamanı Kitaplığı Başvurusunda Hata Ayıklama Yordamları .

MFC Genel Tanılama Makroları

Veri Akışı Adı Açıklama
ÖNE SÜRMEK Bir ileti yazdırır ve belirtilen ifade kitaplığın Hata ayıklama sürümünde YANLIŞ olarak değerlendirilirse programı durdurur.
ASSERT_KINDOF Bir nesnenin, belirtilen sınıfın veya belirtilen sınıftan türetilmiş bir sınıfın nesnesi olduğunu sınar.
ASSERT_VALID Bir nesnenin iç geçerliliğini, genellikle öğesinden CObjectgeçersiz kılınan üye işlevini çağırarak test ederAssertValid.
DEBUG_NEW Bellek sızıntılarını bulmaya yardımcı olmak için Hata Ayıklama modundaki tüm nesne ayırmaları için bir dosya adı ve satır numarası sağlar.
DEBUG_ONLY ASSERT'a benzer ancak ifadenin değerini test etmez; yalnızca Hata Ayıklama modunda yürütülmesi gereken kod için kullanışlıdır.
ENSURE ve ENSURE_VALID Veri doğruluğunu doğrulamak için kullanın.
THIS_FILE Derlenen dosyanın adına genişletilir.
İZ Kitaplığın printfHata Ayıklama sürümünde benzer bir özellik sağlar.
DOĞRULAMAK ASSERT'a benzer, ancak ifadeyi kitaplığın Yayın sürümünde ve Hata Ayıklama sürümünde değerlendirir.

MFC Genel Tanılama Değişkenleri ve İşlevleri

Veri Akışı Adı Açıklama
afxDump CDumpContext bilgilerini hata ayıklayıcı çıkış penceresine veya hata ayıklama terminaline gönderen genel değişken.
afxMemDF Hata ayıklama bellek ayırıcısının davranışını denetleen genel değişken.
AfxCheckError Geçirilen SCODE'un bir hata olup olmadığını görmek için kullanılan genel değişken ve varsa uygun hatayı oluşturur.
AfxCheckMemory Şu anda ayrılmış olan tüm belleğin bütünlüğünü denetler.
AfxDebugBreak Yürütmede bir kesmeye neden olur.
AfxDump Hata ayıklayıcıda çağrılırsa, hata ayıklarken bir nesnenin durumunu döküm eder.
AfxDump Hata ayıklama sırasında bir nesnenin durumunu dökümünü alan iç işlev.
AfxDumpStack Geçerli yığının görüntüsünü oluşturun. Bu işlev her zaman statik olarak bağlanır.
AfxEnableMemoryLeakDump Bellek sızıntısı dökümünü etkinleştirir.
AfxEnableMemoryTracking Bellek izlemeyi açar ve kapatır.
AfxIsMemoryBlock Bir bellek bloğunun düzgün bir şekilde ayrıldığını doğrular.
AfxIsValidAddress Bellek adres aralığının programın sınırları içinde olduğunu doğrular.
AfxIsValidString Bir dize işaretçisi geçerli olup olmadığını belirler.
AfxSetAllocHook Her bellek ayırmada bir işlevin çağrılsını etkinleştirir.

MFC Nesne Tanılama İşlevleri

Veri Akışı Adı Açıklama
AfxDoForAllClasses Çalışma zamanı türü denetimini destekleyen tüm CObjecttüretilmiş sınıflarda belirtilen bir işlevi gerçekleştirir.
AfxDoForAllObjects ile newayrılan tüm CObjecttüretilmiş nesneler üzerinde belirtilen bir işlevi gerçekleştirir.

MFC Derleme Makroları

Veri Akışı Adı Açıklama
_AFX_SECURE_NO_WARNINGS Kullanım dışı bırakılmış MFC işlevlerinin kullanımı için derleyici uyarılarını bastırır.

_AFX_SECURE_NO_WARNINGS

Kullanım dışı bırakılmış MFC işlevlerinin kullanımı için derleyici uyarılarını bastırır.

Sözdizimi

_AFX_SECURE_NO_WARNINGS

Örnek

Bu kod örneği tanımlanmamışsa _AFX_SECURE_NO_WARNINGS derleyici uyarısına neden olur.

// define this before including any afx files in *pch.h* (*stdafx.h* in Visual Studio 2017 and earlier)
#define _AFX_SECURE_NO_WARNINGS

// . . .

CRichEditCtrl* pRichEdit = new CRichEditCtrl;
pRichEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,
   CRect(10,10,100,200), pParentWnd, 1);
char sz[256];
pRichEdit->GetSelText(sz);

AfxDebugBreak

MFC uygulamanızın hata ayıklama sürümünün yürütülmesinde bir kesmeye (çağrısının konumunda) neden olmak için AfxDebugBreakbu işlevi çağırın.

Sözdizimi

void AfxDebugBreak( );

Açıklamalar

AfxDebugBreak bir MFC uygulamasının yayın sürümlerinde hiçbir etkisi yoktur ve kaldırılmalıdır. Bu işlev yalnızca MFC uygulamalarında kullanılmalıdır. MFC olmayan uygulamalarda bir kesmeye neden olmak için Win32 API sürümünü DebugBreakkullanın.

Gereksinimler

Üst bilgi: afxver_.h

ÖNE SÜRMEK

Bağımsız değişkenini değerlendirir.

ASSERT(booleanExpression)

Parametreler

booleanExpression
Sıfır olmayan veya 0 olarak değerlendirilen bir ifadeyi (işaretçi değerleri dahil) belirtir.

Açıklamalar

Sonuç 0 ise, makro bir tanılama iletisi yazdırır ve programı durdurur. Koşul sıfır değilse hiçbir şey yapmaz.

Tanılama iletisi şu formdadır:

assertion failed in file <name> in line <num>

burada ad kaynak dosyanın adı, sayı ise kaynak dosyada başarısız olan onaylama işleminin satır numarasıdır.

MFC'nin Yayın sürümünde ASSERT ifadeyi değerlendirmez ve bu nedenle programı kesintiye uğratmaz. İfadenin ortamdan bağımsız olarak değerlendirilmesi gerekiyorsa ASSERT yerine VERIFY makrosunu kullanın.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde kullanılabilir.

Örnek

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(pcage != NULL);
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)));
// Terminates program only if pcage is NOT a CAge*.   

Gereksinimler

Üst bilgi: afx.h

ASSERT_KINDOF

Bu makro, işaret edilen nesnenin belirtilen sınıfın bir nesnesi veya belirtilen sınıftan türetilmiş bir sınıfın nesnesi olduğunu onaylar.

ASSERT_KINDOF(classname, pobject)

Parametreler

classname
Türetilmiş bir CObjectsınıfın adı.

pobject
Sınıf nesnesinin işaretçisi.

Açıklamalar

pobject parametresi bir nesnenin işaretçisi olmalı ve olabilirconst. öğesine işaret edilen nesne ve sınıfı, çalışma zamanı sınıf bilgilerini desteklemelidir CObject . Örneğin, sınıfın pDocument bir nesnesine CMyDoc veya türevlerinden herhangi birine yönelik bir işaretçi olduğundan emin olmak için şunları kodlayabilirsiniz:

ASSERT_KINDOF(CMyDoc, pDocument);

Makroyu ASSERT_KINDOF kullanmak, kodlamayla tam olarak aynıdır:

ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

Bu işlev yalnızca [DECLARE_DYNAMIC](run-time-object-model-services.md#declare_dynamic veya DECLARE_SERIAL makrosuyla bildirilen sınıflar için çalışır.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde kullanılabilir.

Gereksinimler

Üst bilgi: afx.h

ASSERT_VALID

Bir nesnenin iç durumunun geçerliliği hakkındaki varsayımlarınızı test etmek için kullanın.

ASSERT_VALID(pObject)

Parametreler

pObject
öğesinden CObject türetilen ve üye işlevinin geçersiz kılınan bir sürümüne sahip olan bir sınıfın AssertValid nesnesini belirtir.

Açıklamalar

ASSERT_VALID bağımsız değişkeni olarak geçirilen nesnenin üye işlevini çağırır AssertValid .

MFC'nin Yayın sürümünde ASSERT_VALID hiçbir şey yapmaz. Hata ayıklama sürümünde işaretçiyi doğrular, NULL değerini denetler ve nesnenin kendi AssertValid üye işlevlerini çağırır. Bu testlerden herhangi biri başarısız olursa, ASSERT ile aynı şekilde bir uyarı iletisi görüntülenir.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde kullanılabilir.

Daha fazla bilgi ve örnek için bkz . MFC Uygulamalarında Hata Ayıklama.

Örnek

// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);

Gereksinimler

Üst bilgi: afx.h

DEBUG_NEW

Bellek sızıntılarını bulmada yardımcı oluyor.

#define  new DEBUG_NEW

Açıklamalar

DEBUG_NEW, genellikle yığın depolama alanı ayırmak için işlecini new kullanacağınız programınızın her yerinde kullanabilirsiniz.

Hata ayıklama modunda (_DEBUG simgesi tanımlandığında), DEBUG_NEW ayırdığı her nesne için dosya adını ve satır numarasını izler. Ardından, CMemoryState::D umpAllObjectsSince üye işlevini kullandığınızda, DEBUG_NEW ile ayrılan her nesne, ayrıldığı dosya adı ve satır numarasıyla gösterilir.

DEBUG_NEW kullanmak için aşağıdaki yönergeyi kaynak dosyalarınıza ekleyin:

#define new DEBUG_NEW

Bu yönergeyi ekledikten sonra, önişlemci kullandığınız her yere newDEBUG_NEW ekler ve MFC gerisini yapar. Programınızın yayın sürümünü derlediğinizde, DEBUG_NEW basit new bir işleme çözümlenir ve dosya adı ve satır numarası bilgileri oluşturulmaz.

Not

MFC'nin önceki sürümlerinde (4.1 ve öncesi) deyimini #define IMPLEMENT_DYNCREATE veya IMPLEMENT_SERIAL makrolarını çağıran tüm deyimlerin arkasına yerleştirmeniz gerekiyordu. Bu, artık gerekli değil.

Gereksinimler

Üst bilgi: afx.h

DEBUG_ONLY

Hata ayıklama modunda (_DEBUG simgesi tanımlandığında), DEBUG_ONLY bağımsız değişkenini değerlendirir.

DEBUG_ONLY(expression)

Açıklamalar

Yayın derlemesinde DEBUG_ONLY bağımsız değişkenini değerlendirmez. Bu, yalnızca hata ayıklama derlemelerinde yürütülmesi gereken kodunuz olduğunda kullanışlıdır.

DEBUG_ONLY makro, ve #endifile #ifdef _DEBUG çevresindeki ifadeye eşdeğerdir.

Örnek

void ExampleFunc(char* p, int size, char fill)
{
   char* q;               // working copy of pointer 
   VERIFY(q = p);         // copy buffer pointer and validate
   ASSERT(size >= 100);   // make sure buffer is at least 100 bytes
   ASSERT(isalpha(fill)); // make sure fill character is alphabetic
   // if fill character is invalid, substitute 'X' so we can continue
   // debugging after the preceding ASSERT fails.
   DEBUG_ONLY(fill = (isalpha(fill)) ? fill : 'X');
}

Gereksinimler

Üst bilgi: afx.h

ENSURE ve ENSURE_VALID

Veri doğruluğunu doğrulamak için kullanın.

Sözdizimi

ENSURE(  booleanExpression )
ENSURE_VALID( booleanExpression  )

Parametreler

booleanExpression
Test edilecek boole ifadesini belirtir.

Açıklamalar

Bu makroların amacı, parametrelerin doğrulanmasında iyileştirme yapmaktır. Makrolar, kodunuzda yanlış parametrelerin daha fazla işlenmesini engeller. ASSERT makrolarından farklı olarak, ENSURE makroları onay oluşturmaya ek olarak bir özel durum oluşturur.

Makrolar, proje yapılandırmasına göre iki şekilde davranır. Makrolar ASSERT'ı çağırır ve onay başarısız olursa bir özel durum oluşturur. Bu nedenle, Hata ayıklama yapılandırmalarında (yani, _DEBUG tanımlandığında) makrolar bir onay ve özel durum oluştururken, Yayın yapılandırmalarında makrolar yalnızca özel durum oluşturur (ASSERT, Release yapılandırmalarında ifadeyi değerlendirmez).

Makro ENSURE_ARG, ENSURE makrosununki gibi davranır.

ENSURE_VALID ASSERT_VALID makroyu çağırır (yalnızca Hata ayıklama derlemelerinde etkili olur). Ayrıca, ENSURE_VALID işaretçi NULL ise bir özel durum oluşturur. NULL testi hem Hata Ayıklama hem de Yayın yapılandırmalarında gerçekleştirilir.

Bu testlerden herhangi biri başarısız olursa, ASSERT ile aynı şekilde bir uyarı iletisi görüntülenir. Gerekirse makro geçersiz bir bağımsız değişken özel durumu oluşturur.

Gereksinimler

Üst bilgi: afx.h

THIS_FILE

Derlenen dosyanın adına genişletilir.

Sözdizimi

THIS_FILE

Açıklamalar

Bilgiler ASSERT ve VERIFY makroları tarafından kullanılır. Uygulama Sihirbazı ve kod sihirbazları makroyu oluşturdukları kaynak kod dosyalarına yerleştirir.

Örnek

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// __FILE__ is one of the six predefined ANSI C macros that the
// compiler recognizes.

Gereksinimler

Üst bilgi: afx.h

TRACE

Belirtilen dizeyi geçerli uygulamanın hata ayıklayıcısına gönderir.

TRACE(exp)
TRACE(DWORD  category,  UINT  level, LPCSTR lpszFormat, ...)

Açıklamalar

TRACE'in açıklaması için bkz . ATLTRACE2 . TRACE ve ATLTRACE2 aynı davranışa sahiptir.

MFC'nin hata ayıklama sürümünde, bu makro belirtilen dizeyi geçerli uygulamanın hata ayıklayıcısına gönderir. Bir yayın derlemesinde, bu makro hiçbir şeye derlenmiyor (hiç kod oluşturulmaz).

Daha fazla bilgi için bkz . MFC Uygulamalarında Hata Ayıklama.

Gereksinimler

Üst bilgi: afx.h

DOĞRULAMAK

MFC'nin Hata Ayıklama sürümünde bağımsız değişkenini değerlendirir.

VERIFY(booleanExpression)

Parametreler

booleanExpression
Sıfır olmayan veya 0 olarak değerlendirilen bir ifadeyi (işaretçi değerleri dahil) belirtir.

Açıklamalar

Sonuç 0 ise, makro bir tanılama iletisi yazdırır ve programı durdurur. Koşul sıfır değilse hiçbir şey yapmaz.

Tanılama iletisi şu formdadır:

assertion failed in file <name> in line <num>

burada ad kaynak dosyanın adı, sayı ise kaynak dosyada başarısız olan onaylama işleminin satır numarasıdır.

MFC'nin Yayın sürümünde VERIFY ifadesi değerlendirir, ancak programı yazdırmaz veya kesmez. Örneğin, ifade bir işlev çağrısıysa, çağrı yapılır.

Örnek

// VERIFY can be used for things that should never fail, though
// you may want to make sure you can provide better error recovery
// if the error can actually cause a crash in a production system.

// It _is_ possible that GetDC() may fail, but the out-of-memory
// condition that causes it isn't likely. For a test application,
// this use of VERIFY() is fine. For any production code, this
// usage is dubious.

// get the display device context
HDC hdc;
VERIFY((hdc = ::GetDC(hwnd)) != NULL);

// give the display context back
::ReleaseDC(hwnd, hdc);

Gereksinimler

Üst bilgi: afx.h

afxDump (MFC'de CDumpContext)

Uygulamanızda temel nesne dökümü özelliği sağlar.

CDumpContext  afxDump;

Açıklamalar

afxDump, hata ayıklayıcı çıkış penceresine veya hata ayıklama terminaline bilgi göndermenizi CDumpContext sağlayan önceden tanımlanmış bir CDumpContext nesnesidir. Genellikle parametresi olarak sağlamanız afxDump gerekir CObject::Dump.

Windows NT ve windows'un tüm sürümleri altında, afxDump uygulamanızda hata ayıkladığınızda çıkış Visual C++'ın Output-Debug penceresine gönderilir.

Bu değişken yalnızca MFC'nin Hata Ayıklama sürümünde tanımlanır. hakkında afxDumpdaha fazla bilgi için bkz . MFC Uygulamalarında Hata Ayıklama.

Örnek

// example for afxDump
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//..
// now dump the contents
#ifdef _DEBUG
afxDump << _T("Dumping myPerson:\n");
pMyPerson->Dump(afxDump);
afxDump << _T("\n");
#endif

Gereksinimler

Üst bilgi: afx.h

AfxDump (İç)

MFC'nin hata ayıklama sırasında bir nesnenin durumunu döküm etmek için kullandığı iç işlev.

Sözdizimi

void AfxDump(const CObject* pOb);

Parametreler

Pob
öğesinden CObjecttüretilmiş bir sınıfın nesnesine yönelik bir işaretçi.

Açıklamalar

AfxDump bir nesnenin Dump üye işlevini çağırır ve bilgileri değişkeni tarafından afxDump belirtilen konuma gönderir. AfxDump yalnızca MFC'nin Hata Ayıklama sürümünde kullanılabilir.

Program kodunuz öğesini çağırmamalı AfxDump, bunun yerine uygun nesnenin Dump üye işlevini çağırmalıdır.

Gereksinimler

Üst bilgi: afx.h

afxMemDF

Bu değişkene bir hata ayıklayıcıdan veya programınızdan erişilebilir ve ayırma tanılamasını ayarlamanıza olanak tanır.

int  afxMemDF;

Açıklamalar

afxMemDF sabit listesi afxMemDFtarafından belirtilen aşağıdaki değerlere sahip olabilir:

  • allocMemDF Hata ayıklama ayırıcısını açar (Hata ayıklama kitaplığındaki varsayılan ayar).

  • delayFreeMemDF Bellek boşaltmayı geciktiriyor. Programınız bir bellek bloğunu serbest bırakırken, ayırıcı bu belleği temel işletim sistemine döndürmez. Bu, programınıza maksimum bellek stresi oluşturur.

  • checkAlwaysMemDF Bellek her ayrıldığında veya serbest bırakıldıysa çağrılar AfxCheckMemory . Bu, bellek ayırmalarını ve serbest bırakmaları önemli ölçüde yavaşlatacaktır.

Örnek

afxMemDF = allocMemDF | checkAlwaysMemDF;

Gereksinimler

Üst bilgi: afx.h

AfxCheckError

Bu işlev, bir hata olup olmadığını görmek için geçirilen SCODE'yi test eder.

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*

Açıklamalar

Bu bir hataysa işlev bir özel durum oluşturur. Geçirilen SCODE E_OUTOFMEMORY ise, işlev AfxThrowMemoryException çağrısı yaparak bir CMemoryException oluşturur. Aksi takdirde işlev, AfxThrowOleException çağrısı yaparak bir COleException oluşturur.

Bu işlev, uygulamanızdaki OLE işlevlerine yapılan çağrıların dönüş değerlerini denetlemek için kullanılabilir. Dönüş değerini uygulamanızda bu işlevle test ederek hata koşullarına en az miktarda kodla düzgün bir şekilde tepki vekleyebilirsiniz.

Not

Bu işlev, hata ayıklama ve hata ayıklama olmayan derlemelerde aynı etkiye sahiptir.

Örnek

AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
   IID_IDispatch, (LPVOID*)& pWMPDispatch));

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Gereksinimler

Üst bilgi: afx.h

AfxCheckMemory

Bu işlev, boş bellek havuzunu doğrular ve hata iletilerini gerektiği gibi yazdırır.

BOOL  AfxCheckMemory();

Dönüş Değeri

Bellek hatası yoksa sıfır olmayan; aksi takdirde 0.

Açıklamalar

İşlev hiçbir bellek bozulması algılamazsa hiçbir şey yazdırmaz.

Şu anda yığında ayrılan tüm bellek blokları, malloc işlevi veya Windows işlevi gibi temel alınan bellek ayırıcılarına doğrudan çağrılar tarafından ayrılanlar da dahil olmak üzere, tarafından ayrılanlar da GlobalAlloc dahil olmak üzere new denetlenmektedir. Herhangi bir bloğun bozuk olduğu tespit edilirse, hata ayıklayıcı çıkışına bir ileti yazdırılır.

Satırı eklerseniz

#define new DEBUG_NEW

ardından belleğin ayrıldığı dosya adını ve satır numarasını göstermek için AfxCheckMemory sonraki çağrıları yapın.

Not

Modülünüz serileştirilebilir sınıfların bir veya daha fazla uygulamasını içeriyorsa, satırı son IMPLEMENT_SERIAL makro çağrısından sonra koymanız #define gerekir.

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde çalışır.

Örnek

CAge* pcage = new CAge(21);  // CAge is derived from CObject.
Age* page = new Age(22);     // Age is NOT derived from CObject.
*(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
*(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
AfxCheckMemory();

Gereksinimler

Üst bilgi: afx.h

AfxDump (MFC)

Hata ayıklarken bir nesnenin durumunu döküm etmek için hata ayıklayıcıdayken bu işlevi çağırın.

void AfxDump(const CObject* pOb);

Parametreler

Pob
öğesinden CObjecttüretilmiş bir sınıfın nesnesine yönelik bir işaretçi.

Açıklamalar

AfxDump bir nesnenin Dump üye işlevini çağırır ve bilgileri değişkeni tarafından afxDump belirtilen konuma gönderir. AfxDump yalnızca MFC'nin Hata Ayıklama sürümünde kullanılabilir.

Program kodunuz öğesini çağırmamalı AfxDump, bunun yerine uygun nesnenin Dump üye işlevini çağırmalıdır.

Gereksinimler

Üst bilgi: afx.h

AfxDumpStack

Bu genel işlev, geçerli yığının görüntüsünü oluşturmak için kullanılabilir.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Parametreler

dwTarget
Döküm çıktısının hedefini gösterir. Bit düzeyinde OR (|) işleci kullanılarak birleştirilebilen olası değerler aşağıdaki gibidir:

  • AFX_STACK_DUMP_TARGET_TRACE ÇıKTıyı TRACE makrosunun yoluyla gönderir. TRACE makro yalnızca hata ayıklama derlemelerinde çıkış oluşturur; yayın derlemelerinde çıkış oluşturmaz. Ayrıca TRACE, hata ayıklayıcının yanı sıra diğer hedeflere de yönlendirilebilir.

  • AFX_STACK_DUMP_TARGET_DEFAULT Döküm çıkışını varsayılan hedefe gönderir. Hata ayıklama derlemesi için çıkış TRACE makrosna gider. Yayın derlemesinde çıkış Pano'ya gider.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD Çıktıyı yalnızca Pano'ya gönderir. Veriler CF_TEXT Pano biçimi kullanılarak Pano'ya düz metin olarak yerleştirilir.

  • AFX_STACK_DUMP_TARGET_BOTH Çıktıyı Pano'ya ve TRACE makrosna aynı anda gönderir.

  • AFX_STACK_DUMP_TARGET_ODS Win32 işlevi OutputDebugString()yoluyla çıktıyı doğrudan hata ayıklayıcıya gönderir. Bu seçenek, işleme bir hata ayıklayıcısı eklendiğinde hem hata ayıklama hem de sürüm derlemelerinde hata ayıklayıcı çıkışı oluşturur. AFX_STACK_DUMP_TARGET_ODS her zaman hata ayıklayıcıya ulaşır (ekliyse) ve yeniden yönlendirilemez.

Açıklamalar

Aşağıdaki örnek, MFC iletişim kutusu uygulamasındaki bir düğme işleyicisinden çağrılarak AfxDumpStack oluşturulan çıkışın tek bir satırını yansıtır:

=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct
AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===

Yukarıdaki çıkıştaki her satır son işlev çağrısının adresini, işlev çağrısını içeren modülün tam yol adını ve çağrılan işlev prototipini gösterir. Yığındaki işlev çağrısı işlevin tam adresinde gerçekleşmezse bayt uzaklığı gösterilir.

Örneğin, aşağıdaki tabloda yukarıdaki çıkışın ilk satırı açıklanmaktadır:

Çıktı Açıklama
00427D55: Son işlev çağrısının dönüş adresi.
DUMP2\DEBUG\DUMP2.EXE! İşlev çağrısını içeren modülün tam yol adı.
void AfxDumpStack(unsigned long) İşlev prototipi çağrıldı.
+ 181 bytes İşlev prototipinin adresinden (bu örnekte, void AfxDumpStack(unsigned long)) dönüş adresine (bu örnekte, 00427D55) bayt cinsinden uzaklık.

AfxDumpStack MFC kitaplıklarının hata ayıklama ve plansız sürümlerinde kullanılabilir; ancak yürütülebilir dosyanız paylaşılan DLL'de MFC kullansa bile işlev her zaman statik olarak bağlanır. Paylaşılan kitaplık uygulamalarında işlevi MFCS42 içinde bulunur. LIB kitaplığı (ve çeşitleri).

Bu işlevi başarıyla kullanmak için:

  • dosya IMAGEHLP.DLL yolunuz üzerinde olmalıdır. Bu DLL'niz yoksa işlev bir hata iletisi görüntüler. IMAGEHLP tarafından sağlanan işlev kümesi hakkında bilgi için bkz . Görüntü Yardım Kitaplığı .

  • Yığında çerçeveleri olan modüller hata ayıklama bilgilerini içermelidir. Hata ayıklama bilgileri içermiyorsa, işlev yine de bir yığın izlemesi oluşturur, ancak izleme daha az ayrıntılı olur.

Gereksinimler

Üst bilgi: afx.h

AfxEnableMemoryLeakDump

AFX_DEBUG_STATE yıkıcıdaki bellek sızıntısı dökümünü etkinleştirir ve devre dışı bırakır.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Parametreler

bDump
[in] TRUE, bellek sızıntısı dökümü özelliğinin etkin olduğunu gösterir; YANLIŞ, bellek sızıntısı dökümü devre dışı olduğunu gösterir.

Dönüş Değeri

Bu bayrağın önceki değeri.

Açıklamalar

Bir uygulama MFC kitaplığını kaldırdığında, MFC kitaplığı bellek sızıntılarını denetler. Bu noktada, tüm bellek sızıntıları Visual Studio'nun Hata Ayıklama penceresi aracılığıyla kullanıcıya bildirilir.

Uygulamanız MFC kitaplığından önce başka bir kitaplık yüklerse, bu kitaplıktaki bazı bellek ayırmaları yanlışlıkla bellek sızıntısı olarak bildirilir. Hatalı bellek sızıntıları, MFC kitaplığı bunları rapor ettikçe uygulamanızın yavaş kapanmasına neden olabilir. Bu durumda, bellek sızıntısı dökümünü devre dışı bırakmak için kullanın AfxEnableMemoryLeakDump .

Not

Bellek sızıntısı dökümünü kapatmak için bu yöntemi kullanırsanız, uygulamanızda geçerli bellek sızıntıları raporları almazsınız. Bu yöntemi yalnızca bellek sızıntısı raporunun hatalı bellek sızıntıları içerdiğinden eminseniz kullanmanız gerekir.

Gereksinimler

Üst bilgi: afx.h

AfxEnableMemoryTracking

Tanılama belleği izleme normalde MFC'nin Hata Ayıklama sürümünde etkinleştirilir.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Parametreler

bTrack
Bu değeri TRUE olarak ayarlamak bellek izlemeyi açar; YANLIŞ bunu kapatır.

Dönüş Değeri

İzleme-etkinleştirme bayrağının önceki ayarı.

Açıklamalar

Kodunuzun blokları doğru ayırdığını bildiğiniz bölümlerinde izlemeyi devre dışı bırakmak için bu işlevi kullanın.

hakkında AfxEnableMemoryTrackingdaha fazla bilgi için bkz . MFC Uygulamalarında Hata Ayıklama.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde çalışır.

Örnek

BOOL CMyWinApp::InitInstance()
{
#ifdef _DEBUG
   // Disable tracking of memory for the scope of the InitInstance()
   AfxEnableMemoryTracking(FALSE);
#endif  // _DEBUG

   // ...

#ifdef _DEBUG
   // Re-enable tracking of memory
   AfxEnableMemoryTracking(TRUE);
#endif  // _DEBUG

   return TRUE;
}

Gereksinimler

Üst bilgi: afx.h

AfxIsMemoryBlock

Bir bellek adresini test ederek tanılama sürümü newtarafından ayrılmış olan etkin bir bellek bloğunu temsil etmesini sağlar.

BOOL AfxIsMemoryBlock(
    const void* p,
    UINT nBytes,
    LONG* plRequestNumber = NULL);

Parametreler

p
Test edilecek bellek bloğunu gösterir.

nBayt
Bellek bloğunun uzunluğunu bayt cinsinden içerir.

plRequestNumber
Bellek bloğunun ayırma dizisi numarasıyla doldurulacak bir long tamsayıya veya etkin bir bellek bloğunu temsil etmiyorsa sıfıra işaret eder.

Dönüş Değeri

Bellek bloğu şu anda ayrılmışsa ve uzunluk doğruysa sıfır olmayan; aksi takdirde 0.

Açıklamalar

Ayrıca belirtilen boyutu özgün ayrılan boyuta göre de denetler. İşlev sıfırdan farklı bir değer döndürürse, ayırma sırası numarası plRequestNumber cinsinden döndürülür. Bu sayı, bloğun diğer new tüm ayırmalara göre ayrıldığı sırayı temsil eder.

Örnek

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));

Gereksinimler

Üst bilgi: afx.h

AfxIsValidAddress

Tüm bellek adreslerini test eder ve tamamen programın bellek alanında bulunduğundan emin olur.

BOOL AfxIsValidAddress(
    const void* lp,
    UINT nBytes,
    BOOL bReadWrite = TRUE);

Parametreler

Lp
Test edilecek bellek adresini gösterir.

nBayt
Test edilecek bellek bayt sayısını içerir.

bReadWrite
Belleğin hem okuma hem de yazma (TRUE) veya yalnızca okuma (YANLIŞ) için mi olduğunu belirtir.

Dönüş Değeri

Hata ayıklama derlemelerinde, belirtilen bellek bloğu tamamen programın bellek alanında yer alırsa sıfır olmayan; aksi takdirde 0.

Hata ayıklama olmayan derlemelerde, lp NULL değilse sıfır olmayan; aksi takdirde 0.

Açıklamalar

Adres, tarafından ayrılan bloklar ile newsınırlı değildir.

Örnek

// Allocate a 5 character array, which should have a valid memory address.
char* arr = new char[5];

// Create a null pointer, which should be an invalid memory address.
char* null = (char*)0x0;

ASSERT(AfxIsValidAddress(arr, 5));
ASSERT(!AfxIsValidAddress(null, 5));

Gereksinimler

Üst bilgi: afx.h

AfxIsValidString

Bir dize işaretçisi geçerli olup olmadığını belirlemek için bu işlevi kullanın.

BOOL  AfxIsValidString(
    LPCSTR lpsz,
    int nLength = -1);

Parametreler

lpsz
Test için işaretçi.

nLength
Test edilecek dizenin uzunluğunu bayt cinsinden belirtir. -1 değeri, dizenin null olarak sonlandırılacağını gösterir.

Dönüş Değeri

Hata ayıklama derlemelerinde, belirtilen işaretçi belirtilen boyuttaki bir dizeyi işaret ederse sıfır olmayan; aksi takdirde 0.

Hata ayıklama olmayan derlemelerde, lpsz NULL değilse sıfır olmayan; aksi takdirde 0.

Örnek

// Create a character string which should be valid.
char str[12] = "hello world";

// Create a null pointer, which should be an invalid string.
char* null = (char*)0x0;

ASSERT(AfxIsValidString(str, 12));
ASSERT(!AfxIsValidString(null, 5));

Gereksinimler

Üst bilgi: afx.h

AfxSetAllocHook

Her bellek bloğu ayrılmadan önce belirtilen işlevin çağrılsını etkinleştiren bir kanca ayarlar.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Parametreler

pfnAllocHook
Çağrılacak işlevin adını belirtir. Ayırma işlevinin prototipi için Açıklamalar'a bakın.

Dönüş Değeri

Ayırmaya izin vermek istiyorsanız sıfır olmayan; aksi takdirde 0.

Açıklamalar

Microsoft Foundation Sınıf Kitaplığı hata ayıklama-bellek ayırıcısı, kullanıcının bellek ayırmasını izlemesine ve ayırmaya izin verilip verilmediğini denetlemesine olanak sağlamak için kullanıcı tanımlı bir kanca işlevini çağırabilir. Ayırma kancası işlevleri aşağıdaki gibi prototiplenir:

BOOL AFXAPI AllocHook( size_t nSize, BOOLbObject , LONG ); lRequestNumber

nSize
Önerilen bellek ayırmanın boyutu.

bObject
Ayırma - türetilmiş bir CObjectnesne içinse TRUE; aksi takdirde YANLIŞ.

lRequestNumber
Bellek ayırmanın sıra numarası.

AFXAPI çağırma kuralının çağıranın parametreleri yığından kaldırması gerektiğini ifade ettiğini unutmayın.

Gereksinimler

Üst bilgi: afx.h

AfxDoForAllClasses

Uygulamanın bellek alanında serileştirilebilir CObjecttüretilmiş tüm sınıflar için belirtilen yineleme işlevini çağırır.

void
AFXAPI AfxDoForAllClasses(
    void (* pfn)(const CRuntimeClass* pClass, void* pContext),
    void* pContext);

Parametreler

pfn
Her sınıf için çağrılacak bir yineleme işlevine işaret eder. İşlev bağımsız değişkenleri, bir CRuntimeClass nesnenin işaretçisi ve çağıranın işleve sağladığı ek verilere yönelik geçersiz bir işaretçidir.

pContext
Çağıranın yineleme işlevine sağlayabildiği isteğe bağlı verileri gösterir. Bu işaretçi NULL olabilir.

Açıklamalar

Seri hale getirilebilir CObjecttüretilmiş sınıflar, DECLARE_SERIAL makro kullanılarak türetilen sınıflardır. pContext içinde geçirilen AfxDoForAllClasses işaretçi, her çağrıldığında belirtilen yineleme işlevine geçirilir.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde çalışır.

Örnek

#ifdef _DEBUG
void DoForAllClasses(const CRuntimeClass* pClass, void* pContext)
{
   ASSERT(pContext != NULL);
   CString* pStr = (CString*)pContext;

   *pStr += pClass->m_lpszClassName;
   *pStr += _T("\n");
}
#endif

 

#ifdef _DEBUG
CString cStr;
AfxDoForAllClasses(DoForAllClasses, &cStr);
AfxMessageBox(cStr);
#endif

Gereksinimler

Üst bilgi: afx.h

AfxDoForAllObjects

ile newayrılmış olan tüm nesneler için belirtilen yineleme işlevini yürütürCObject.

void AfxDoForAllObjects(
    void (* pfn)(CObject* pObject, void* pContext),
    void* pContext);

Parametreler

pfn
Her nesne için yürütülecek bir yineleme işlevine işaret eder. İşlev bağımsız değişkenleri, çağıranın işleve sağladığı ek verilere yönelik bir CObject işaretçi ve geçersiz bir işaretçidir.

pContext
Çağıranın yineleme işlevine sağlayabildiği isteğe bağlı verileri gösterir. Bu işaretçi NULL olabilir.

Açıklamalar

Yığın, genel veya katıştırılmış nesneler numaralandırılmaz. pContext içinde geçirilen AfxDoForAllObjects işaretçi, her çağrıldığında belirtilen yineleme işlevine geçirilir.

Not

Bu işlev yalnızca MFC'nin Hata Ayıklama sürümünde çalışır.

Örnek

#ifdef _DEBUG
void DoForAllObjects(CObject* pObject, void* pContext)
{
   int* pnCount = (int*)pContext;

   pObject->AssertValid();
   if (pnCount != NULL)
      (*pnCount)++;
}
#endif // _DEBUG

 

#ifdef _DEBUG
//AfxDoForAllObjects will call the function DoForAllObjects 
//For each CObject-derived object that is allocated on the heap
int nCount = 0;
AfxDoForAllObjects(DoForAllObjects, &nCount);
TRACE("%d Objects Checked\n", nCount);
#endif

Ayrıca bkz.

Makrolar ve Genel Ayarlar
CObject::D ump