用CrashDump定位应用错误

CrashDump定位应用错误

 

来源:http://www.lu0s1.com/old/App/20100826.html

通常,在驱动的世界里面,一旦我们的驱动有BUG,导致系统蓝屏,往往我们需要靠OS生成的CrashDump文件来进行事后分析。但是事实上我们针对应用程序同样也能生成CrashDump。在某些情形下,我们必须在应用中主动生成CrashDump,因为抓取Crash条件的时机稍纵即逝,再也难以复原Crash场景。本文要介绍的乃是

 

BOOL WINAPI MiniDumpWriteDump(

  __in  HANDLE hProcess,

  __in  DWORD ProcessId,

  __in  HANDLE hFile,

  __in  MINIDUMP_TYPE DumpType,

  __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,

  __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,

  __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam

);

 


这个函数。通过运用这个函数,我们能在异常发生的时间点将整个应用的运行上下文捕捉下来。从而提供异常发生时刻的重要情报信息。

这个函数的用法大致如下

int WINAPI CreateDump(EXCEPTION_POINTERS* pExceptionPointers)

{

    BOOL bMiniDumpSuccessful;

    CHAR szFileName[MAX_PATH];

    HANDLE hDumpFile;

    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

 

    …

    snprintf( szFileName, MAX_PATH,“你的CrashDump文件名”); <- 注意:异常会多次发生,每次的原因不见得一样,因此最好文件名里面附带上崩溃发生的时间,以便协查。

    hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,

       FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

 

    if (hDumpFile != INVALID_HANDLE_VALUE)

    {

       ExpParam.ThreadId = GetCurrentThreadId();

       ExpParam.ExceptionPointers = pExceptionPointers;

       ExpParam.ClientPointers = TRUE;

 

       bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

           hDumpFile,

       MiniDumpWithDataSegs|MiniDumpWithProcessThreadData|MiniDumpWithHandleData|MiniDumpWithUnloadedModules  <- 注意:这个参数组合能保留一定的数据段信息,捕捉整个进程的内存镜像也是个办法,但是一般情况下,有一定的数据就可以了,真正关键的部分是栈里面保留的函数调用栈。用于定位异常发生时刻有哪些函数被牵扯进来。

           , &ExpParam, NULL, NULL);

 

       CloseHandle(hDumpFile);

 

    }

    else

    {

       OutputDebugString("xxx -- Can not create crash dump!!!\n"); <- CrashDump如果都写不出来,认命吧。

    }

 

    ExitProcess(pExceptionPointers->ExceptionRecord->ExceptionCode); <- 异常都发生了,还是不要让应用继续跑下去为妙。不然出其他的娄子就更难判断了。

}

上面介绍的函数如何触发呢?比较通俗的写法是

LPTOP_LEVEL_EXCEPTION_FILTER defaultExceptionCallBack = NULL;

int main(int argc,char **argv)

{

   。。。

defaultExceptionCallBack = SetUnhandledExceptionFilter(&CreateDump);

。。。

该干嘛干嘛

。。。

}

在所有人都不接管异常的情况下,CreateDump会得到触发,这么一来,异常的场景就能被捕捉到。哪些非常难以再现的场景就有办法得到重现或者定位。

最近数年间的现场紧急支持中,有95%以上的case通过应用崩溃时刻的dump文件而被定位。可以说是非常高效的定位问题所在的方法之一。:)

 

本文由Inside Programming(lu0s1.3322.org奉上,转载请注出处。

你可能感兴趣的:(dump,定位,Crash,应用,错误)