Bagikan melalui


Layanan Diagnostik

Pustaka Kelas Microsoft Foundation menyediakan banyak layanan diagnostik yang mempermudah penelusuran kesalahan program Anda. Layanan diagnostik ini mencakup makro dan fungsi global yang memungkinkan Anda melacak alokasi memori program Anda, membuang konten objek selama run time, dan mencetak pesan debugging selama run time. Makro dan fungsi global untuk layanan diagnostik dikelompokkan ke dalam kategori berikut:

  • Makro diagnostik umum

  • Fungsi dan variabel diagnostik umum

  • Fungsi diagnostik objek

Makro dan fungsi ini tersedia untuk semua kelas yang berasal dari CObject versi Debug dan Rilis MFC. Namun, semua kecuali DEBUG_NEW dan VERIFIKASI tidak melakukan apa pun dalam versi Rilis.

Di pustaka Debug, semua blok memori yang dialokasikan dikurung dengan serangkaian "byte penjaga." Jika byte ini terganggu oleh penulisan memori yang salah, maka rutinitas diagnostik dapat melaporkan masalah. Jika Anda menyertakan baris:

#define new DEBUG_NEW

dalam file implementasi Anda, semua panggilan ke new akan menyimpan nama file dan nomor baris tempat alokasi memori berlangsung. Fungsi CMemoryState::D umpAllObjectsSince akan menampilkan informasi tambahan ini, memungkinkan Anda mengidentifikasi kebocoran memori. Lihat juga kelas CDumpContext untuk informasi tambahan tentang output diagnostik.

Selain itu, pustaka run-time C juga mendukung serangkaian fungsi diagnostik yang dapat Anda gunakan untuk men-debug aplikasi Anda. Untuk informasi selengkapnya, lihat Debug Rutinitas di Referensi Pustaka Run-Time.

Makro Diagnostik Umum MFC

Nama Deskripsi
MENEGASKAN Mencetak pesan lalu membatalkan program jika ekspresi yang ditentukan mengevaluasi ke FALSE dalam versi Debug pustaka.
ASSERT_KINDOF Menguji bahwa objek adalah objek dari kelas yang ditentukan atau kelas yang berasal dari kelas yang ditentukan.
ASSERT_VALID Menguji validitas internal objek dengan memanggil fungsi anggotanya AssertValid ; biasanya ditimpa dari CObject.
DEBUG_NEW Menyediakan nama file dan nomor baris untuk semua alokasi objek dalam mode Debug untuk membantu menemukan kebocoran memori.
DEBUG_ONLY Mirip dengan ASSERT tetapi tidak menguji nilai ekspresi; berguna untuk kode yang harus dijalankan hanya dalam mode Debug.
PASTIKAN dan ENSURE_VALID Gunakan untuk memvalidasi kebenaran data.
THIS_FILE Memperluas ke nama file yang sedang dikompilasi.
TRACE Menyediakan printfkemampuan -like dalam versi Debug pustaka.
MEMVERIFIKASI Mirip dengan ASSERT tetapi mengevaluasi ekspresi dalam versi Rilis pustaka serta dalam versi Debug.

Variabel dan Fungsi Diagnostik Umum MFC

Nama Deskripsi
afxDump Variabel global yang mengirim informasi CDumpContext ke jendela output debugger atau ke terminal debug.
afxMemDF Variabel global yang mengontrol perilaku alokator memori penelusuran kesalahan.
AfxCheckError Variabel global yang digunakan untuk menguji SCODE yang diteruskan untuk melihat apakah itu adalah kesalahan dan, jika demikian, melemparkan kesalahan yang sesuai.
AfxCheckMemory Memeriksa integritas semua memori yang saat ini dialokasikan.
AfxDebugBreak Menyebabkan jeda dalam eksekusi.
AfxDump Jika dipanggil saat berada di debugger, mencadangkan status objek saat penelusuran kesalahan.
AfxDump Fungsi internal yang mencadangkan status objek saat penelusuran kesalahan.
AfxDumpStack Hasilkan gambar tumpukan saat ini. Fungsi ini selalu ditautkan secara statis.
AfxEnableMemoryLeakDump Mengaktifkan cadangan kebocoran memori.
AfxEnableMemoryTracking Mengaktifkan dan menonaktifkan pelacakan memori.
AfxIsMemoryBlock Memverifikasi bahwa blok memori telah dialokasikan dengan benar.
AfxIsValidAddress Memverifikasi bahwa rentang alamat memori berada dalam batas program.
AfxIsValidString Menentukan apakah penunjuk ke string valid.
AfxSetAllocHook Mengaktifkan panggilan fungsi pada setiap alokasi memori.

