• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            程序自動生成Dump文件

            前言:通過drwtsn32NTSDCDB等調試工具生成Dump文件, drwtsn32存在的缺點雖然NTSDCDB可以完全解決,但并不是所有的操作系統中都安裝了NTSDCDB等調試工具。了解了mini dump文件格式后,完全可以程序自動生成Dump文件。

            本文主要討論以下內容:

            1  運行原理

            2  程序修改

            3  注意事項

            一、   運行原理

            當程序遇到未處理異常(主要指非指針造成)導致程序崩潰死,如果在異常發生之前調用了SetUnhandledExceptionFilter()函數,異常交給函數處理。MSDN中描述為:

            Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

             

            因而,在程序開始處增加SetUnhandledExceptionFilter()函數,并在函數中利用適當的方法生成Dump文件,即可實現需要的功能。

            二、   程序修改

            1  重載 << 操作符。(本步可以不實現)

            std::ostream& operator<<(std::ostream& os, const EXCEPTION_RECORD& red)

            {

            return os << "   Thread ID:" << GetCurrentThreadId()

            << "   ExceptionCode: " << red.ExceptionCode << "\n"

            << "   ExceptionFlags: " << red.ExceptionFlags << "\n"

            << "   ExceptionAddress: " << red.ExceptionAddress << "\n"

            << "   NumberParameters: " << red.NumberParameters;

            }

                  

            2  實現UnhandledExceptionFilter

            #include "minidmp.h"

            LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

            {

            CreateMiniDump(pExceptionInfo, L"Exception.dmp");

                       std::cerr << "未知錯誤:" << (*pExceptionInfo->ExceptionRecord) << std::endl;

                       exit(pExceptionInfo->ExceptionRecord->ExceptionCode);

                      

                       return EXCEPTION_EXECUTE_HANDLER;  // 程序停止運行

            }

            3  在異常發生之前調用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

            通常在Main()函數開始時調用即可。

            4  CreateMiniDump()函數在minidmp.h頭文件中定義,文件如下:

            #pragma once

            #include <windows.h>

            #include <imagehlp.h>

            #include <stdlib.h>

            #pragma comment(lib, "dbghelp.lib")

             

            inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)

            {

              if(pModuleName == 0)

              {

                 return FALSE;

              }

             

              WCHAR szFileName[_MAX_FNAME] = L"";

              _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);

             

              if(wcsicmp(szFileName, L"ntdll") == 0)

                 return TRUE;

             

              return FALSE;

            }

             

            inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,

                                            const PMINIDUMP_CALLBACK_INPUT   pInput,

                                            PMINIDUMP_CALLBACK_OUTPUT        pOutput)

            {

              if(pInput == 0 || pOutput == 0)

                 return FALSE;

             

              switch(pInput->CallbackType)

              {

              case ModuleCallback:

                 if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

                     if(!IsDataSectionNeeded(pInput->Module.FullPath))

                        pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

              case IncludeModuleCallback:

              case IncludeThreadCallback:

              case ThreadCallback:

              case ThreadExCallback:

                 return TRUE;

              default:;

              }

             

              return FALSE;

            }

             

            inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)

            {

              HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,

                 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

             

              if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

              {

                 MINIDUMP_EXCEPTION_INFORMATION mdei;

                 mdei.ThreadId           = GetCurrentThreadId();

                 mdei.ExceptionPointers  = pep;

                 mdei.ClientPointers     = FALSE;

                 MINIDUMP_CALLBACK_INFORMATION mci;

                 mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

                 mci.CallbackParam       = 0;

                 MINIDUMP_TYPE mdt       = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |

                     MiniDumpWithDataSegs |

                     MiniDumpWithHandleData |

                     0x00000800 /*MiniDumpWithFullMemoryInfo*/ |

                     0x00001000 /*MiniDumpWithThreadInfo*/ |

                     MiniDumpWithUnloadedModules);

                 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

                     hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);

             

                 CloseHandle(hFile);

              }

            }

            三、   注意事項

            1  可執行文件(exe)必須找到dbghelp.dll,才能生成Dump文件。這個DLL可以從調試工具包中找到。

            2  當異常代碼定位成功以后,如果無法阻止異常的產生,可以用 __try 結構包裝異常代碼,__try try 不同,前者可以捕獲非法指針產生的異常。

            __try {

            // 會異常的函數

            }

            __except( EXCEPTION_EXECUTE_HANDLER ){

            // 異常處理

            }

             

            參考文檔:

            http://blog.csdn.net/ArCoolGG/archive/2007/04/05/1553027.aspx

            http://www.debuginfo.com/articles/effminidumps.html

             

            posted on 2009-10-21 18:52 肥仔 閱讀(9373) 評論(0)  編輯 收藏 引用 所屬分類: 調試

            久久99国产精品99久久| 久久久久高潮毛片免费全部播放 | 国产一久久香蕉国产线看观看| 久久se精品一区二区影院| 国内精品伊人久久久久av一坑| 亚洲av日韩精品久久久久久a| 国内精品伊人久久久影院 | jizzjizz国产精品久久| avtt天堂网久久精品| 久久电影网一区| 青青青国产成人久久111网站| 91久久国产视频| 激情久久久久久久久久| 欧美色综合久久久久久| 思思久久99热只有频精品66| 精品国产乱码久久久久软件| 精品多毛少妇人妻AV免费久久| 无码人妻精品一区二区三区久久| 久久久久女人精品毛片| 久久精品成人国产午夜| 精品人妻伦九区久久AAA片69| 性做久久久久久久久浪潮| 77777亚洲午夜久久多人| 国内精品久久久久影院免费| 91久久成人免费| 久久99精品国产麻豆宅宅| 日韩精品久久无码人妻中文字幕 | 久久精品亚洲日本波多野结衣| 国产精品久久波多野结衣| 色偷偷88欧美精品久久久| 久久久久久午夜成人影院| 亚洲国产精品久久久久久| 亚洲人成电影网站久久| 国产精品久久久久jk制服| 香蕉99久久国产综合精品宅男自 | 国产成人精品久久综合| 狠狠色丁香久久婷婷综合_中| 国产精品久久久久久福利69堂| 亚洲国产成人乱码精品女人久久久不卡| 老男人久久青草av高清| 91久久精品国产91性色也|