posts - 12,  comments - 6,  trackbacks - 0

在主程序初始化时加入

DeclareDumpFile();

创建头文件DumpFile.h, 将下列代码放进文件中

#pragma once
#include 
<windows.h>
#include 
<Dbghelp.h>
#include 
<iostream>  
#include 
<vector>  
using namespace std; 


#pragma comment(lib, 
"Dbghelp.lib")


namespace NSDumpFile

    
void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)  
    
{  
        
// 创建Dump文件  
        
//  
        HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  


        
// Dump信息  
        
//  
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;  
        dumpInfo.ExceptionPointers 
= pException;  
        dumpInfo.ThreadId 
= GetCurrentThreadId();  
        dumpInfo.ClientPointers 
= TRUE;  


        
// 写入Dump文件内容  
        
//  
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);  


        CloseHandle(hDumpFile);  
    }
  


    LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
    
{
        
return NULL;
    }



    BOOL PreventSetUnhandledExceptionFilter()
    
{
        HMODULE hKernel32 
= LoadLibrary(_T("kernel32.dll"));
        
if (hKernel32 ==   NULL)
            
return FALSE;


        
void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
        
if(pOrgEntry == NULL)
            
return FALSE;


        unsigned 
char newJump[ 100 ];
        DWORD dwOrgEntryAddr 
= (DWORD) pOrgEntry;
        dwOrgEntryAddr 
+= 5// add 5 for 5 op-codes for jmp far


        
void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
        DWORD dwNewEntryAddr 
= (DWORD) pNewFunc;
        DWORD dwRelativeAddr 
= dwNewEntryAddr -  dwOrgEntryAddr;


        newJump[ 
0 ] = 0xE9;  // JMP absolute
        memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
        SIZE_T bytesWritten;
        BOOL bRet 
= WriteProcessMemory(GetCurrentProcess(),    pOrgEntry, newJump, sizeof(pNewFunc) + 1&bytesWritten);
        
return bRet;
    }



    LONG WINAPI UnhandledExceptionFilterEx(
struct _EXCEPTION_POINTERS *pException)
    
{
        TCHAR szMbsFile[MAX_PATH] 
= 0 };
        ::GetModuleFileName(NULL, szMbsFile, MAX_PATH);
        TCHAR
* pFind = _tcsrchr(szMbsFile, '\\');
        
if(pFind)
        
{
            
*(pFind+1= 0;
            _tcscat(szMbsFile, _T(
"CrashDumpFile.dmp"));
            CreateDumpFile(szMbsFile, pException);
        }



        
// TODO: MiniDumpWriteDump
        FatalAppExit(-1,  _T("Fatal Error"));
        
return EXCEPTION_CONTINUE_SEARCH;
    }



    
void RunCrashHandler()
    
{
        SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
        PreventSetUnhandledExceptionFilter();
    }

}
;


#define DeclareDumpFile() NSDumpFile::RunCrashHandler();

 


posted on 2012-10-30 10:10 vic.MINg 阅读(817) 评论(0)  编辑 收藏 引用 所属分类: Visual C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔分类(13)

随笔档案(12)

搜索

  •  

最新评论

阅读排行榜

评论排行榜