1. 程式人生 > >使用dmp檢視程式崩潰資訊

使用dmp檢視程式崩潰資訊

#include "DbgHelp.h"
typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
                                               CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
                                                CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
                                                CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
 
long CSE_Exception::_DbgDumpError(struct _EXCEPTION_POINTERS *excpInfo, LPCTSTR szPrex )
{
 
     LONG retval = EXCEPTION_CONTINUE_SEARCH;
 
     HMODULE hDll = ::LoadLibrary(_T("DBGHELP.DLL"));
     LPCTSTR szResult = NULL;
     MINIDUMPWRITEDUMP pDump = NULL;
 
     if (hDll)
         pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll,"MiniDumpWriteDump");
 
     if (pDump)
     {
         TCHAR szDumpPath [_MAX_PATH] = {0};
         TCHAR szDumpFile [_MAX_PATH] = {0};
         GetModuleFileName(NULL, szDumpPath, _MAX_PATH);
         _tcsrchr(szDumpPath, _T('\\'))[1] = 0;
         _tcscat(szDumpPath, _T("..\\logs\"));
 
         time_t timeCurrent = time(0);
         struct tm* tmc = localtime(&timeCurrent);
         if ( tmc )
              _stprintf(szDumpFile, _T("%s%d_%d_%d_%d_%d.dmp"), szPrex, tmc->tm_mon+1, tmc->tm_mday, tmc->tm_hour, tmc->tm_min, tmc->tm_sec);
         else
              _tcscpy(szDumpFile, _T("error.dmp"));
         _tcscat(szDumpPath, szDumpFile);
 
         // create the file
         HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
              FILE_ATTRIBUTE_NORMAL, NULL );
 
         if (hFile!=INVALID_HANDLE_VALUE)
         {
              if (excpInfo == NULL) //如果沒有傳入異常, 比如是在程式裡面呼叫的, 生成一個異常
              {
                   // Generate exception to get proper context in dump
                  
                   DWORD dwSize = 0;
                   char *sz = "_EXCEPTION_POINTERS is null";
                   ::WriteFile(hFile, sz, strlen(sz), &dwSize, NULL);
              }
              else
              {
                   MINIDUMP_EXCEPTION_INFORMATION eInfo;
                   eInfo.ThreadId = GetCurrentThreadId(); //把需要的資訊添進去
                   eInfo.ExceptionPointers = excpInfo;
                   eInfo.ClientPointers = FALSE;
 
                   // Dump的型別是小型的, 節省空間. 可以參考MSDN生成更詳細的Dump.
                   pDump(
                       GetCurrentProcess(),
                       GetCurrentProcessId(),
                       hFile,
                       MiniDumpNormal,
                       excpInfo ? &eInfo : NULL,
                       NULL,
                       NULL);
              }
              ::CloseHandle(hFile);
 
         }
     }
     if( hDll )
         ::FreeLibrary(hDll);
 
     return retval;
}
 
 
void CSE_Exception::InitSEException()
{
     _set_se_translator( CSE_Exception::trans_func );
}
 
void CSE_Exception::_DumpCallStack()
{
     __try
     {
         __try
         {
              RaiseException(1, 0, 0, NULL);
         }
         __finally
         {
         }
     }
     __except(_DbgDumpError(GetExceptionInformation(), _T("T")),
         EXCEPTION_CONTINUE_EXECUTION)
     {
     }
}
 
