• <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久久精品免费看国产免费| 久久亚洲AV成人无码国产| 久久精品国产第一区二区| 人人狠狠综合久久亚洲高清| 香蕉久久AⅤ一区二区三区| 免费精品久久天干天干| 久久香综合精品久久伊人| 老色鬼久久亚洲AV综合| 欧美亚洲色综久久精品国产| 日韩精品久久无码中文字幕| 久久免费国产精品| 久久99国产精品久久99| 大美女久久久久久j久久| 久久影视国产亚洲| 久久777国产线看观看精品| 国产亚洲美女精品久久久久狼| 亚洲精品无码久久久久去q| 国内精品人妻无码久久久影院 | 久久ww精品w免费人成| 精品乱码久久久久久久| 亚洲精品午夜国产va久久| 青青草国产97免久久费观看| 亚洲一区二区三区日本久久九| 久久伊人精品一区二区三区| 久久精品人人做人人爽电影| 久久午夜综合久久| 久久亚洲日韩精品一区二区三区| 大蕉久久伊人中文字幕| 69久久夜色精品国产69| 亚洲乱码精品久久久久.. | 免费无码国产欧美久久18| 丰满少妇人妻久久久久久4| 香港aa三级久久三级| 亚洲综合精品香蕉久久网97| 狠狠色婷婷久久综合频道日韩| 青草国产精品久久久久久| 无码AV波多野结衣久久| 久久人人爽人人爽人人片av麻烦 | 久久人妻少妇嫩草AV蜜桃| 模特私拍国产精品久久|