首页 > 编程知识 正文

client应用程序未响应(老是弹出抱歉进程停止运行)

时间:2023-05-03 14:14:04 阅读:67622 作者:3011

# include windows.h # include tchar.h # include dbghelp.h # include iostream # include vector//dbghelp.lib依赖于编译/# PP 常数int max _ name _ length=1024; //崩溃信息//struct crash info { char error code [ max _ address _ length ]; char address [ max _ address _ length ]; CHAR Flags[MAX_ADDRESS_LENGTH]; (; //CallStack信息//structcallstackinfo { char modulename [ max _ name _ length ]; char method name [ max _ name _ length ]; CHAR FileName[MAX_NAME_LENGTH]; charline number [ max _ name _ length ]; (; //securecopy字符串函数//voidsafestrcpy(char*SZdest,size_t nMaxDestSize,const char* szSrc ) if ) nmaxdestsize=0) rerest if(Strlen ) szSrc ) nMaxDestSize ) strcpy_s ) SZdest,nMaxDestSize,szSrc ); }else{strncpy_s(SZdest,nMaxDestSize,szSrc,nMaxDestSize ); szDest[nMaxDestSize-1]=' '; }//程序崩溃信息//crashinfogetcrashinfo (const exception _ record * precord ) crashinfo; SFEstrcpy(crashinfo.address,MAX_ADDRESS_LENGTH,' N/A ' ); SFEstrcpy(crashinfo.errorcode,MAX_ADDRESS_LENGTH,' N/A ' ); 安全条纹(crash info.flags,MAX_ADDRESS_LENGTH,' N/A ' ); sprintf_s(crashinfo.address,' x ',pRecord-ExceptionAddress ); sprintf_s(crashinfo.errorcode,' x ',pRecord-ExceptionCode ); sprintf_s(crashinfo.flags,' x ',pRecord-ExceptionFlags ); 返回类信息; 获取呼叫堆栈信息//vectorcallstackinfogetcallstack (上下文* p上下文) ) handle hprocess=getcurrentprocess ); syminitialize(hprocess,NULL,TRUE ); vectorcallstackinfoarrcallstackinfo; 上下文c=* p上下文; 堆栈帧64 Sf; memset(SF,0,sizeof )堆栈帧64 ); dworddwimagetype=image _ file _ machine _ i386; //不同的CPU类型,具体信息为msdn//# ifdef _ m _ I x86 SF.addr PC.offset=c.EIP; sf.AddrPC.Mode=AddrModeFlat; sf.AddrStack.Offset=c.Esp; sf.AddrStack.Mode=AddrModeFlat; sf.AddrFrame.Offset=c.Ebp; sf.AddrFrame.Mode=AddrModeFlat; # elif _ m _ x64 dw imagetype=image _ file _ machine _ amd64; sf.AddrPC.Offset=c.Rip; sf.AddrPC.Mode=AddrModeFlat; sf.AddrFrame.Offset=c.Rsp; sf.AddrFrame.Mode=AddrModeFlat; sf.AddrStack.Offset=c.Rsp; sf.AddrStack.Mode=AddrModeFlat; #elif _M_IA64 dwImageType=IMA

