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 CObject geç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 printf Hata 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 CObject türetilmiş sınıflarda belirtilen bir işlevi gerçekleştirir. |
AfxDoForAllObjects | ile new ayrılan tüm CObject tü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 AfxDebugBreak
bu 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ü DebugBreak
kullanı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 CObject
sı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 new
DEBUG_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 #endif
ile #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 afxDump
daha 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 CObject
tü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 afxMemDF
tarafı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ılarAfxCheckMemory
. 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 CObject
tü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 AfxEnableMemoryTracking
daha 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ü new
tarafı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 new
sı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 CObject
nesne 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 CObject
tü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 CObject
tü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 new
ayrı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