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

            www久久久天天com| 久久亚洲sm情趣捆绑调教| 日韩精品久久久肉伦网站| 99久久精品国产一区二区| 国产三级久久久精品麻豆三级| 青青青伊人色综合久久| 久久亚洲中文字幕精品一区| 久久精品国产AV一区二区三区| 国产情侣久久久久aⅴ免费| 国产激情久久久久影院小草| 久久热这里只有精品在线观看| 国产99精品久久| 一本久久知道综合久久| 久久精品国产精品亚洲| 无码人妻精品一区二区三区久久久| 久久综合欧美成人| 无码国产69精品久久久久网站| 精品久久人人做人人爽综合| 久久夜色精品国产噜噜亚洲AV| 久久精品夜色噜噜亚洲A∨ | 久久久久久国产精品无码超碰| 国产一区二区精品久久凹凸| 久久精品国产亚洲AV久| 理论片午午伦夜理片久久 | 久久久久一级精品亚洲国产成人综合AV区 | 久久天天躁狠狠躁夜夜不卡 | 久久久久亚洲AV无码专区网站| 国产午夜免费高清久久影院| 久久精品一区二区三区AV| 日本精品久久久久中文字幕| 99久久精品午夜一区二区| 亚洲精品国产字幕久久不卡 | 久久综合噜噜激激的五月天| 色天使久久综合网天天| 欧美粉嫩小泬久久久久久久 | 久久精品国产WWW456C0M| 99久久精品费精品国产| 91久久成人免费| 精品乱码久久久久久夜夜嗨| 国内精品久久久久久久影视麻豆| 伊人久久综在合线亚洲2019|