`
testcs_dn
  • 浏览: 106109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用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奉上,转载请注出处。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics