锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓轟簡嫻嬭瘯榪欎釜API, 鍙傝冪綉涓婁竴浜涜祫鏂? 鍐欎簡涓涓畝鍗曠殑C++ 紼嬪簭. 鐩殑鏄綋鏈夊紓甯稿彂鐢熺殑鏃跺? 鑷姩鐢熸垚Dump鏂囦歡渚涗箣鍚庣殑鍒嗘瀽. 鏈変簡Dump鏂囦歡, 鎴戜滑灝卞彲浠ヤ嬌鐢╓inDBG絳夎皟璇曞櫒鏉ュ垎鏋愬紓甯稿彂鐢熸椂鐨勬儏鍐? 鍏跺疄榪欎釜鍔熻兘寰堝杞歡閮芥湁, 姣斿QQ, 欖斿吔涓栫晫, 絳夌瓑. 瀹冧滑鍦ㄥ嚭鐜頒簡寮傚父鐨勬椂鍊欎細寮瑰嚭涓涓璇濇, 璁╃敤鎴瘋緭鍏ュ紓甯稿彂鐢熸椂鐨勬儏鍐? 鐒跺悗鎶婂紓甯哥殑dump鏂囦歡鐢╡mail鍙戝洖, 渚涘紑鍙戣呬滑鍒嗘瀽淇敼bug.
涓嶈繃鏈変竴鐐? 榪欓噷闇瑕佺▼搴忕殑璋冭瘯絎﹀彿鏂囦歡(pdb鏂囦歡). 瀵逛簬Debug鐗堟潵璇? 鏄敓鎴愮殑, 浣嗘槸Release鐗堟潵璇撮粯璁ゆ槸涓嶇敓鎴愮殑. 鍙互璁劇疆VC鐨勭紪璇戝櫒, 璁╁畠鍦≧elease鐗堢殑鏃跺欎篃鐢熸垚璋冭瘯淇℃伅. 榪欏甫鏉ヤ竴涓柊鐨勯棶棰? 鍥犱負.pdb閲岄潰鏄繚瀛樹簡婧愭枃浠剁殑淇℃伅鐨? 涓轟簡閬垮厤娉勫瘑, 鍙互閲囩敤VS涓殑CVPack宸ュ叿, 浠庝腑鍘婚櫎鏁忔劅鐨勪俊鎭?
紼嬪簭闇瑕佷嬌鐢?strong>Dbghelp.h 鍜?Dbghelp.lib . 瀹冧滑鍙互浠嶮SDN鎵懼埌.
//鏈涓昏鐨勫嚱鏁? 鐢熸垚Dump
static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
if (excpInfo == NULL) //濡傛灉娌℃湁浼犲叆寮傚父, 姣斿鏄湪紼嬪簭閲岄潰璋冪敤鐨? 鐢熸垚涓涓紓甯?/font>
{
// Generate exception to get proper context in dump
__try
{
OutputDebugString(_T("raising exception\r\n"));
RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
}
__except(DumpMiniDump(hFile, GetExceptionInformation()),
EXCEPTION_CONTINUE_EXECUTION)
{
}
}
else
{
OutputDebugString(_T("writing minidump\r\n"));
MINIDUMP_EXCEPTION_INFORMATION eInfo;
eInfo.ThreadId = GetCurrentThreadId(); //鎶婇渶瑕佺殑淇℃伅娣昏繘鍘?/font>
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE;
// 璋冪敤, 鐢熸垚Dump. 98涓嶆敮鎸?br>
// Dump鐨勭被鍨嬫槸灝忓瀷鐨? 鑺傜渷絀洪棿. 鍙互鍙傝僊SDN鐢熸垚鏇磋緇嗙殑Dump.
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
excpInfo ? &eInfo : NULL,
NULL,
NULL);
}
}
涓嬮潰鐨勬槸紼嬪簭閮ㄥ垎:
int _tmain(int argc, _TCHAR* argv[])
{
// 鍒涘緩涓涓狣ump鏂囦歡
HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
int code;
__try
{
// 鎶婅嚜宸卞疄鐜扮殑main鍑芥暟鍖呰涓涓? 鏀懼湪try .. except 鍧椾腑. 榪欐牱鍑虹幇浜嗗紓甯稿彲浠ヨ嚜鍔ㄧ敓鎴恉ump
main_wrapper(argc, argv);
}
__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ), EXCEPTION_EXECUTE_HANDLER ) //鍑虹幇浜嗗紓甯? 璁板綍寮傚父鐨刢ode, 鐢熸垚dump!!
{
printf("%x\n", code);
wchar_t msg[512];
wsprintf(msg, L"Exception happened. Exception code is %x", code);
MessageBox(NULL, msg, L"Exception", MB_OK); //鏄劇ず娑堟伅緇欑敤鎴?/font>
}
CloseHandle( hFile ); //鍏抽棴Dump鏂囦歡
getchar();
return 0;
}
鏈涓嬮潰鏄袱涓祴璇曠殑鍑芥暟, main_wrapper鍑芥暟灝嗚皟鐢╰est1, test1灝嗕細鐢熸垚涓涓紓甯?闈炴硶鍐呭瓨鍐?
void test1() {
int *p;
p = (int*)0x100;
*p = 0; //鍐?x100鍦板潃, 榪欎釜鏄潪娉曠殑
}
void main_wrapper(int argc, _TCHAR* argv[]) {
test1();
}
榪愯, 寮傚父琚崟鑾蜂簡:
鍚屾椂, dump鏂囦歡涔熺敓鎴愪簡:
鐢╓inDBG鎵撳紑Dump鏂囦歡, 鍙互娓呮鐨勭湅鍑哄紓甯稿嚭鐜扮殑鎯呭喌:
浠庝腑鍙互姣旇緝娓呮鐨勭湅鍒板紓甯稿彂鐢熺殑鎯呭喌(Exception code), 寮傚父鍑虹幇鐨勫湴鍧(test1鍑芥暟, 鍋忕Щ0x28). 鍥犱負榪欐嫻嬭瘯鐨勬槸Debug鐗? 鏈変繚瀛樹簡婧愪唬鐮佺殑.pdb鏂囦歡, 鎵浠inDbg鎶婃簮浠g爜涔熷垪鍑烘潵浜? 榪欐牱鍙互闈炲父瀹規槗鐨勫彂鐜伴棶棰?
============================================
鍙傝?