关键词不能为空

当前您在: 主页 > 英语 >

编写的windows程序,崩溃时产生crash dump文件的办法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-16 00:41
tags:

-

2021年2月16日发(作者:proactive)


编写的


windows


程序,崩溃时产生


crash dump


文件的办法








编写的


windows


程序,


崩溃时产生


crash dump


文件的办




一、引言


dump


文件是


C+ +


程序发生异常时,保存当时程序


运行状态的文件,是调试异常 程序重要的方法,所以程序崩


溃时,除了日志文件,


dump< /p>


文件便成了我们查找错误的最


后一根救命的稻草。


windows


程序产生


dump

文件和


linux



序产生


dump


文件的方式不一样,


linux


默认是不让产生


core


dump


文件,只要在用户自己的


~/.bash_profile

< p>
文件中增加


ulimit -S -c unlimited > /dev/null 2>&1


这样程序崩溃就可以


产生可调试 的


core dump


文件了。但是


w indows


环境就得写


代码才能实现了。二、原理

< p>
windows


程序当遇到异常,没有


try- catch


或者


try-catch


也 无法捕获到的异常时,程序就会自


动退出,如果这时候没有


du mp


文件的话,我们是没有得到


任何程序退出的信息。在


windows


程序异常退出之前,会预


先调 用一个在程序中注册的异常处理回调函数(默认是没有


设置)


, 只要我们在这个回调函数中调用


MiniDumpWriteDump

< br>函数就可以产生我们想要的


dump


< br>件。


三、


实现


1.


调用


SetUnhandledExceptionFilter

< p>
注册一个自


定义的异常处理回调函数


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);



效,就有可能不会产生


dump


文件,因此我们必须在自定义



SetUnha ndledExceptionFilter


之后,让之后调用的


SetUnhandledExceptionFilter


无效。增加以下代码:< /p>


//


此函数


一旦成功调用,之后对



SetUnhandledExceptionFilter


的调用


将无效




void DisableSetUnhandledExceptionFilter()



{







void* addr =


(void*)GetProcAddress(LoadLibrary(

















if (addr)







{











unsigned char code[16];











int size = 0;











code[size++] = 0x33;











code[size++] = 0xC0;










-


-


-


-


-


-


-


-



本文更新与2021-02-16 00:41,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/656819.html

编写的windows程序,崩溃时产生crash dump文件的办法的相关文章

编写的windows程序,崩溃时产生crash dump文件的办法随机文章