• <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 肥仔 閱讀(9379) 評論(0)  編輯 收藏 引用 所屬分類: 調試

            色综合久久天天综合| 中文字幕无码久久人妻| 亚洲av伊人久久综合密臀性色 | 久久久一本精品99久久精品88| 亚洲综合熟女久久久30p| 久久亚洲欧美国产精品| 99久久免费国产精品| 久久综合色老色| 久久精品国产福利国产秒| 久久人人爽人人精品视频| 久久久久久毛片免费播放| 久久久久国产一区二区三区| 中文字幕久久久久人妻| 精品久久久久久国产三级| 国产偷久久久精品专区| 久久国产精品国语对白| 精品久久久久久国产潘金莲| 性欧美大战久久久久久久| 国产精品久久成人影院| 免费精品久久天干天干| 久久WWW免费人成—看片| 97超级碰碰碰久久久久| 欧美日韩久久中文字幕| 久久天天躁狠狠躁夜夜不卡| 久久精品国产一区| 国产精品99久久99久久久| 一本色道久久HEZYO无码| 亚洲国产精品狼友中文久久久| 色偷偷888欧美精品久久久| 久久w5ww成w人免费| 色欲av伊人久久大香线蕉影院| 久久福利资源国产精品999| 九九久久精品国产| 国产高清美女一级a毛片久久w| 97r久久精品国产99国产精| 久久综合给合久久狠狠狠97色 | 久久久久久亚洲AV无码专区| 久久久久久久女国产乱让韩| 免费一级做a爰片久久毛片潮| 久久九色综合九色99伊人| 久久久久18|