<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    程序自動生成Dump文件

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    前言:通過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::ostreamoperator<<(std::ostreamosconst EXCEPTION_RECORDred)

    {

    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(pExceptionInfoL"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 WCHARpModuleName)

    {

      if(pModuleName == 0)

      {

           return FALSE;

      }

     

      WCHAR szFileName[_MAX_FNAME] = L"";

      _wsplitpath(pModuleNameNULLNULLszFileNameNULL);

     

      if(wcsicmp(szFileNameL"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_POINTERSpepLPCTSTR strFileName)

    {

      HANDLE hFile = CreateFile(strFileNameGENERIC_READ | GENERIC_WRITE,

           0, NULLCREATE_ALWAYSFILE_ATTRIBUTE_NORMALNULL);

     

      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(),

                hFilemdt, (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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全