南通优普营销网站建设网络推广公司成都
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:16
当前位置: 首页 > news >正文
南通优普营销网站建设,网络推广公司成都,新能源汽车价格表图片及价格表,网站策划书内容一#xff0c;为什么需要dump文件 Windows客户端应用开发时#xff0c;难免会遇到程序崩溃问题。当程序在Debug下运行崩溃时#xff0c;我们可以直接定位到崩溃点。但是当程序打包成Release发布时#xff0c;难免会遇到一些崩溃问题。一般遇到这样的崩溃#xff0c;我们就…一为什么需要dump文件 Windows客户端应用开发时难免会遇到程序崩溃问题。当程序在Debug下运行崩溃时我们可以直接定位到崩溃点。但是当程序打包成Release发布时难免会遇到一些崩溃问题。一般遇到这样的崩溃我们就需要使用 dump 文件加上符号表文件来进行调试程序。 二如何生成dump文件 工欲善其事必先利其器。这里直接给出一个CrashDump类供各位大佬使用。在main函数实例化即可。生成不了dump文件你来打我~ 三CrashDump代码 CrashDump.h #pragma once#include Windows.h #include Dbghelp.hclass CrashDump { public:explicit CrashDump();~CrashDump(); private:static LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo); private:LPTOP_LEVEL_EXCEPTION_FILTER m_oldExceptionFilter; };CrashDump.cpp #include CrashDump.h #include ctime #include string #include sstream #include assert.h #include DbgHelp.h #include shellapi.h #include iostreamtypedef BOOL(WINAPI *getUserModeExceptionProc)(LPDWORD); typedef BOOL(WINAPI *setUserModeExceptionProc)(DWORD);typedef BOOL(WINAPI MINIDUMPWRITEDUMP) (HANDLE hProcess,DWORD ProcessId,HANDLE hFile,MINIDUMP_TYPE DumpType,PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,PMINIDUMP_CALLBACK_INFORMATION CallbackParam);static std::wstring format(const wchar_t pszFormat, …) {wchar_t buffer[MAX_PATH] { 0 };va_list ap;va_start(ap, pszFormat);int nCount ::vswprintf_s(buffer, _countof(buffer), pszFormat, ap);va_end(ap);if (nCount 0) {assert(false);return pszFormat;}return buffer; }CrashDump::CrashDump(): m_oldExceptionFilter(NULL) {// 堆异常BOOL bRet ::HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);::OutputDebugStringW(format(LHeapSetInformation, bRet: %lu, %lu.\n, bRet, ::GetLastError()).c_str());// DEP策略bRet ::SetProcessDEPPolicy(PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION);::OutputDebugStringW(format(LSetProcessDEPPolicy, bRet: %lu, %lu.\n, bRet, ::GetLastError()).c_str());//standard app-wide unhandled exception filterm_oldExceptionFilter ::SetUnhandledExceptionFilter(UnhandledExceptionFilter);//fix for exceptions being swallowed inside callbacks (see KB976038)HMODULE hKernel32 GetModuleHandle(TEXT(KERNEL32));if (NULL hKernel32) {::OutputDebugStringW(LGetModuleHandle faled.\n);} else {DWORD dwFlags 0;getUserModeExceptionProc procGetProcessUserModeExceptionPolicy;setUserModeExceptionProc procSetProcessUserModeExceptionPolicy;procGetProcessUserModeExceptionPolicy (getUserModeExceptionProc)::GetProcAddress(hKernel32, GetProcessUserModeExceptionPolicy);procSetProcessUserModeExceptionPolicy (setUserModeExceptionProc)::GetProcAddress(hKernel32, SetProcessUserModeExceptionPolicy);if (procGetProcessUserModeExceptionPolicy procSetProcessUserModeExceptionPolicy) {if (procGetProcessUserModeExceptionPolicy(dwFlags)) {bRet procSetProcessUserModeExceptionPolicy(dwFlags ~1);::OutputDebugStringW(format(LGetProcessUserModeExceptionPolicy, bRet: %lu.\n, bRet).c_str());}::OutputDebugStringW(format(LSetProcessUserModeExceptionPolicy, bRet: %lu, dwFlags: %lu.\n, bRet, dwFlags).c_str());}} }CrashDump::~CrashDump() {if (NULL ! m_oldExceptionFilter) {::SetUnhandledExceptionFilter(m_oldExceptionFilter);} }LONG WINAPI CrashDump::UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo) {//always break into a debugger if one is presentif (::IsDebuggerPresent()) {::OutputDebugStringW(LIsDebuggerPresent return TRUE.\n);return EXCEPTION_CONTINUE_SEARCH;}static BOOL inExceptionHandler FALSE;if (inExceptionHandler) {::OutputDebugStringW(LCurrent function has crashed.Shit.\n);return EXCEPTION_CONTINUE_SEARCH;}inExceptionHandler TRUE;WCHAR fullPath[MAX_PATH] { 0 };DWORD pathLength ::GetModuleFileNameW(NULL, fullPath, MAX_PATH);if (0 pathLength) {::OutputDebugStringW(LGetModuleFileNameW failed.\n);return EXCEPTION_CONTINUE_SEARCH;}LPCWSTR lastSlash ::wcsrchr(fullPath, L\);if (NULL lastSlash) {::OutputDebugStringW(Lwcsrchr return wrong.\n);return EXCEPTION_CONTINUE_SEARCH;}std::wstring exeDirPath(fullPath, lastSlash - fullPath 1);WCHAR filePath[MAX_PATH] { 0 };for (int i 0; ; i) { // 避免同名 SYSTEMTIME sys_time { 0 };::GetLocalTime(sys_time);::swprintf_s(filePath, countof(filePath) - 1, L%s%04u%02u%02u%02u%02u%02u_%d.dmp, exeDirPath.c_str(), sys_time.wYear, sys_time.wMonth, sys_time.wDay, sys_time.wHour, sys_time.wMinute, sys_time.wSecond, i);if (::GetFileAttributes(filePath) INVALID_FILE_ATTRIBUTES) {break;}}HANDLE hFile ::CreateFileW(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE hFile) {::OutputDebugStringW(LCreateFileW failed.\n);return EXCEPTION_CONTINUE_SEARCH;}//load dbghelp dynamicallyHMODULE hDbgHelp LoadLibraryW(LDBGHELP);if (!hDbgHelp) {::OutputDebugStringW(LLoadLibraryW DBGHELP failed.\n);return EXCEPTION_CONTINUE_SEARCH;}MINIDUMPWRITEDUMP fnMiniDumpWriteDump (MINIDUMPWRITEDUMP)::GetProcAddress(hDbgHelp, MiniDumpWriteDump);if (!fnMiniDumpWriteDump) {::OutputDebugStringW(LGetProcAddress MiniDumpWriteDump failed.\n);::FreeLibrary(hDbgHelp);return EXCEPTION_CONTINUE_SEARCH;}MINIDUMP_TYPE dumpFlags (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData);MINIDUMP_EXCEPTION_INFORMATION miniInfo {0};miniInfo.ClientPointers TRUE;miniInfo.ExceptionPointers pExceptionInfo;miniInfo.ThreadId ::GetCurrentThreadId();//generate a minidump if possibleif (fnMiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, dumpFlags, miniInfo, NULL, NULL)) {WCHAR buffer[MAX_PATH] { 0 }; ::swprintf_s(buffer, _countof(buffer) - 1, LProcess has crashed.\nMinidump was saved to: \n\%s\n, filePath);::OutputDebugStringW(buffer);// ::MessageBoxW(NULL, buffer, NULL, MB_ICONERROR | MB_OK);} else {::OutputDebugStringW(format(LMinidump was saved failed: %hu.\n, ::GetLastError()).c_str());// ::MessageBoxW(NULL, format(LMinidump was saved failed: %hu.\n, ::GetLastError()).c_str(), NULL, MB_ICONERROR | MB_OK);}::FreeLibrary(hDbgHelp);::CloseHandle(hFile);return EXCEPTION_CONTINUE_SEARCH; } 四在项目中调用 int main(int argc, char* argv[]) { …CrashDump crashDump; // 直接实例化即可 … } 注意要用exe启动不要用vs启动程序
- 上一篇: 南通营销网站制作搜狐新闻手机网
- 下一篇: 南通专业网站制作wordpress管理员信息在哪
相关文章
-
南通营销网站制作搜狐新闻手机网
南通营销网站制作搜狐新闻手机网
- 技术栈
- 2026年03月21日
-
南通网站一个网站做多有几种颜色
南通网站一个网站做多有几种颜色
- 技术栈
- 2026年03月21日
-
南通网站排名做网站学什么什么专业
南通网站排名做网站学什么什么专业
- 技术栈
- 2026年03月21日
-
南通专业网站制作wordpress管理员信息在哪
南通专业网站制作wordpress管理员信息在哪
- 技术栈
- 2026年03月21日
-
南头做网站公司大同建设银行保安招聘网站
南头做网站公司大同建设银行保安招聘网站
- 技术栈
- 2026年03月21日
-
南县建设局网站企业培训课程有哪些内容
南县建设局网站企业培训课程有哪些内容
- 技术栈
- 2026年03月21日
