程式異常時通過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; 方案二