封裝了乙個c++類,當程式意外崩潰的時候可以生成dump檔案,以便確定錯誤原因。
標頭檔案:
1實現檔案://crash_dumper_w32.h23
#ifndef _crash_dumper_h_45
#define _crash_dumper_h_67
8 #include 9
10class
crashdumper
1112;29
3031
namespace
3233
3738
#endif
1**很簡單,唯一需要提一下的是下面的一句**,這個技巧是為了解決當crash_dumper_w32.cpp檔案被編譯成單獨的靜態庫在程式中使用不起作用的問題。crash_dumper_w32.cpp23
45 #include 6
7 #include 8
9 #include 10
11 #include
1213
1415 #include "
crash_dumper_w32.h"16
1718
19#ifdef unicode
2021
# define tstring wstring
2223
#else
2425 # define tstring string
2627
#endif
2829
3031
#pragma comment(lib, "dbghelp.lib")
3233
3435
crashdumper dumper;
3637
3839
crashdumper::crashdumper()
4041
4647
4849 crashdumper::~crashdumper()
5051
5657
5859 long winapi crashdumper::exceptionfilter(struct _exception_pointers*exceptioninfo)
6061
104105
106107
closehandle(hfile);
108109
}110
111}
112113
114115
closehandle(hprocess);
116117
}118
119120
121if
(bdumpok)
122123 messagebox(null, text("
本程式遇到未處理的異常,minidump檔案已經生成在程式的執行目錄。
"), text("提示"
), mb_ok);
124125
else
126127 messagebox(null, text("
本程式遇到未處理的異常,生成minidump檔案失敗。
"), text("提示"
), mb_ok);
128129
130131
return
exception_execute_handler;
132133
}134
135136
bool crashdumper::_placeholder()
namespace
之所以在靜態庫中.cpp中的**不起作用,是因為沒有**去呼叫crash_dumper_w32.cpp的**,鏈結的時候就被編譯器給丟掉了。上面的語句在匿名空間中定義了乙個變數,這樣,每乙個包含它的.cpp檔案就「被迫」建立了乙個不可訪問的bplaceholder變數,而該變數又必須使用crashdumper::_placeholder()函式來初始化。crash_dumper_w32.cpp檔案的**就被強制鏈結進來了。
此外,如果是服務型別的程式,還可以在異常處理函式中增加自動啟動新例項的功能,以保證服務不間斷。
SecureCRT自動記錄日誌
現在管理的資料庫數量多,實時性強,經常遇到資料庫突發事件,每次做的關鍵步驟操作我都保留乙份日誌,把所有的操作和輸出的內容保留下來,一方面是處理完畢問題之後能做總結,看看處理過程中是否存在問題,提高自己的處理問題的能力。另一方面可以給客戶乙個記錄,保留當時的資訊。但是問題出現了,經常在情急之下總是忘記...
C 記錄程式崩潰時的dumpfile
新上線的軟體在外場偶爾會出現異常崩潰的情況。由於試用範圍比較分散,很難一一前往現場定位問題。而傳統的log日誌方法,在崩潰的情況下,並不能比較準確的表示出問題位置,這使得軟體除錯程序緩慢。後在公司前輩的指點下,我們想到了使用window自帶的dumpfile來記錄崩潰時刻的堆疊資訊,這樣配合log日...
陣列動態規劃,變數自動記錄
在學生體結構中,不需要從鍵盤直接獲得學生人數,而是從鍵盤輸入學生資訊,自動記錄人數 基礎 include using namespace std 函式原型 struct student int maxint student array,int number return location void ...