GE_FILE_MACHINE_IA64; sf.AddrPC.Offset = c.StIIP; sf.AddrPC.Mode = AddrModeFlat; sf.AddrFrame.Offset = c.IntSp; sf.AddrFrame.Mode = AddrModeFlat; sf.AddrBStore.Offset = c.RsBSP; sf.AddrBStore.Mode = AddrModeFlat; sf.AddrStack.Offset = c.IntSp; sf.AddrStack.Mode = AddrModeFlat; #else #error "Platform not supported!" #endif HANDLE hThread = GetCurrentThread(); while (true) { // 该函数是实现这个功能的最重要的一个函数 // 函数的用法以及参数和返回值的具体解释可以查询MSDN // if (!StackWalk64(dwImageType, hProcess, hThread, &sf, &c, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL)) { break; } if (sf.AddrFrame.Offset == 0) { break; } CallStackInfo callstackinfo; SafeStrCpy(callstackinfo.MethodName, MAX_NAME_LENGTH, "N/A"); SafeStrCpy(callstackinfo.FileName, MAX_NAME_LENGTH, "N/A"); SafeStrCpy(callstackinfo.ModuleName, MAX_NAME_LENGTH, "N/A"); SafeStrCpy(callstackinfo.LineNumber, MAX_NAME_LENGTH, "N/A"); BYTE symbolBuffer[sizeof(IMAGEHLP_SYMBOL64) + MAX_NAME_LENGTH]; IMAGEHLP_SYMBOL64 *pSymbol = (IMAGEHLP_SYMBOL64*)symbolBuffer; memset(pSymbol, 0, sizeof(IMAGEHLP_SYMBOL64) + MAX_NAME_LENGTH); pSymbol->SizeOfStruct = sizeof(symbolBuffer); pSymbol->MaxNameLength = MAX_NAME_LENGTH; DWORD symDisplacement = 0; // 得到函数名 // if (SymGetSymFromAddr64(hProcess, sf.AddrPC.Offset, NULL, pSymbol)) { SafeStrCpy(callstackinfo.MethodName, MAX_NAME_LENGTH, pSymbol->Name); } IMAGEHLP_LINE64 lineInfo; memset(&lineInfo, 0, sizeof(IMAGEHLP_LINE64)); lineInfo.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD dwLineDisplacement; // 得到文件名和所在的代码行 // if (SymGetLineFromAddr64(hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo)) { SafeStrCpy(callstackinfo.FileName, MAX_NAME_LENGTH, lineInfo.FileName); sprintf_s(callstackinfo.LineNumber, "%d", lineInfo.LineNumber); } IMAGEHLP_MODULE64 moduleInfo; memset(&moduleInfo, 0, sizeof(IMAGEHLP_MODULE64)); moduleInfo.SizeOfStruct = sizeof(IMAGEHLP_MODULE64); // 得到模块名 // if (SymGetModuleInfo64(hProcess, sf.AddrPC.Offset, &moduleInfo)) { SafeStrCpy(callstackinfo.ModuleName, MAX_NAME_LENGTH, moduleInfo.ModuleName); } arrCallStackInfo.push_back(callstackinfo); } SymCleanup(hProcess); return arrCallStackInfo; } // 处理Unhandled Exception的回调函数 // LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException) { // 确保有足够的栈空间 // #ifdef _M_IX86 if (pException->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW) { static char TempStack[1024 * 128]; __asm mov eax,offset TempStack[1024 * 128]; __asm mov esp,eax; } #endif CrashInfo crashinfo = GetCrashInfo(pException->ExceptionRecord); // 输出Crash信息 // cout << "ErrorCode: " << crashinfo.ErrorCode << endl; cout << "Address: " << crashinfo.Address << endl; cout << "Flags: " << crashinfo.Flags << endl; vector<CallStackInfo> arrCallStackInfo = GetCallStack(pException->ContextRecord); // 输出CallStack // cout << "CallStack: " << endl; for (vector<CallStackInfo>::iterator i = arrCallStackInfo.begin(); i != arrCallStackInfo.end(); ++i) { CallStackInfo callstackinfo = (*i); cout << callstackinfo.MethodName << "() : [" << callstackinfo.ModuleName << "] (File: " << callstackinfo.FileName << " @Line " << callstackinfo.LineNumber << ")" << endl; } // 这里弹出一个错误对话框并退出程序 // FatalAppExit(-1, _T("*** Unhandled Exception! ***")); return EXCEPTION_EXECUTE_HANDLER; } int main(int argc, char* argv[]) { // 设置处理Unhandled Exception的回调函数 // SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); // 除零,人为的使程序崩溃 // int i = 13; int j = 0; int k = i / j; return 0; }

转载于:https://www.cnblogs.com/byfei/p/6389665.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。