void CSE_Exception::trans_func( unsigned int uSENum, _EXCEPTION_POINTERS* pExp )
{
#define SE_BUF_SIZE         250
     TCHAR pszBuf[SE_BUF_SIZE+2];
 
     _DbgDumpError(pExp, _T("e"));
     switch(uSENum)
     {
     case EXCEPTION_ACCESS_VIOLATION:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("Access Violation: IP: 0xX %s Address: 0xX"),
              pExp->ExceptionRecord->ExceptionAddress, pExp->ExceptionRecord->ExceptionInformation[0]?_T("Write"):_T("Read"), pExp->ExceptionRecord->ExceptionInformation[1]);
         break;
     case EXCEPTION_INT_DIVIDE_BY_ZERO:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("INT_DIVIDE_BY_ZERO"));
         break;
     case EXCEPTION_FLT_DIVIDE_BY_ZERO:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("FLT_DIVIDE_BY_ZERO"));
         break;
     case EXCEPTION_ILLEGAL_INSTRUCTION:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("ILLEGAL_INSTRUCTION"));
         break;
     case EXCEPTION_PRIV_INSTRUCTION:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("EXCEPTION_PRIV_INSTRUCTION"));
         break;
     case EXCEPTION_STACK_OVERFLOW:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("EXCEPTION_STACK_OVERFLOW"));
         break;
     default:
         _sntprintf(pszBuf, SE_BUF_SIZE, _T("Unknown SE_exception: X"), uSENum);
         break;
     }
 
     CSE_Exception e(pszBuf);
     e.m_nSENumber = uSENum;
     e.m_SERecord  = *(pExp->ExceptionRecord);
     e.m_SEContext  = *(pExp->ContextRecord);
 
     throw e;
}
 
然後在程式的InitInstance中加入程式碼如下:
LONG WINAPI DbgUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
     CSE_Exception::_DbgDumpError(pExceptionInfo, _T("E"));
     return EXCEPTION_CONTINUE_SEARCH;    // 程式停止執行
}
BOOL CDCPWorkerApp::InitInstance()
{
     //EHA
     CSE_Exception::InitSEException();
     //捕獲未處理的異常
     SetUnhandledExceptionFilter(DbgUnhandledExceptionFilter);
}

相關推薦

使用dmp檢視程式崩潰資訊

#include "DbgHelp.h" typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,

Android將程式崩潰資訊儲存本地檔案

我們先建立一個crash專案,專案結構如圖: 瞭解以下兩個類:android.app.Application和java.lang.Thread.UncaughtExceptionHandler。 Application:用來管理應用程式的全域性狀態。在應用程

windbg載入dmp檔案 跟蹤記憶體洩漏或程式崩潰位置 ntdll.pdb缺少

前提:將要除錯的exe 檔案,pdb檔案,dmp檔案拷貝到同一路徑下   E:\test_projects\ConsoleApplication3\Debug;srv*E:\test_projects\ConsoleApplication3\Debug*https://msdl.m

Android 如何收集已釋出程式崩潰資訊

class MythouCrashHandler implements UncaughtExceptionHandler {     private static final String TAG = "MythouCrashHandler---->";     private UncaughtEx

java 遇到未知異常使程式崩潰,輸出jvm的dump崩潰資訊到指定檔案,然後殺死此程序

1.我們首先需要獲取當前java程序的pid。方法為: //檢視當前程序pid private static void getPID(){ RuntimeMXBean runtime = ManagementFactory.ge

利用Windows自帶的功能當程式崩潰時產生崩潰轉儲檔案(dmp)