Fungsi Diagnostik Objek MFC

Nama Deskripsi
AfxDoForAllClasses Melakukan fungsi tertentu pada semua CObjectkelas turunan yang mendukung pemeriksaan jenis run-time.
AfxDoForAllObjects Melakukan fungsi tertentu pada semua CObjectobjek turunan yang dialokasikan dengan new.

Makro Kompilasi MFC

Nama Deskripsi
_AFX_SECURE_NO_WARNINGS Menekan peringatan kompilator untuk penggunaan fungsi MFC yang tidak digunakan lagi.

_AFX_SECURE_NO_WARNINGS

Menekan peringatan kompilator untuk penggunaan fungsi MFC yang tidak digunakan lagi.

Sintaks

_AFX_SECURE_NO_WARNINGS

Contoh

Sampel kode ini menyebabkan peringatan kompilator jika _AFX_SECURE_NO_WARNINGS tidak ditentukan.

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

Panggil fungsi ini untuk menyebabkan jeda (di lokasi panggilan ke AfxDebugBreak) dalam eksekusi versi debug aplikasi MFC Anda.

Sintaks

void AfxDebugBreak( );

Keterangan

AfxDebugBreak tidak berpengaruh dalam versi rilis aplikasi MFC dan harus dihapus. Fungsi ini hanya boleh digunakan dalam aplikasi MFC. Gunakan versi API Win32, DebugBreak, untuk menyebabkan jeda dalam aplikasi non-MFC.

Persyaratan

Header: afxver_.h

MENEGASKAN

Mengevaluasi argumennya.

ASSERT(booleanExpression)

Parameter

booleanExpression
Menentukan ekspresi (termasuk nilai penunjuk) yang mengevaluasi ke nonzero atau 0.

Keterangan

Jika hasilnya adalah 0, makro mencetak pesan diagnostik dan membatalkan program. Jika kondisinya bukan nol, itu tidak melakukan apa-apa.

Pesan diagnostik membentuk

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

di mana nama adalah nama file sumber, dan num adalah nomor baris pernyataan yang gagal dalam file sumber.

Dalam versi Rilis MFC, ASSERT tidak mengevaluasi ekspresi dan dengan demikian tidak akan mengganggu program. Jika ekspresi harus dievaluasi terlepas dari lingkungannya, gunakan makro VERIFY sebagai ganti ASSERT.

Catatan

Fungsi ini hanya tersedia dalam versi Debug MFC.

Contoh

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*.   

Persyaratan

Header: afx.h

ASSERT_KINDOF

Makro ini menegaskan bahwa objek yang ditunjukkan adalah objek dari kelas yang ditentukan, atau merupakan objek kelas yang berasal dari kelas yang ditentukan.

ASSERT_KINDOF(classname, pobject)

Parameter

nama kelas
Nama CObjectkelas -turunan.

pobject
Penunjuk ke objek kelas.

Keterangan

Parameter pobject harus menjadi penunjuk ke objek dan dapat berupa const. Objek yang ditujukkan ke dan kelas harus mendukung CObject informasi kelas run-time. Sebagai contoh, untuk memastikan bahwa pDocument itu adalah penunjuk ke objek CMyDoc kelas, atau salah satu turunannya, Anda dapat membuat kode:

ASSERT_KINDOF(CMyDoc, pDocument);

ASSERT_KINDOF Menggunakan makro sama persis dengan pengkodan:

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

