用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)奉上,转载请注出处。
分享到:
相关推荐
crashdump.dll
Unix System Crash Dump Analysis Panic! UNIX® System Crash Dump Analysis <br>很好的一本分析Unix系统下Crash以后对dump文件的分析与实战技巧。想提高unix下的编程与调试水平,这本书相信有很大帮助。...
Linux Crash Dump的设计与实现.pdf
Linux Crash Dump分析工具的设计与实现.pdf
A Quick Overview of Linux Kernel Crash Dump Analysis∗A Quick Overview of Linux Kernel Crash Dump Analysis∗
学习奔溃转储分析非常好的参考资料,1200多页,全面介绍内存分析技术。Detecting Abnormal Software Structure and Behavior in Computer Memory
qualcomm平台system dump分析工具,使用方法crash64 vmlinux DDRCS0.BIN@加载地址,DDRCS1.BIN@加载地址 --kaslr auto
两者都由另一个进程(dumper.exe)完成,这对于使用可靠的堆栈跟踪进行转储至关重要。 崩溃器使用SetUnhandledExceptionFilter注册异常处理程序。 该处理程序启动转储程序并等待其退出。 它在命令行中将其进程ID,...
崩溃转储分析 Java Crash Dump 分析演示的示例代码
42页 介绍了如何在android手机发生crash时 进行log分析的方法,它可以帮助测试人员快速定位问题到原因
为处理windows程序崩溃问题,有必要引入异常捕获模块。本资源主要讲述如何配置产生dump文件的环境以及dump文件产生后的分析定位。
用于程序异常处理,当程序崩溃时自动调用异常处理例程
HP crash产生和描述,对于分析问题有很大的帮助
Openwrt中通过gdb工具定位内核panic错误位置,快速定位内核内存越界代码位置,节约调试时间。
windows_crash_dump_analysis.ppt
A Quick Overview of Linux Kernel Crash Dump AnalysisA Quick Overview of Linux Kernel Crash Dump AnalysisA Quick Overview of Linux Kernel Crash Dump AnalysisA Quick Overview of Linux Kernel Crash Dump ...
dump analysis samples
安卓测试崩溃代码定位的方法,可以看到堆栈信息,且容易定位到具体哪一行代码,非常有用。
iOS崩溃转储分析书本书HTML版本“ iOS崩溃转储分析”如下所示: 语关联英语 中国人 本书随附的是“分析故障排除... 当我环顾同事时,我注意到我们都是从不同的职业道路上来进行应用程序编程的。 似乎其他所有人都发现崩
Crash工具