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 没有更多文件。
          还有一个是参数错误。
*/

没有评论:

发表评论