Fungsi ini hanya berfungsi untuk kelas yang dideklarasikan dengan makro [DECLARE_DYNAMIC](run-time-object-model-services.md#declare_dynamic atau DECLARE_SERIAL .

Catatan

Fungsi ini hanya tersedia dalam versi Debug MFC.

Persyaratan

Header: afx.h

ASSERT_VALID

Gunakan untuk menguji asumsi Anda tentang validitas status internal objek.

ASSERT_VALID(pObject)

Parameter

pObject
Menentukan objek kelas yang berasal dari CObject yang memiliki versi penggantian AssertValid fungsi anggota.

Keterangan

ASSERT_VALID memanggil AssertValid fungsi anggota objek yang diteruskan sebagai argumennya.

Dalam versi Rilis MFC, ASSERT_VALID tidak melakukan apa pun. Dalam versi Debug, ini memvalidasi penunjuk, memeriksa terhadap NULL, dan memanggil fungsi anggota objek itu sendiri AssertValid . Jika salah satu pengujian ini gagal, pesan pemberitahuan ditampilkan dengan cara yang sama seperti ASSERT.

Catatan

Fungsi ini hanya tersedia dalam versi Debug MFC.

Untuk informasi dan contoh selengkapnya, lihat Men-debug Aplikasi MFC.

Contoh

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

Persyaratan

Header: afx.h

DEBUG_NEW

Membantu menemukan kebocoran memori.

#define  new DEBUG_NEW

Keterangan

Anda dapat menggunakan DEBUG_NEW di mana saja dalam program Anda yang biasanya akan Anda gunakan new operator untuk mengalokasikan penyimpanan timbunan.

Dalam mode debug (saat simbol _DEBUG ditentukan), DEBUG_NEW melacak nama file dan nomor baris untuk setiap objek yang dialokasikannya. Kemudian, ketika Anda menggunakan fungsi anggota CMemoryState::D umpAllObjectsSince , setiap objek yang dialokasikan dengan DEBUG_NEW ditampilkan dengan nama file dan nomor baris tempat objek dialokasikan.

Untuk menggunakan DEBUG_NEW, sisipkan direktif berikut ke dalam file sumber Anda:

#define new DEBUG_NEW

Setelah Anda memasukkan direktif ini, prapemrosan akan menyisipkan DEBUG_NEW di mana pun Anda menggunakan new, dan MFC melakukan sisanya. Saat Anda mengkompilasi versi rilis program Anda, DEBUG_NEW menyelesaikan operasi sederhana new , dan informasi nama file dan nomor baris tidak dihasilkan.

Catatan

Dalam versi MFC sebelumnya (4.1 dan yang lebih lama) Anda perlu meletakkan #define pernyataan setelah semua pernyataan yang memanggil makro IMPLEMENT_DYNCREATE atau IMPLEMENT_SERIAL. Ini tidak lagi diperlukan.

Persyaratan

Header: afx.h

DEBUG_ONLY

Dalam mode debug (saat simbol _DEBUG ditentukan), DEBUG_ONLY mengevaluasi argumennya.

DEBUG_ONLY(expression)

Keterangan

Dalam build rilis, DEBUG_ONLY tidak mengevaluasi argumennya. Ini berguna ketika Anda memiliki kode yang harus dijalankan hanya dalam build debug.

Makro DEBUG_ONLY setara dengan ekspresi sekitarnya dengan #ifdef _DEBUG dan #endif.

Contoh

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

Persyaratan

Header: afx.h

PASTIKAN dan ENSURE_VALID

Gunakan untuk memvalidasi kebenaran data.

Sintaks

ENSURE(  booleanExpression )
ENSURE_VALID( booleanExpression  )

Parameter

booleanExpression
Menentukan ekspresi boolean yang akan diuji.

Keterangan

Tujuan makro ini adalah untuk meningkatkan validasi parameter. Makro mencegah pemrosesan parameter yang salah lebih lanjut dalam kode Anda. Tidak seperti makro ASSERT, makro ENSURE melemparkan pengecualian selain menghasilkan pernyataan.

Makro berulah dengan dua cara, sesuai dengan konfigurasi proyek. Makro memanggil ASSERT lalu melemparkan pengecualian jika pernyataan gagal. Dengan demikian, dalam konfigurasi Debug (yaitu, di mana _DEBUG ditentukan) makro menghasilkan pernyataan dan pengecualian sementara dalam konfigurasi Rilis, makro hanya menghasilkan pengecualian (ASSERT tidak mengevaluasi ekspresi dalam konfigurasi Rilis).

Makro ENSURE_ARG bertindak seperti makro ENSURE.

ENSURE_VALID memanggil makro ASSERT_VALID (yang hanya berpengaruh dalam build Debug). Selain itu, ENSURE_VALID melempar pengecualian jika pointer adalah NULL. Pengujian NULL dilakukan dalam konfigurasi Debug dan Rilis.

Jika salah satu pengujian ini gagal, pesan pemberitahuan ditampilkan dengan cara yang sama seperti ASSERT. Makro melempar pengecualian argumen yang tidak valid jika diperlukan.

Persyaratan

Header: afx.h

THIS_FILE

Memperluas ke nama file yang sedang dikompilasi.

Sintaks

THIS_FILE

Keterangan

Informasi digunakan oleh makro ASSERT dan VERIFY. Wizard Aplikasi dan panduan kode menempatkan makro dalam file kode sumber yang mereka buat.

Contoh

#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.

Persyaratan

Header: afx.h

TRACE

Mengirim string yang ditentukan ke debugger aplikasi saat ini.

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

Keterangan

Lihat ATLTRACE2 untuk deskripsi TRACE. TRACE dan ATLTRACE2 memiliki perilaku yang sama.

Dalam versi debug MFC, makro ini mengirimkan string yang ditentukan ke debugger aplikasi saat ini. Dalam build rilis, makro ini dikompilasi ke apa-apa (tidak ada kode yang dihasilkan sama sekali).

Untuk informasi selengkapnya, lihat Men-debug Aplikasi MFC.

Persyaratan

Header: afx.h

MEMVERIFIKASI

Dalam versi Debug MFC, evaluasi argumennya.

VERIFY(booleanExpression)

Parameter

booleanExpression
Menentukan ekspresi (termasuk nilai penunjuk) yang mengevaluasi ke nonzero atau 0.

Keterangan

Jika hasilnya adalah 0, makro mencetak pesan diagnostik dan menghentikan program. Jika kondisinya bukan nol, itu tidak melakukan apa-apa.

Pesan diagnostik membentuk

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

di mana nama adalah nama file sumber dan num adalah nomor baris pernyataan yang gagal dalam file sumber.

Dalam versi Rilis MFC, VERIFY mengevaluasi ekspresi tetapi tidak mencetak atau mengganggu program. Misalnya, jika ekspresi adalah panggilan fungsi, panggilan akan dilakukan.

Contoh

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

Persyaratan

Header: afx.h

afxDump (CDumpContext di MFC)

Menyediakan kemampuan pencadangan objek dasar di aplikasi Anda.

CDumpContext  afxDump;

Keterangan

afxDumpadalah objek CDumpContext yang telah ditentukan sebelumnya yang memungkinkan Anda mengirim CDumpContext informasi ke jendela output debugger atau ke terminal debug. Biasanya, Anda menyediakan afxDump sebagai parameter ke CObject::Dump.

Di bawah Windows NT dan semua versi Windows, afxDump output dikirim ke jendela Output-Debug Visual C++ saat Anda men-debug aplikasi Anda.

Variabel ini hanya ditentukan dalam versi Debug MFC. Untuk informasi selengkapnya tentang afxDump, lihat Men-debug Aplikasi MFC.

Contoh

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

Persyaratan

Header: afx.h

AfxDump (Internal)

Fungsi internal yang digunakan MFC untuk mencadangkan status objek saat penelusuran kesalahan.

Sintaks

void AfxDump(const CObject* pOb);

Parameter

Pob
Penunjuk ke objek kelas yang berasal dari CObject.

Keterangan

AfxDump memanggil fungsi anggota objek Dump dan mengirim informasi ke lokasi yang ditentukan oleh afxDump variabel. AfxDump hanya tersedia dalam versi Debug MFC.

Kode program Anda tidak boleh memanggil AfxDump, tetapi harus memanggil Dump fungsi anggota dari objek yang sesuai.

Persyaratan

Header: afx.h

afxMemDF

Variabel ini dapat diakses dari debugger atau program Anda dan memungkinkan Anda menyetel diagnostik alokasi.

int  afxMemDF;

Keterangan

afxMemDF dapat memiliki nilai berikut seperti yang ditentukan oleh enumerasi afxMemDF:

  • allocMemDF Mengaktifkan alokator penelusuran kesalahan (pengaturan default di pustaka Debug).

  • delayFreeMemDF Penundaan membebaskan memori. Meskipun program Anda membebaskan blok memori, alokator tidak mengembalikan memori tersebut ke sistem operasi yang mendasar. Ini akan menempatkan stres memori maksimum pada program Anda.

  • checkAlwaysMemDFAfxCheckMemory Panggilan setiap kali memori dialokasikan atau dibeberkan. Ini akan secara signifikan memperlambat alokasi memori dan alokasi.

Contoh

afxMemDF = allocMemDF | checkAlwaysMemDF;

Persyaratan

Header: afx.h

AfxCheckError

Fungsi ini menguji SCODE yang diteruskan untuk melihat apakah itu adalah kesalahan.

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

Keterangan

Jika itu adalah kesalahan, fungsi akan melemparkan pengecualian. Jika SCODE yang diteruskan E_OUTOFMEMORY, fungsi melempar CMemoryException dengan memanggil AfxThrowMemoryException. Jika tidak, fungsi melempar COleException dengan memanggil AfxThrowOleException.

Fungsi ini dapat digunakan untuk memeriksa nilai pengembalian panggilan ke fungsi OLE di aplikasi Anda. Dengan menguji nilai pengembalian dengan fungsi ini di aplikasi Anda, Anda dapat bereaksi dengan benar terhadap kondisi kesalahan dengan jumlah kode minimal.

Catatan

Fungsi ini memiliki efek yang sama dalam build debug dan non-debug.

Contoh

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

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Persyaratan

Header: afx.h

AfxCheckMemory

Fungsi ini memvalidasi kumpulan memori gratis dan mencetak pesan kesalahan sesuai kebutuhan.

BOOL  AfxCheckMemory();

Tampilkan Nilai

Bukan nol jika tidak ada kesalahan memori; jika tidak, 0.

Keterangan

Jika fungsi tidak mendeteksi kerusakan memori, fungsi tidak mencetak apa pun.

Semua blok memori yang saat ini dialokasikan pada tumpukan diperiksa, termasuk yang dialokasikan oleh new tetapi bukan yang dialokasikan oleh panggilan langsung ke alokator memori yang mendasar, seperti fungsi malloc atau GlobalAlloc fungsi Windows. Jika ada blok yang ditemukan rusak, pesan akan dicetak ke output debugger.

Jika Anda menyertakan baris

#define new DEBUG_NEW

dalam modul program, lalu panggilan berikutnya untuk AfxCheckMemory menampilkan nama file dan nomor baris tempat memori dialokasikan.

Catatan

Jika modul Anda berisi satu atau beberapa implementasi kelas yang dapat diserialisasikan, maka Anda harus meletakkan #define baris setelah panggilan makro IMPLEMENT_SERIAL terakhir.

Fungsi ini hanya berfungsi dalam versi Debug MFC.

Contoh

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

Persyaratan

Header: afx.h

AfxDump (MFC)

Panggil fungsi ini saat berada di debugger untuk mencadangkan status objek saat penelusuran kesalahan.

void AfxDump(const CObject* pOb);

Parameter

Pob
Penunjuk ke objek kelas yang berasal dari CObject.

Keterangan

AfxDump memanggil fungsi anggota objek Dump dan mengirim informasi ke lokasi yang ditentukan oleh afxDump variabel. AfxDump hanya tersedia dalam versi Debug MFC.

Kode program Anda tidak boleh memanggil AfxDump, tetapi harus memanggil Dump fungsi anggota dari objek yang sesuai.

Persyaratan

Header: afx.h

AfxDumpStack

Fungsi global ini dapat digunakan untuk menghasilkan gambar tumpukan saat ini.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Parameter

dwTarget
Menunjukkan target output cadangan. Nilai yang mungkin, yang dapat digabungkan menggunakan operator bitwise-OR (|), adalah sebagai berikut:

  • AFX_STACK_DUMP_TARGET_TRACE Mengirim output dengan makro TRACE . Makro TRACE hanya menghasilkan output dalam build debug; ini tidak menghasilkan output dalam build rilis. Selain itu, TRACE dapat dialihkan ke target lain selain debugger.

  • AFX_STACK_DUMP_TARGET_DEFAULT Mengirim output cadangan ke target default. Untuk build debug, output masuk ke makro TRACE. Dalam build rilis, output masuk ke Clipboard.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD Mengirim output ke Clipboard saja. Data ditempatkan di Clipboard sebagai teks biasa menggunakan format CF_TEXT Clipboard.

  • AFX_STACK_DUMP_TARGET_BOTH Mengirim output ke Clipboard dan ke makro TRACE, secara bersamaan.

  • AFX_STACK_DUMP_TARGET_ODS Mengirim output langsung ke debugger dengan menggunakan fungsi OutputDebugString()Win32 . Opsi ini akan menghasilkan output debugger di build debug dan rilis saat debugger dilampirkan ke proses. AFX_STACK_DUMP_TARGET_ODS selalu mencapai debugger (jika terpasang) dan tidak dapat dialihkan.

Keterangan

Contoh di bawah ini mencerminkan satu baris output yang dihasilkan dari panggilan AfxDumpStack dari handler tombol dalam aplikasi dialog MFC:

=== 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 ===

Setiap baris dalam output di atas menunjukkan alamat panggilan fungsi terakhir, nama jalur lengkap modul yang berisi panggilan fungsi, dan prototipe fungsi yang dipanggil. Jika panggilan fungsi pada tumpukan tidak terjadi pada alamat fungsi yang tepat, offset byte ditampilkan.

Misalnya, tabel berikut menjelaskan baris pertama dari output di atas:

Output Deskripsi
00427D55: Alamat pengembalian panggilan fungsi terakhir.
DUMP2\DEBUG\DUMP2.EXE! Nama jalur lengkap modul yang berisi panggilan fungsi.
void AfxDumpStack(unsigned long) Prototipe fungsi yang dipanggil.
+ 181 bytes Offset dalam byte dari alamat prototipe fungsi (dalam hal ini, void AfxDumpStack(unsigned long)) ke alamat pengembalian (dalam hal ini, 00427D55).

AfxDumpStack tersedia dalam versi debug dan nondebug pustaka MFC; namun, fungsi ini selalu ditautkan secara statis, bahkan ketika file yang dapat dieksekusi menggunakan MFC dalam DLL bersama. Dalam implementasi pustaka bersama, fungsi ditemukan di MFCS42. Pustaka LIB (dan variannya).

Agar berhasil menggunakan fungsi ini:

  • File IMAGEHLP.DLL harus berada di jalur Anda. Jika Anda tidak memiliki DLL ini, fungsi akan menampilkan pesan kesalahan. Lihat Pustaka Bantuan Gambar untuk informasi tentang set fungsi yang disediakan oleh IMAGEHLP.

  • Modul yang memiliki bingkai pada tumpukan harus menyertakan informasi penelusuran kesalahan. Jika tidak berisi informasi penelusuran kesalahan, fungsi masih akan menghasilkan jejak tumpukan, tetapi pelacakannya akan kurang terperinci.

Persyaratan

Header: afx.h

AfxEnableMemoryLeakDump

Mengaktifkan dan menonaktifkan cadangan kebocoran memori di destruktor AFX_DEBUG_STATE.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Parameter

bDump
[di] TRUE menunjukkan cadangan kebocoran memori diaktifkan; FALSE menunjukkan cadangan kebocoran memori dinonaktifkan.

Tampilkan Nilai

Nilai sebelumnya untuk bendera ini.

Keterangan

Ketika aplikasi membongkar pustaka MFC, pustaka MFC memeriksa kebocoran memori. Pada titik ini, setiap kebocoran memori dilaporkan kepada pengguna melalui jendela Debug Visual Studio.

Jika aplikasi Anda memuat pustaka lain sebelum pustaka MFC, beberapa alokasi memori di pustaka tersebut akan salah dilaporkan sebagai kebocoran memori. Kebocoran memori palsu dapat menyebabkan aplikasi Anda ditutup perlahan saat pustaka MFC melaporkannya. Dalam hal ini, gunakan AfxEnableMemoryLeakDump untuk menonaktifkan cadangan kebocoran memori.

Catatan

Jika Anda menggunakan metode ini untuk mematikan cadangan kebocoran memori, Anda tidak akan menerima laporan kebocoran memori yang valid di aplikasi Anda. Anda hanya boleh menggunakan metode ini jika Anda yakin bahwa laporan kebocoran memori berisi kebocoran memori palsu.

Persyaratan

Header: afx.h

AfxEnableMemoryTracking

Pelacakan memori diagnostik biasanya diaktifkan dalam versi Debug MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Parameter

bTrack
Mengatur nilai ini ke TRUE mengaktifkan pelacakan memori; FALSE mematikannya.

Tampilkan Nilai

Pengaturan sebelumnya dari bendera pengaktifan pelacakan.

Keterangan

Gunakan fungsi ini untuk menonaktifkan pelacakan pada bagian kode yang Anda ketahui mengalokasikan blok dengan benar.

Untuk informasi selengkapnya tentang AfxEnableMemoryTracking, lihat Men-debug Aplikasi MFC.

Catatan

Fungsi ini hanya berfungsi dalam versi Debug MFC.

Contoh

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

Persyaratan

Header: afx.h

AfxIsMemoryBlock

Menguji alamat memori untuk memastikannya mewakili blok memori aktif saat ini yang dialokasikan oleh versi diagnostik .new

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

Parameter

p
Menunjuk ke blok memori yang akan diuji.

nByte
Berisi panjang blok memori dalam byte.

plRequestNumber
Menunjuk ke long bilangan bulat yang akan diisi dengan nomor urutan alokasi blok memori, atau nol jika tidak mewakili blok memori yang saat ini aktif.

Tampilkan Nilai

Bukan nol jika blok memori saat ini dialokasikan dan panjangnya benar; jika tidak, 0.

Keterangan

Ini juga memeriksa ukuran yang ditentukan terhadap ukuran asli yang dialokasikan. Jika fungsi mengembalikan nonzero, angka urutan alokasi dikembalikan dalam plRequestNumber. Angka ini menunjukkan urutan di mana blok dialokasikan relatif terhadap semua alokasi lainnya new .

Contoh

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

Persyaratan

Header: afx.h

AfxIsValidAddress

Menguji alamat memori apa pun untuk memastikan bahwa alamat tersebut terkandung sepenuhnya dalam ruang memori program.

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

Parameter

Lp
Menunjuk ke alamat memori yang akan diuji.

nByte
Berisi jumlah byte memori yang akan diuji.

bReadWrite
Menentukan apakah memori baik untuk membaca dan menulis (TRUE) atau hanya membaca (FALSE).

Tampilkan Nilai

Dalam build debug, nonzero jika blok memori yang ditentukan terkandung sepenuhnya dalam ruang memori program; jika tidak, 0.

Dalam build non-debug, nonzero jika lp bukan NULL; jika tidak, 0.

Keterangan

Alamat tidak dibatasi untuk blok yang dialokasikan oleh new.

Contoh

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

Persyaratan

Header: afx.h

AfxIsValidString

Gunakan fungsi ini untuk menentukan apakah penunjuk ke string valid.

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

Parameter

lpsz
Penunjuk untuk diuji.

nLength
Menentukan panjang string yang akan diuji, dalam byte. Nilai -1 menunjukkan bahwa string akan dihentikan null.

Tampilkan Nilai

Dalam build debug, bukan nol jika pointer yang ditentukan menunjuk ke string dengan ukuran yang ditentukan; jika tidak, 0.

Dalam build non-debug, nonzero jika lpsz bukan NULL; jika tidak, 0.

Contoh

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

Persyaratan

Header: afx.h

AfxSetAllocHook

Mengatur hook yang memungkinkan panggilan fungsi yang ditentukan sebelum setiap blok memori dialokasikan.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Parameter

pfnAllocHook
Menentukan nama fungsi yang akan dipanggil. Lihat Keterangan untuk prototipe fungsi alokasi.

Tampilkan Nilai

Nonzero jika Anda ingin mengizinkan alokasi; jika tidak, 0.

Keterangan

Alokator debug-memori Pustaka Kelas Microsoft Foundation dapat memanggil fungsi kait yang ditentukan pengguna untuk memungkinkan pengguna memantau alokasi memori dan mengontrol apakah alokasi diizinkan. Fungsi kait alokasi diprototi sebagai berikut:

BOOL AFXAPI AllocHook( size_tnSize , BOOL bObject , LONG lRequestNumber );

nSize
Ukuran alokasi memori yang diusulkan.

bObject
TRUE jika alokasi adalah untuk CObjectobjek -turunan; jika tidak FALSE.

lRequestNumber
Nomor urut alokasi memori.

Perhatikan bahwa konvensi panggilan AFXAPI menyiratkan bahwa penerima panggilan harus menghapus parameter dari tumpukan.

Persyaratan

Header: afx.h

AfxDoForAllClasses

Memanggil fungsi iterasi yang ditentukan untuk semua kelas -turunan yang dapat CObjectdiserialisasikan di ruang memori aplikasi.

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

Parameter

pfn
Menunjuk ke fungsi iterasi yang akan dipanggil untuk setiap kelas. Argumen fungsi adalah penunjuk ke CRuntimeClass objek dan penunjuk ke data tambahan yang disediakan pemanggil ke fungsi.

pContext
Menunjuk ke data opsional yang dapat disediakan pemanggil ke fungsi iterasi. Penunjuk ini bisa NULL.

Keterangan

Kelas -turunan yang dapat CObjectdiserialisasikan adalah kelas yang diturunkan menggunakan makro DECLARE_SERIAL. Penunjuk yang diteruskan ke AfxDoForAllClasses dalam pContext diteruskan ke fungsi iterasi yang ditentukan setiap kali dipanggil.

Catatan

Fungsi ini hanya berfungsi dalam versi Debug MFC.

Contoh

#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

Persyaratan

Header: afx.h

AfxDoForAllObjects

Menjalankan fungsi iterasi yang ditentukan untuk semua objek yang berasal dari CObject yang telah dialokasikan dengan new.

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

Parameter

pfn
Menunjuk ke fungsi iterasi untuk dijalankan untuk setiap objek. Argumen fungsi adalah penunjuk ke CObject penunjuk dan kekosongan ke data tambahan yang disediakan pemanggil ke fungsi.

pContext
Menunjuk ke data opsional yang dapat disediakan pemanggil ke fungsi iterasi. Penunjuk ini bisa NULL.

Keterangan

Objek tumpukan, global, atau tersemat tidak dijumlahkan. Pointer yang diteruskan ke AfxDoForAllObjects dalam pContext diteruskan ke fungsi iterasi yang ditentukan setiap kali dipanggil.

Catatan

Fungsi ini hanya berfungsi dalam versi Debug MFC.

Contoh

#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

Lihat juga

Makro dan Global
CObject::D ump