string AccurateTimeStr(void)
{
SYSTEMTIME sys;
GetLocalTime( &sys );
ostringstream oss;
oss << sys.wYear << "-"
<< sys.wMonth << "-"
<<sys.wDay <<"_"
<<sys.wHour<<sys.wMinute << sys.wSecond
<<sys.wMilliseconds;
return oss.str();
}
void GenerateDump(EXCEPTION_POINTERS * pExPtrs, const string& strDumpFilePath, int nFullDump)
{
HANDLE hFile = CreateFile(strDumpFilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE != hFile)
{
PEXCEPTION_POINTERS pExceptionInfo = NULL;
pExceptionInfo = (PEXCEPTION_POINTERS)pExPtrs;
MINIDUMP_EXCEPTION_INFORMATION MiniExceptionInfo = { 0 };
MiniExceptionInfo.ThreadId = GetCurrentThreadId();
MiniExceptionInfo.ExceptionPointers = pExceptionInfo;
MiniExceptionInfo.ClientPointers = TRUE;
MINIDUMP_TYPE dumpType = nFullDump ? MiniDumpValidTypeFlags : MiniDumpNormal ;
MiniDumpWriteDump(GetCurrentProcess(), ::GetCurrentProcessId(), hFile, dumpType,
&MiniExceptionInfo, NULL, NULL);
CloseHandle(hFile);
}
}
NBFileSystem * g_pFileSystem = NULL;
CAdoSqlEx * g_pAdoDB = NULL;
GNIManagerOE * g_pGNIManager = NULL;
CNBLiveAdapterASImpl* g_pLiveAdapter = NULL;
bool g_bInit = false;
static BOOL bGetStackTraceString = TRUE ;
static BOOL bShowRegs = TRUE ;
static BOOL bLetItCrash = FALSE ;
static DWORD dwOpts = GSTSO_MODULE | GSTSO_SYMBOL | GSTSO_SRCLINE ;
static HINSTANCE g_dllInstance = NULL;
static LONG __stdcall MyExceptionFunc( EXCEPTION_POINTERS * pExPtrs )
{
FILE* fp = NULL;
char buffer[1024]={0};
::GetModuleFileName( NULL , buffer , MAX_PATH );
char * pFind = strrchr( buffer , '\\' );
if( NULL == pFind )
return EXCEPTION_EXECUTE_HANDLER;
pFind[0] = 0;
pFind = strrchr( buffer ,'\\');
if( NULL == pFind )
return EXCEPTION_EXECUTE_HANDLER;
pFind[1] = 0;
char conf[1024] = { '\0' };
strcpy(conf, buffer);
strcat(conf, "conf\\fix_graphics.ini");
string logdir = DiscoverInfo::Instance()->RuntimeLogFolder() + string("crashinfo.log");
strcpy( pFind , logdir.c_str());
fp = fopen( logdir.c_str() , "wb" );
char newline[2] = { 0x0d , 0x0a };
if ( TRUE == bShowRegs )
{
const char* str = GetRegisterString ( pExPtrs ) ;
fwrite( str , strlen( str ) , 1 , fp );
fwrite( newline , 2 , 1 , fp );
}
if ( TRUE == bGetStackTraceString )
{
const char * str = GetFirstStackTraceString ( dwOpts , pExPtrs ) ;
do
{
fwrite( str , strlen( str ) , 1 , fp );
fwrite( newline , 2 , 1 , fp );
str = GetNextStackTraceString ( dwOpts , pExPtrs ) ;
}
while ( NULL != str ) ;
}
fclose( fp );
string strDump = AccurateTimeStr() + string(".dmp");
strDump = DiscoverInfo::Instance()->RuntimeLogFolder() + strDump;
int nFullDump = 0;
if( access(conf, 0) == 0 )
{
nFullDump = GetPrivateProfileInt("BugTrace", "FullDump", 0, conf);
}
GenerateDump(pExPtrs, strDump, nFullDump);
if ( TRUE == bLetItCrash )
{
return ( EXCEPTION_CONTINUE_SEARCH ) ;
}
else
{
return ( EXCEPTION_EXECUTE_HANDLER ) ;
}
}
BOOL CMyTestApp::InitInstance()中添加如下
SetCrashHandlerFilter( MyExceptionFunc );