標籤:圖片 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檔案