 何志丹 以管理員身份 執行 :OpenDump.bat 其本質是寫登錄檔。 執行後: 任何程式崩潰都會在C:\CrashDump 產生dmp檔案(比較大,約50到200M)。 至少在Win7、Win10的電腦,Win10的平板上執行正確。 OpenDump.bat @e

android程式崩潰了卻沒法通過log檢視錯誤日誌

接一個bugly就可以了,在bugly上直接檢視錯誤資訊。BUGLY的文件寫的很清楚,流程我就不寫了,附上鍊接:https://cas.bugly.qq.com/cas/login?service=https%3A%2F%2Fbugly.qq.com%2Fv2%2Fworkb

Android下音訊的測試程式tinyalsa(錄音,放音,檢視音效卡資訊)

目前Linux中主流的音訊體系結構是ALSA(Advanced Linux Sound Architecture),ALSA在核心驅動層提供了alsa-driver,在應用層提供了alsa-lib,應用程式只需要呼叫alsa-lib提供的API就可以完成對底層硬體的操作。說的這麼好,但是Android中沒有使

程式除錯的時候利用Call Stack視窗檢視函式呼叫資訊

http://blog.csdn.net/augusdi/article/details/6407422 http://blog.csdn.net/zhg598242449/article/details/7591123 首先介紹一下什麼叫呼叫堆疊:假設我們有幾個函式

檢視程式中的控制代碼資訊

以管理員許可權開啟SysinternalsSuite中的procexp.exe 工具欄上右鍵-Select Columns,Handle全選 設定View-Update Speed-Paused

XZ_iOS之崩潰資訊檢視,呼叫堆疊的除錯技巧

寫一個demo,製造一個崩潰資訊:嘗試給NSArray在第一個位置插入一個空物件;以此為例,查詢崩潰的原因。 下圖中的崩潰資訊有一個標準的名字叫呼叫堆疊,既然是堆疊,那麼先執行的肯定在下面,後執行的在上面。 在真機上只顯示錯誤資訊,不顯示詳細的呼叫堆疊內容

nm 命令 程式符號資訊檢視

用途 顯示關於物件檔案、可執行檔案以及物件檔案庫裡的符號資訊。 語法 nm [ -A ] [ -C ] [ -X {32|64|32_64}] [ -f ] [ -h ] [ -l ] [ -p ] [ -r ] [ -T ] [ -v ] [ -B

C++程式崩潰時,生成dmp除錯檔案

包含如下標頭檔案 和 引用Lib庫 #include <dbghelp.h> #pragma comment(lib, "dbghelp.lib")定義 LONG WINAPI MyUnh

在Linux中如何利用backtrace資訊解決程式崩潰的問題

一、導讀 在程式除錯過程中如果遇到程式崩潰宕機的情況下我們通常多是通過出問題時的棧資訊來找到出錯的地方,這一點我們在除錯一些高

使用ReadFile程式崩潰的原因

在使用這個函式的時候,很多人都不會特意的去看MSDN文件後面的Remarks解釋,所以可能有時候會出問題,而且不知道出在哪裡。 這個函式的其它引數就不詳細解釋了,就說說lpNumberOfBytesRead這個引數。 MSDN原文:When a read operation reac

MySQL檢視資料庫相關資訊

使用的MySQL時,需要了解當前資料庫的情況,例如當前的資料庫大小,字符集,使用者等等。下面總結了一些檢視資料庫相關資訊的命令 1:檢視顯示所有資料庫 mysql > show databases; + - ------------------ + | 資料庫

異常統計- IOS 收集崩潰資訊 NSException類

首先我們看下NSException NSException是什麼? 最熟悉的陌生人,這是我對NSException的概述,為什麼這麼說呢?其實很多開發者接觸到NSException的頻率非常頻繁,但很多人都不知道什麼是NSException,不知道如何使用NSException。下面從一張截

linux dmesg 檢視系統故障資訊

    dmesg 可以檢視linux 核心資訊 dmesg’命令裝置故障的診斷是非常重要的。在‘dmesg’命令的幫助下進行硬體的連線或斷開連線操作時,我們可以看到硬體的檢測或者斷開連線的資訊。‘dmesg’命令在多數基於Linux和Unix的作業系統中都可以使用。  

python CTP 8193 心跳超時程式崩潰解決方法——8193錯誤

終於,終於,終於!!!! 博主千辛萬苦把CTP 8193心跳超時導致程式崩潰的問題解決了!!!!!經歷了一天一夜的測試後,第二天親眼看到CTP返回了8193錯誤後,我的程式沒有崩潰!第二天早上9:00一到,又自己正常運行了。敲開心~~~ 博主的血淚史,就是搜遍國內外全網,不止博主一個人遇到8

安卓獲取手機裝置硬體、系統、程式資訊

真正的死亡是世界上再沒有一個人記得你。 —《尋夢環遊記》 分類 文章目錄 一、獲取手機系統資訊 1、獲取手機型號 2、獲取