2012年10月13日星期六
MiniDumpWriteDump.Cpp
/*
能分析dump文件很重要,但不完美,还要会生成dmp文件。
windbg的分析就不说了,vs中的配置如下:
1.把dmp文件和pdb文件放置在同一个文件夹中
2.设置dmp文件用vs打开,然后双击dmp文件
3.在解决方案上右键->选择调试->二选一(选择任意一个即可)。
*/
#include <windows.h>
#include <DbgHelp.h>
#pragma comment (lib,"DbgHelp.lib")
LONG TopLevelExceptionFilter(_In_ struct _EXCEPTION_POINTERS * ExceptionInfo)
{
//这里还可以利用传递过来的参数得到调用栈信息.
HANDLE hFile = CreateFile(L"dump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( ( hFile == NULL ) && ( hFile == INVALID_HANDLE_VALUE ) )
{
return EXCEPTION_EXECUTE_HANDLER;
}
//这个结构也可以不填写,相应的MiniDumpWriteDump函数的这个位置应填写0,这主要用于dump正在正常运行的进程。
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ExceptionPointers = ExceptionInfo;
mei.ThreadId = GetCurrentThreadId();
mei.ClientPointers = false;//TRUE 微软建议设置为0
MINIDUMP_TYPE DumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithFullMemoryInfo |
MiniDumpWithHandleData | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules | MiniDumpWithFullAuxiliaryState);
//tiny的配置:MiniDumpNormal
//mini的配置:MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory);
//midi的配置:MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory | MiniDumpWithDataSegs |
// MiniDumpWithHandleData | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules );
//全部的组合是:(MINIDUMP_TYPE)0x0007ffff
//这个函数还有回调,用户自定义等信息,这里没有使用。
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, DumpType, &mei, NULL, NULL);
CloseHandle(hFile);
//正规的程序,再弹出个框,加上发送的功能。发送成功与否,设置标志,以便失败的时候,以后再发送。
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
//用此函数:_CrtSetReportMode,下面的函数可能会无效,不过这个函数只在debug下才有效。
//如果要监控服务的异常处理,需要加入服务的入口,而非正常的各种main函数。
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)TopLevelExceptionFilter);
int * p = 0;
*p = 0;
return 0;
}
/*
在服务中可以使用的选项有:
tiny的配置:MiniDumpNormal
mini的配置:MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory);
可能在任何情况下都与:启动和故障恢复的写入调试信息的设置有关。经测试与这无关。
失败的情况下一定结合上面的配置要看MiniDumpWriteDump的GetLastError()信息内容。
例如:0x0000012B 是 仅完成部分的 ReadProcessMemory 或 WriteProcessMemory 请求。
0x00000012 没有更多文件。
还有一个是参数错误。
*/
订阅:
博文评论 (Atom)
没有评论:
发表评论