您的位置:首页 > 其它

用CrashDump定位应用错误

2013-03-19 10:47 260 查看
用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)奉上,转载请注出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: