1. 程式人生 > >程式異常時通過dump檔案記錄下異常的詳細資訊

程式異常時通過dump檔案記錄下異常的詳細資訊

在開發過程中經常遇到這種情況,程式在客戶那裡執行的時候會偶然的出現異常,而在開發環境裡卻很難重現問題導致排查問題非常困難,通過下面的方法可以通過dump檔案將出現異常時的程序dump記下來,事後通過windbg等除錯工具分析問題的詳細過程。

首先在程序的入口處設定捕獲未處理異常,在異常處理回撥裡記錄記憶體dump,完成後退出程序,因為本程序記錄dump會導致dump不準確,我們通過另外一個程序來記錄dump。

獲取到dump檔案後通過windbg開啟,kv顯示呼叫棧,找到我們感興趣的異常資訊,這個函式的引數記錄異常的詳細資訊,通過這個引數就能獲取到異常的詳細資訊。



未處理異常回調:

long __stdcall unhandle_exception_filter( _EXCEPTION_POINTERS *msg)
{
	WriteErrorLogA("unhandle error");
	mstring path;
	GetModuleFileNameA(NULL, path.alloc(MAX_PATH), MAX_PATH);
	PathAppendA(path.alloc(MAX_PATH), "..//error_log");
	path.setbuffer();
	SHCreateDirectoryExA(NULL, path, NULL);
	mstring file;
	SYSTEMTIME time;
	GetSystemTime(&time);

	file.format(
		"%hs\\%04d%02d%02d%02d%02d%02d_%08x.dmp",
		path.c_str(),
		time.wYear,
		time.wMonth,
		time.wDay,
		time.wHour,
		time.wMinute,
		time.wSecond,
		GetTickCount());
	
	mstring tmp;
	GetModuleFileNameA(NULL, tmp.alloc(MAX_PATH), MAX_PATH);
	PathAppendA(tmp.alloc(MAX_PATH), "..\\memlog.exe");
	tmp.setbuffer();
	mstring mem;
	mem.format("%hs %d \"%hs\"", tmp.c_str(), GetCurrentProcessId(), file.c_str());

	//create_mem_log(GetCurrentProcessId(), file.c_str());
	STARTUPINFOA si = { sizeof(si) };   
	PROCESS_INFORMATION pi;   
	si.dwFlags = STARTF_USESHOWWINDOW;   
	si.wShowWindow = TRUE;
	BOOL ret = CreateProcessA(   
		NULL,  
		(char *)(mem.c_str()), 
		NULL,   
		NULL,   
		FALSE,   
		CREATE_NEW_CONSOLE,   
		NULL,   
		NULL,   
		&si,   
		&pi);   
	
	if (!ret)
	{
		WriteErrorLogA("create mem process error\n");
	}
	else
	{
		WaitForSingleObject(pi.hProcess, 5000);
		//Sleep(5000);
	}
	exit(-1);
	return 0;
}
設定未處理異常回調:
int WINAPI WinMain(HINSTANCE module, HINSTANCE parent, char * cmd, int show)
{
	SetLastError(0);
	HANDLE mutex = CreateMutexA(NULL, NULL, "global/omserver/mutex");
	if (ERROR_ALREADY_EXISTS == GetLastError())
	{
		MessageBoxA(0, "omserver已經啟動", "error", 0);
		return 0;
	}

	SetUnhandledExceptionFilter(unhandle_exception_filter);
}
獨立程序記錄異常資訊:
void create_mem_log(int pid, const char *path)
{
	HANDLE dump = NULL;
	SYSTEMTIME time = {0};
	HANDLE h = NULL;

	do 
	{
		dump = CreateFileA(
			path,
			GENERIC_WRITE,
			0,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);

		if (!dump || INVALID_HANDLE_VALUE == dump)
		{
			WriteErrorLogA("create dump file error\n");
			break;
		}

		MINIDUMP_EXCEPTION_INFORMATION mini_dump_info;
		mini_dump_info.ExceptionPointers = NULL;
		mini_dump_info.ThreadId = GetCurrentThreadId();
		mini_dump_info.ClientPointers = TRUE;
		h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

		if (!h || INVALID_HANDLE_VALUE == h)
		{
			WriteErrorLogA("open process error\n"); 
			break;
		}

		if (!MiniDumpWriteDump(
			h,
			pid,
			dump,
			MiniDumpNormal,
			NULL,
			NULL,
			NULL))
		{
			WriteErrorLogA("write dump file error, error = %d\n", GetLastError());
			break;
		}
	} while (FALSE);

	if (dump && INVALID_HANDLE_VALUE != dump)
	{
		CloseHandle(dump);
	}

	if (h && INVALID_HANDLE_VALUE != h)
	{
		CloseHandle(h);
	}
	return; 
}

相關推薦

程式異常通過dump檔案記錄異常詳細資訊

在開發過程中經常遇到這種情況,程式在客戶那裡執行的時候會偶然的出現異常,而在開發環境裡卻很難重現問題導致排查問題非常困難,通過下面的方法可以通過dump檔案將出現異常時的程序dump記下來,事後通過windbg等除錯工具分析問題的詳細過程。 首先在程序的入口處設定捕獲未處

程式崩潰生成Dump檔案

Dump檔案是程序的記憶體映象,可以把程式執行時的狀態完整的儲存下來,之後通過除錯工具可查出崩潰大致原因。 SetUnhandledExceptionFilter()設定一個在程式崩潰時被呼叫的回撥函式。MiniDumpWriteDump()建立Dump檔案。 我寫了一個

Winows程式崩潰自動建立Dump檔案以方便跟蹤問題

首先定義一個預設的異常處理回撥函式: LONG CrashHandler(struct_EXCEPTION_POINTERS* pExceptionInfo) { std::string dumpFileName = "./CrashDump.dump"; H

python程式,多個包檔案場景出現的bug排查記錄

class a(b):    a.function()   AttributeError::object has no attribute   class b裡頭有定義這個方法的 經排查,原來拷貝程式碼錯誤,b的檔案自身有

異常通過Spring aop 記錄日誌重複多次記錄問題

異常現象 最近發現新上線的一個專案中日誌記錄有問題,正常每次呼叫應該只記錄一次日誌的,在日誌記錄表內發現有許多請求都有十來條記錄,並且記錄的更新時間距離寫入時間有十來分鐘的,也有超過一天的。 異常分析       分析原始碼發現,整個記錄日誌的模組通過Spring ao

C++之程式奔潰建立DUMP檔案(VS2015)

//建立標頭檔案DumpFile.h, 將下列程式碼放進檔案中 #pragma once #include <windows.h> #include <Dbghelp.h> #include <iostream> #in

使用WinDbg抓取程式報錯的Dump檔案,例如抓取IE崩潰的Dump

 前幾天分享了一個關於如何抓藍屏Dump的帖子,今天再和大家分享一個使用WinDbg來抓取程式崩潰的Dump。有了Dump後,我們可以很迅速的解決問題,比如說IE崩潰,QQ崩潰,很多時候我們是一點頭緒都沒有的,但是有了WinDbg後,這一切將變的簡單!雖然WinDbg

Android程式執行許可權與檔案系統許可權,與普通許可權及危險許可權的區別

面試時遇到這樣的題目   問題來的太突然,完全沒有準備,結果我想到了android 6.0之後推出的 normal permissions 和 dangerous permissions 並且把這兩者之間的關係答了一下,而且還舉了個例子,現在想想,真是丟人 關於普通

文字檔案記錄了使用者搜尋資訊,找到前top 10資訊

一個文字檔案,檔案很大,記錄了使用者搜尋關鍵詞,按照搜尋時間寫進文字,要求統計出其中最頻繁出現的前10個詞,請給出思想。 建立Trie樹,記錄每顆樹的出現次數,O(n*le); le:平均查詢長度 維護一個10的小頂堆,O(n*lg10); 總複

學習java執行緒狀態和看懂thread dump檔案中的執行緒資訊

執行緒的狀態是一個很重要的東西,因此thread dump中會顯示這些狀態,通過對這些狀態的分析,能夠得出執行緒的執行狀況,進而發現可能存在的問題。執行緒的狀態在Thread.State這個列舉型別中定義: public enum State { /

Lucene筆記16-Lucene的分詞-通過TokenStream顯示分詞的詳細資訊

一、通過TokenStream檢視分詞的詳細資訊 package com.wsy; import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.standard.StandardAnalyzer; impor

如何在程式異常或者崩潰產生一個dump檔案

核心API是: CreateFile() MinDumpWriteDump() 需要包含標頭檔案: #include <DbgHelp.h> #pragma comment(lib, "d

在win10系統,學習微信的小程式開發遇到的問題,記錄一下解決經過

今天剛更新完win10系統下微信開發者工具v1.02.1810250版本,開啟開發者工具建立小程式,進入沒有看到專案,模擬器也無法正常顯示,大致如下圖. 開啟小程式所在的目錄卻能看見專案確實已經建立,但工具裡面沒顯示出來   匯入之前的打好的專案和官方的demo也沒

windows程式崩潰自動生成dump檔案方法

  /****************第一步新增createdump.h********************************* 新增一個頭檔案:createdump.h #pragma once #include <windows.h> #inclu

windows整合ngrok、nginx、tomcat使外網訪問本機靜態檔案及專案(開發微信小程式測試可用此種方式訪問)

        最近在研究微信小程式,小程式內的靜態檔案不能通過IP+埠號的方式獲取,只能使用域名的方式,並且要求是https協議,雖然在開發階段可以使用http協議,但是針對沒有域名的我們,可以使用如下方式進行開發:        前提條件需要調通tomcat下的專案,使

windows 應用程式崩潰的記憶體轉儲及dump檔案的分析

1、在現場設定程式崩潰時的自動記憶體轉儲,得到dump檔案        在windows 登錄檔如下項:      //HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/AeDebug

自定義VS程式異常處理及除錯Dump檔案(一)

1. Dump檔案 1. Dump檔案介紹 Dump檔案(Dump File),也叫轉儲檔案,以.DMP為檔案字尾。dump檔案是程序在記憶體中的映象檔案,通過轉換然後儲存成以.DMP字尾的檔案。dump檔案根據儲存時的選項不同,會生成不同大小的檔案,其

編寫的windows程式,崩潰產生crash dump檔案的辦法

一、引言 dump檔案是C++程式發生異常時,儲存當時程式執行狀態的檔案,是除錯異常程式重要的方法,所以程式崩潰時,除了日誌檔案,dump檔案便成了我們查詢錯誤的最後一根救命的稻草。windows程式產生dump檔案和linux程式產生dump檔案的方式不一樣,linux預

第一次使用linux並編寫了一個dump mysql的程式記錄簡單的步驟

機器安裝linux redhat5.0 64位。客戶管理員給了我賬戶密碼,我用SecureCRT登入。 連線後: ls  列表檔案,當然支援萬用字元 cd path 進入某個目錄   *SecureCRT中可以像window一樣複製路徑,比較方便。 cd .. 返回上層 c

maven中pom檔案已經載入到jar包但是在程式釋出jar包卻沒有加入到lib

maven中pom檔案已經載入到jar包但是在程式釋出時jar包卻沒有加入到動態web專案lib下: 方案一: 1.專案工程右鍵->maven->update project; 方案二