程式異常崩潰前使用此類為程序建立dump檔案,之後可以使用windbg等工具進行分析。
using system;using system.diagnostics;
using system.io;
using system.runtime.interopservices;
namespace infrastructure
enum exceptioninfo
//typedef struct _minidump_exception_information minidump_exception_information, *pminidump_exception_information;
[structlayout(layoutkind.sequential, pack = 4)] // pack=4 is important! so it works also for x64!
struct minidumpexceptioninformation
//bool
//winapi
//minidumpwritedump(
// __in handle hprocess,
// __in dword processid,
// __in handle hfile,
// __in minidump_type dumptype,
// __in_opt pminidump_exception_information exceptionparam,
// __in_opt pminidump_user_stream_information userstreamparam,
// __in_opt pminidump_callback_information callbackparam
// );
// overload requiring minidumpexceptioninformation
[dllimport("dbghelp.dll", entrypoint = "minidumpwritedump", callingconvention = callingconvention.stdcall, charset = charset.unicode, exactspelling = true, setlasterror = true)]
static extern bool minidumpwritedump(intptr hprocess, uint processid, safehandle hfile, uint dumptype, ref minidumpexceptioninformation expparam, intptr userstreamparam, intptr callbackparam);
// overload supporting minidumpexceptioninformation == null
[dllimport("dbghelp.dll", entrypoint = "minidumpwritedump", callingconvention = callingconvention.stdcall, charset = charset.unicode, exactspelling = true, setlasterror = true)]
static extern bool minidumpwritedump(intptr hprocess, uint processid, safehandle hfile, uint dumptype, intptr expparam, intptr userstreamparam, intptr callbackparam);
[dllimport("kernel32.dll", entrypoint = "getcurrentthreadid", exactspelling = true)]
static extern uint getcurrentthreadid();
static bool write(safehandle filehandle, option options, exceptioninfo exceptioninfo)
return exp.exceptionpointers == intptr.zero ? minidumpwritedump(currentprocesshandle, currentprocessid, filehandle, (uint)options, intptr.zero, intptr.zero, intptr.zero) : minidumpwritedump(currentprocesshandle, currentprocessid, filehandle, (uint)options, ref exp, intptr.zero, intptr.zero);
}static bool write(safehandle filehandle, option dumptype)
public static boolean trydump(string dmppath, option dmptype=option.normal)
using (var fs = new filestream(path, filemode.create))}}
}
}}出處:
windbg 這個工具可以手動的來抓dump檔案,如果你想你的程式智慧型一些,當遇到你開發的程式crash時,你想程式自己抓到dump檔案,然後你去分析就可以。最近我剛好遇到這樣乙個事情,所以找了找,借助網路和論壇的朋友,才完成了這樣乙個事情。minidumpwritedump 這個win32 api 可以完成這樣乙個事情。因為現在使用的是c#,所以封裝了一下,本人對託管**呼叫那些win api也不是很了解。所以借助了一些朋友來幫忙。
我就 直接貼**出來吧,執行一下 就知道了,但到目前位置 我還麼有對這個測試程式抓到的dump進行過分析。以後在分析吧,現在的機器上沒有環境。
using system;
using system.collections.generic;
using system.text;
using system.runtime.interopservices;
using system.diagnostics;
using system.io;
using system.threading;
namespace minidump
catch
console.readkey();}}
///
/// 該類要使用在windows 5.1 以後的版本,如果你的windows很舊,就把windbg裡面的dll拷貝過來,一般都沒有問題
/// dbghelp.dll 是windows自帶的 dll檔案 。
///
public static class minidump
/** 自己包裝的乙個函式
*/public static boolean trydump(string dmppath, minidumptype dmptype)
}public enum minidumptype}}
出處:
dump檔案儲存
在windows程式發生異常時,可以在異常處理 中儲存dump檔案,或者是在開發者認為 異常時,可以在程式退出時,儲存dump檔案,主要呼叫的是windows的api函式minidumpwritedump 可以寫成這樣,可以按照自己的應用場景增加其它處理邏輯。const char file path...
C 生成dump檔案,除錯dump檔案
dump 檔案是程序的記憶體映象 可以把程式的執行狀態通過偵錯程式儲存到dump檔案中 dump 檔案是用來給驅動程式編寫人員除錯驅動程式用的 這種檔案必須用專用工具軟體開啟 比如使用 windbg visualstudio開啟 當我們的程式發布出去之後 在客戶機上是無法跟蹤自己 的 bug 的 所...
C 除錯之建立Dump檔案和除錯Dump檔案
如何在發布後程式中捕獲程式的崩潰和異常往往是比較麻煩的事情,一般採用日誌記錄的方法來記錄程式執行的每個流程,但是通常為了程式執行的效能,日誌記錄的方法只是記錄程式執行的每個主要的處理流程,不能進行具體詳細的記錄,比如for 迴圈中的崩潰記錄。c 語言中呼叫window api函式createfile...