分享源码
界面截图:
是否带模块:
纯源码
备注说明:
-
本帖最后由 Will 于 2016-10-22 23:02 编辑
看此贴前,请先浏览上一个帖子!
http://bbs.125.la/forum.php?mod=viewthread&tid=13948748
本来呢,我是准备写成易的,但是呢,结构指针那块太麻烦。所以我把源码讲解 一遍,感兴趣的可以写成易语言 的代码。
注:为了便于广大易友阅读,英文说明自动使用小号字体
1:SetUnhandledExceptionFilter-> Enables an application to supersede the top-level exception handler of each thread of a process.
After calling this function, if an exception occurs in a process that is not being debugged, and the exception makes it to the unhandled exception filter, that filter will call the exception filter function specified by the lpTopLevelExceptionFilter parameter.可以设置一个函数,位于最顶层异常处理上,当异常发生时,如果下面没有对应的异常处理,就会流入这个函数所指定的回调函数中。
原型: LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
很简单,只要一个参数 lpTopLevelExceptionFilter这个参数原型如下:
LONG WINAPI UnhandledExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *ExceptionInfo
);
2:就是在上面设置的这个函数里写代码了,所有没有处理的异常都会流入这个函数
3: MiniDumpWriteDump,把dump写出去,原型如下:
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
);
hProcess, ProcessId都放进程自己的;第3个文件句柄,CreateFile返回; 第4个 MINIDUMP_TYPE,一般是 MiniDumpNormal(=0)就够用了,如果想进阶,所有的值如下:
typedef enum _MINIDUMP_TYPE { MiniDumpNormal = 0x00000000, MiniDumpWithDataSegs = 0x00000001, MiniDumpWithFullMemory = 0x00000002, MiniDumpWithHandleData = 0x00000004, MiniDumpFilterMemory = 0x00000008, MiniDumpScanMemory = 0x00000010, MiniDumpWithUnloadedModules = 0x00000020, MiniDumpWithIndirectlyReferencedMemory = 0x00000040, MiniDumpFilterModulePaths = 0x00000080, MiniDumpWithProcessThreadData = 0x00000100, MiniDumpWithPrivateReadWriteMemory = 0x00000200, MiniDumpWithoutOptionalData = 0x00000400, MiniDumpWithFullMemoryInfo = 0x00000800, MiniDumpWithThreadInfo = 0x00001000, MiniDumpWithCodeSegs = 0x00002000, MiniDumpWithoutAuxiliaryState = 0x00004000, MiniDumpWithFullAuxiliaryState = 0x00008000, MiniDumpWithPrivateWriteCopyMemory = 0x00010000, MiniDumpIgnoreInaccessibleMemory = 0x00020000, MiniDumpWithTokenInformation = 0x00040000, MiniDumpWithModuleHeaders = 0x00080000, MiniDumpFilterTriage = 0x00100000, MiniDumpValidTypeFlags = 0x001fffff
} MINIDUMP_TYPE;
第5个 PMINIDUMP_EXCEPTION_INFORMATION嗯- -这个有3个成员:
typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
DWORD ThreadId;
PEXCEPTION_POINTERS ExceptionPointers;
BOOL ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
第①个参数就GetCurrentThreadId下,第②个参数就是 UnhandledExceptionFilter参数,最后个写TRUE(=1) 第6,7直接写NULL(=0)即可。
整体流程就是这个样子,需要扩展的话可继续阅读MDSN相关帮助文档
(扩展链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms679292 (v=vs.85).aspx )
写这个真是累,大家看懂看不懂的都给个好评呗~ 好评呗~ 好评呗~
评分
查看全部评分
本帖被以下淘专辑推荐:
· 鱼木 | 主题: 1560, 订阅: 152
· 个人收藏 | 主题: 2516, 订阅: 80
· 奇技淫巧 | 主题: 207, 订阅: 47