-
编写的
windows
程序,崩溃时产生
crash dump
文件的办法
编写的
windows
程序,
崩溃时产生
crash
dump
文件的办
法
一、引言
dump
文件是
C+
+
程序发生异常时,保存当时程序
运行状态的文件,是调试异常
程序重要的方法,所以程序崩
溃时,除了日志文件,
dump<
/p>
文件便成了我们查找错误的最
后一根救命的稻草。
windows
程序产生
dump
文件和
linux
程
序产生
dump
文件的方式不一样,
linux
p>
默认是不让产生
core
dump
文件,只要在用户自己的
~/.bash_profile
文件中增加
ulimit -S -c unlimited >
/dev/null 2>&1
这样程序崩溃就可以
产生可调试
的
core dump
文件了。但是
w
indows
环境就得写
代码才能实现了。二、原理
windows
程序当遇到异常,没有
try-
catch
或者
try-catch
也
无法捕获到的异常时,程序就会自
动退出,如果这时候没有
du
mp
文件的话,我们是没有得到
任何程序退出的信息。在
windows
程序异常退出之前,会预
先调
用一个在程序中注册的异常处理回调函数(默认是没有
设置)
,
只要我们在这个回调函数中调用
MiniDumpWriteDump
< br>函数就可以产生我们想要的
dump
文
< br>件。
三、
实现
1.
调用
SetUnhandledExceptionFilter
注册一个自
定义的异常处理回调函数
SetUnh
andledExceptionFilter(MyUnhandledExceptionFilter);
标
题异常处理回调函数的原型
LONG
__stdcall
MyUnhandledExceptionFilter(PE
XCEPTION_POINTERS
pExceptionInfo);File<
/p>
创建
dump
文件,调用
MiniDumpWriteDump
函数往
dump
文件写异常信息
inline
void CreateMiniDump(PEXCEPTION_POINTERS
pep,
LPCTSTR strFileName)
{
HANDLE hFile =
CreateFile(strFileName, GENERIC_READ |
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
if((hFile != NULL) && (hFile !=
INV
ALID_HANDLE_V
ALUE))
{
MINIDUMP_EXCEPTION_INFORMATION
mdei;
Id
=
GetCurrentThreadId();
ionPointers
=
pep;
Pointers
= NULL;
MINIDUMP_CALLBACK_INFORMATION mci;
ckRoutine
= <
/p>
(MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallb
ack;
ckParam
=
0;
::MiniDumpWriteDump(::GetCu
rrentProcess(),
::
GetCurrentProcessId(), hFile,
MiniDumpNormal, (pep != 0) ?
&mdei : 0,
NULL, &mci);
CloseHandle(hFile);
}
}CreateMiniDum
p
函数是在异
常处理回调函数
MyUn
handledExceptionFilter
中调用的
LO
NG __stdcall
MyUnhandledExceptionFilter
(PEXCEPTION_POINTERS
pExceptionInfo)
{
CreateMiniDump(pExceptionInfo,
return
EXCEPTION_EXECUTE_HANDLER;
}3.
将
SetUnhandledE
xceptionFilter
失效
vs2005
中,编译的过程中,编译器会自动给你的程序加上一
句
SetUnhandledExceptionFilter(NULL)
,这就会导致你之前
自定义的
SetUnhan
dledExceptionFilter(MyUnhandledExceptionFilter);
p>
无
效,就有可能不会产生
dump
文件,因此我们必须在自定义
的
SetUnha
ndledExceptionFilter
之后,让之后调用的
SetUnhandledExceptionFilter
无效。增加以下代码:<
/p>
//
此函数
一旦成功调用,之后对
SetUnhandledExceptionFilter
的调用
将无效
void
DisableSetUnhandledExceptionFilter()
{
void* addr =
p>
(void*)GetProcAddress(LoadLibrary(
if
(addr)
{
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
-
-
-
-
-
-
-
-
-
上一篇:使用dump文件分析系统蓝屏原因
下一篇:美国口语俚语大全(=)