C#程序保存dump文件
作用
程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析。
辅助类代码
using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices;namespace Infrastructure {public static class MiniDump{// Taken almost verbatim from http://blog.kalmbach-software.de/2008/12/13/writing-minidumps-in-c/[Flags]public enum Option : uint{// From dbghelp.h:Normal = 0x00000000,WithDataSegs = 0x00000001,WithFullMemory = 0x00000002,WithHandleData = 0x00000004,FilterMemory = 0x00000008,ScanMemory = 0x00000010,WithUnloadedModules = 0x00000020,WithIndirectlyReferencedMemory = 0x00000040,FilterModulePaths = 0x00000080,WithProcessThreadData = 0x00000100,WithPrivateReadWriteMemory = 0x00000200,WithoutOptionalData = 0x00000400,WithFullMemoryInfo = 0x00000800,WithThreadInfo = 0x00001000,WithCodeSegs = 0x00002000,WithoutAuxiliaryState = 0x00004000,WithFullAuxiliaryState = 0x00008000,WithPrivateWriteCopyMemory = 0x00010000,IgnoreInaccessibleMemory = 0x00020000,ValidTypeFlags = 0x0003ffff,}enum ExceptionInfo{None,Present}//typedef struct _MINIDUMP_EXCEPTION_INFORMATION {// DWORD ThreadId;// PEXCEPTION_POINTERS ExceptionPointers;// BOOL ClientPointers;//} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;[StructLayout(LayoutKind.Sequential, Pack = 4)] // Pack=4 is important! So it works also for x64!struct MiniDumpExceptionInformation{public uint ThreadId;public IntPtr ExceptionPointers;[MarshalAs(UnmanagedType.Bool)]public bool ClientPointers;}//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){Process currentProcess = Process.GetCurrentProcess();IntPtr currentProcessHandle = currentProcess.Handle;uint currentProcessId = (uint)currentProcess.Id;MiniDumpExceptionInformation exp;exp.ThreadId = GetCurrentThreadId();exp.ClientPointers = false;exp.ExceptionPointers = IntPtr.Zero;if (exceptionInfo == ExceptionInfo.Present){exp.ExceptionPointers = Marshal.GetExceptionPointers();}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){return Write(fileHandle, dumpType, ExceptionInfo.None);}public static Boolean TryDump(String dmpPath, Option dmpType=Option.Normal){var path = Path.Combine(Environment.CurrentDirectory, dmpPath);var dir = Path.GetDirectoryName(path);if (dir != null && !Directory.Exists(dir)){Directory.CreateDirectory(dir);}using (var fs = new FileStream(path, FileMode.Create)){return Write(fs.SafeFileHandle, dmpType);}}} }
提示
对于Windows Form程序,可以利用AppDomain的UnhandledException事件。以下示例:
namespace WindowsFormsApplication1 {static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler((obj,args)=> MiniDump.TryDump("error.dmp"));Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}} }
出处:https://www.cnblogs.com/beta2013/archive/2011/08/15/3377333.html
==============================================================================
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
{
class Program
{
static void Main(string[] args)
{
try
{
string a = "";
a = null;
if (a.ToString() == "1")
Console.WriteLine("a is 1");
}
catch
{
MiniDump.TryDump("c:MiniDmp.dmp", MiniDump.MiniDumpType.WithFullMemory);
}
Console.ReadKey();
}
}
///
/// 该类要使用在windows 5.1 以后的版本,如果你的windows很旧,就把Windbg里面的dll拷贝过来,一般都没有问题
/// DbgHelp.dll 是windows自带的 dll文件 。
///
public static class MiniDump
{
/*
* 导入DbgHelp.dll
*/
[DllImport("DbgHelp.dll")]
private static extern Boolean MiniDumpWriteDump(
IntPtr hProcess,
Int32 processId,
IntPtr fileHandle,
MiniDumpType dumpType,
ref MinidumpExceptionInfo excepInfo,
IntPtr userInfo,
IntPtr extInfo );
/*
* MINIDUMP_EXCEPTION_INFORMATION 这个宏的信息
*/
struct MinidumpExceptionInfo
{
public Int32 ThreadId;
public IntPtr ExceptionPointers;
public Boolean ClientPointers;
}
/*
* 自己包装的一个函数
*/
public static Boolean TryDump(String dmpPath, MiniDumpType dmpType)
{
//使用文件流来创健 .dmp文件
using (FileStream stream = new FileStream(dmpPath, FileMode.Create))
{
//取得进程信息
Process process = Process.GetCurrentProcess();
// MINIDUMP_EXCEPTION_INFORMATION 信息的初始化
MinidumpExceptionInfo mei = new MinidumpExceptionInfo();
mei.ThreadId = Thread.CurrentThread.ManagedThreadId;
mei.ExceptionPointers = Marshal.GetExceptionPointers();
mei.ClientPointers = true;
//这里调用的Win32 API
Boolean res = MiniDumpWriteDump(
process.Handle,
process.Id,
stream.SafeFileHandle.DangerousGetHandle(),
dmpType,
ref mei,
IntPtr.Zero,
IntPtr.Zero);
//清空 stream
stream.Flush();
stream.Close();
return res;
}
}
public enum MiniDumpType
{
None = 0x00010000,
Normal = 0x00000000,
WithDataSegs = 0x00000001,
WithFullMemory = 0x00000002,
WithHandleData = 0x00000004,
FilterMemory = 0x00000008,
ScanMemory = 0x00000010,
WithUnloadedModules = 0x00000020,
WithIndirectlyReferencedMemory = 0x00000040,
FilterModulePaths = 0x00000080,
WithProcessThreadData = 0x00000100,
WithPrivateReadWriteMemory = 0x00000200,
WithoutOptionalData = 0x00000400,
WithFullMemoryInfo = 0x00000800,
WithThreadInfo = 0x00001000,
WithCodeSegs = 0x00002000
}
}
}
http://www.sula.cn/101.shtml
出处:http://www.111cn.net/net/33/bae2af56ee02cd99daba9a078a311107.htm
C#程序保存dump文件相关推荐
- VC开发程序创建Dump文件
以前主要做Java开发,最近接手公司老项目做升级维护,开发工具是VC6,用了ACE和WxWidgets,当调试功能时,发现程序会出现内存访问异常,所以决定通过生成Dump文件进行分析,通过学习< ...
- c语言如何将程序保存在文件,急求如何将下列C语言程序数据存储到文件中?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...
- 编写的windows程序,崩溃时产生crash dump文件的办法
一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...
- 使用WinDbg抓取程序报错的Dump文件,例如抓取IE崩溃的Dump
前几天分享了一个关于如何抓蓝屏Dump的帖子,今天再和大家分享一个使用WinDbg来抓取程序崩溃的Dump.有了Dump后,我们可以很迅速的解决问题,比如说IE崩溃,QQ崩溃,很多时候我们是一点 ...
- 使用WinDbg抓取程序报错的Dump文件
使用WinDbg抓取程序报错的Dump文件,例如抓取IE崩溃的Dump,教程 前几天分享了一个关于如何抓蓝屏Dump的帖子,今天再和大家分享一个使用WinDbg来抓取程序崩溃的Dump.不过还是先来段 ...
- [Java]使用jConsole导出java程序的heap dump文件
[Java]使用jConsole导出Java程序heap dump文件 Heap dump文件存储着在该文件生成时,Java程序的所有未被回收的Objects的信息.通过使用MAT工具,可以揪出内存泄 ...
- 自定义VS程序异常处理及调试Dump文件(一)
1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件.dum ...
- Dump 文件的生产,作用,查看和调试
1. 如何排查程序crash,freeze等问题? 在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM).当发生这种情况时,我们怎么 ...
- DUMP文件分析1:DUMP文件简介
1.1 DUMP文件类型 Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump.内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump ...
- java 查看dump文件_[JAVA]JAVA章3 如何获取及查看DUMP文件
一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...
最新文章
- CTFshow php特性 web91
- 【通知】深度学习之人脸图像算法重印,欢迎读者支持!
- leetcode -- 129. 求根到叶子节点数字之和
- 6.6纪念永远的badboy
- 用C#完成Swift远程推送通知
- 51nod-1351:吃点心
- IWAM账号 HTTP500内部错误
- 史上最污技术解读,60 个 IT 术语我竟然秒懂了......
- 软件设计师中级-数据流图(DFD)
- 根据经纬度获取位置信息
- oracle 删掉同义词,【oracle删除同义词】作文写作问答 - 归教作文网
- 面试阿里数据研发岗,无缘三面,谈谈面经
- 数学建模学习(98):CHIO优化算法
- 同济大学计算机考试模拟大一上,同济大学大学计算机access作业答案.docx
- 参加腾讯云TVP的Coding吐槽大会感想
- 多目标线性规划(matlab编程)
- Python迭代器和生成器详解(包括yield详解)
- python plt.imshow函数显示图像颜色失真
- 规范数据处理活动,保障数据安全,促进数据开发利用——《数据安全法》解读
- 公众号滑动图代码_微信公众号图文排版之图片滑动的新玩法
热门文章
- 神经网络实用工具(整活)系列---使用OpenAI的翻译模型whisper实现语音(中、日、英等等)转中字,从此生肉变熟肉---基础篇
- 美国数据隐私管理平台BigID获3000万美元融资
- element ui table表中中如何添加事件
- Spirngboot+vue登录实战
- 拖延,一种惰性生活方式
- Springboot word文档数据替换工具类
- HackTheBox Behind The Scenes 逆向题目分析
- HDOJ 十天刷题及答案 c++
- 【NOI2016模拟3.1】hypocritical
- win10 休眠不读u盘_电脑休眠唤醒后无法使用USB键盘如何解决,小编告诉你解决电脑休眠唤醒后无法使用USB键盘...