windows server dump檔案

來源:互聯網
上載者:User

標籤:圖片   tar   反饋   .lib   except   param   ...   std   技術   

1. mini dump:

 ***** 需要包含 dbghelp.dll 庫

 ****mini_dump.h檔案:

// reference:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ee416349(v=vs.85).aspx


#ifndef mini_dump_h__
#define mini_dump_h__


namespace minidump
{
void MiniDumpBegin(const char* app_name, const char* app_version);
}

#endif // mini_dump_h__

mini_dump.cpp檔案:

#include "mini_dump.h"

#include <windows.h>
#include <shellapi.h>

#include <string>

// Is dbghelp.h dbghelp.lib dbghelp.dll windows build-in?
#include <dbghelp.h>
#pragma comment (lib,"dbghelp.lib")

// Visual Studio 2005 compatible
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)

namespace minidump
{
// needn‘t delete
std::string* app_name = 0;

std::string* app_version = 0;

// "c:\folder1\xxx.exe" to "c:\folder1\"
std::string GetDirectory(const std::string& execution)
{
std::string path("");
size_t pos = execution.find_last_of("\\");
if (pos != std::string::npos)
path = execution.substr(0, pos + 1);
return path;
}

// Generage dump file to avoid file name collisions
std::string GetDumpFileMark()
{
SYSTEMTIME system_local_time;
GetLocalTime(&system_local_time);

char file_name[MAX_PATH];

snprintf(file_name, MAX_PATH, "%s%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
app_name->c_str(), app_version->c_str(),
system_local_time.wYear, system_local_time.wMonth, system_local_time.wDay,
system_local_time.wHour, system_local_time.wMinute, system_local_time.wSecond,
GetCurrentProcessId(), GetCurrentThreadId());

return file_name;
}

// Generate dump file whole name in GetModuleFileName()‘s directory
// Like: F:\reference\project\TestMiniDump\VsProject\build\Debug\dump\20161015-110026-8552-9344.dmp
std::string GetDumpFileName()
{
char file_path[MAX_PATH];
GetModuleFileName(NULL, file_path, MAX_PATH);

std::string path = GetDirectory(file_path);

path += "dump\\";

std::string file_mark = GetDumpFileMark();

path += file_mark;

return path;
}

MINIDUMP_EXCEPTION_INFORMATION GetExpParam(EXCEPTION_POINTERS* exception_pointers)
{
MINIDUMP_EXCEPTION_INFORMATION exp_param;
exp_param.ThreadId = GetCurrentThreadId();
exp_param.ExceptionPointers = exception_pointers;
exp_param.ClientPointers = TRUE;
return exp_param;
}

int GenerateDump(EXCEPTION_POINTERS* exception_pointers)
{
std::string dump_file_name = GetDumpFileName();

// The "\dump" whole directory
std::string dump_file_dir = GetDirectory(dump_file_name);

CreateDirectory(dump_file_dir.c_str(), NULL);

HANDLE dump_file_handle = CreateFile(dump_file_name.c_str(),
GENERIC_READ| GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
0, CREATE_ALWAYS, 0, 0);

MINIDUMP_EXCEPTION_INFORMATION exp_param =
GetExpParam(exception_pointers);

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
dump_file_handle, MiniDumpNormal, &exp_param, NULL, NULL);

return 0;
}

LONG _stdcall GolbalExceptionHandler(EXCEPTION_POINTERS* exception_pointers)
{
GenerateDump(exception_pointers);
return EXCEPTION_EXECUTE_HANDLER;
}

void IntiializeMemory()
{
app_name = new std::string();
app_version = new std::string();
}

void MiniDumpBegin(const char* app_name, const char* app_version)
{
IntiializeMemory();

*minidump::app_name = app_name;
*minidump::app_version = app_version;

SetUnhandledExceptionFilter(GolbalExceptionHandler);
}
}

使用方法,在main函數開始出,調用:MiniDumpBegin函數,

 

 2. 使用註冊表:

   opendump.bat檔案:----寫註冊表

@echo off
echo 正在啟用Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\CrashDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已經啟用
pause
@echo on

 

closedump.bat 檔案--- 刪註冊表

@echo off
echo 正在關閉Dump...
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
echo Dump已經關閉
pause
@echo on

 

使用方法:

 1. 運行 opendump.bat檔案
 2. 去開啟服務 

 

 程式出現崩潰,C:\ 會出現:

CrashDump 檔案

 

 3. 調試dump檔案 參考連結72864694

 

 開啟 Dump 檔案

雙擊開啟產生的 Dump 檔案 , 會預設用 VS2012 開啟並自動建立一個解決方案 , Dump 摘要資訊如下 :

一定要確保 進程名稱 對應的程式路徑在本地存在 , 同時確保最初產生程式的對應 .pdb 符號檔案也在目前的目錄 ;

有時從客戶那裡反饋回來的 Dump 檔案程式路徑和本地的不一致 , 需要將程式拷貝到 Dump 資訊裡面的路徑中去 ;

 

 設定 Symbols 路徑

調試檔案需要對應的符號檔案 , 我們需要設定符號檔案對應的路徑 :

在 Dump 資訊摘要右上方 , 點擊 設定符號路徑 :

推薦使用 Microsoft 符號伺服器 , 但第一次線上下載會有點慢 ; 當然也可以自己下載符號集檔案到某個路徑 , 再講符號路徑指向該路徑 :

 

設定源碼路徑

在左側的解決方案處右鍵點擊 屬性 -> 調試源檔案 , 將原始碼的路徑添加進來 , 注意一定是解決方案所在的路徑(sln) :

 

調試 Dump 檔案

準備工作已就緒 , 現在在 Dump 檔案摘要右上方點擊 使用 僅限本機 進行調試 :

如果提示 無法找到調試資訊 , 或者調試資訊不匹配 , 無法尋找或開啟 PDB 檔案 , 說明沒有將最初產生程式的對應 .pdb 符號檔案放在偵錯工具所在的目錄 , 或者 .pdb 符號檔案與當前的程式版本不匹配 ;

程式會重現當時崩潰前的呼叫堆疊 , 如所示 :

可以看出程式已經定位到了崩潰前的那一行代碼 , 非常方便排查 ;

 

4. 使用完成後,還原註冊表,運行closedump.bat檔案。

 

5. 刪除 C盤下的 CrashDump 檔案。

 

windows server dump檔案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.