Windowsの下でどのようにプログラムの優雅な退出を譲ります

4934 ワード

Windowsの下でどのようにプログラムの優雅な退出を譲ります
WindowsでC++コードを書くとメモリクラッシュの問題に遭遇することが多いexeプログラムが本番環境で実行されている間に、奇妙なメモリクラッシュが原因でプログラムが終了した場合、プログラムが終了したときにクラッシュレポートを生成し、優雅にプログラムを終了する必要があります.
  • まず、システム関数SetUnhandledExceptionFilter()
  • を理解する必要がある.
    //     
    LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
      __in          LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
    );
    
    // lpTopLevelExceptionFilter           
    //   :
    //EXCEPTION_EXECUTE_HANDLER 0x1                     
    //EXCEPTION_CONTINUE_EXECUTION 0xffffffff            
    //EXCEPTION_CONTINUE_SEARCH 0x1                              
    
  • コード実装
  •     SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)GetCrashInfoCallBack);
        
        long _stdcall GetCrashInfo(_EXCEPTION_POINTERS* pexcp)
        {
            
            char szDumpFile[1024];
            sprintf(szDumpFile,"%s.DUMP",argv[0]);
            HANDLE hDumpFile = CreateFileA(szDumpFile,GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
            
            if( hDumpFile != INVALID_HANDLE_VALUE)
        {
            //Dump   
            MINIDUMP_EXCEPTION_INFORMATION dumpInfo; 
            dumpInfo.ExceptionPointers = pexcp;
            dumpInfo.ThreadId = GetCurrentThreadId();
            dumpInfo.ClientPointers = TRUE; 
            //  Dump    
            ::MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); 
            
        }