C 程式儲存dump檔案

2021-10-24 06:20:42 字數 3499 閱讀 4976

程式異常崩潰前使用此類為程序建立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...