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 printf kemampuan -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 CObject kelas turunan yang mendukung pemeriksaan jenis run-time. |
AfxDoForAllObjects | Melakukan fungsi tertentu pada semua CObject objek 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 CObject
kelas -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
afxDump
adalah 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.checkAlwaysMemDF
AfxCheckMemory
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 CObject
objek -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 CObject
diserialisasikan 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 CObject
diserialisasikan 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