作用

程序异常崩溃前使用此类为进程创建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文件相关推荐

  1. VC开发程序创建Dump文件

    以前主要做Java开发,最近接手公司老项目做升级维护,开发工具是VC6,用了ACE和WxWidgets,当调试功能时,发现程序会出现内存访问异常,所以决定通过生成Dump文件进行分析,通过学习< ...

  2. c语言如何将程序保存在文件,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  3. 编写的windows程序,崩溃时产生crash dump文件的办法

    一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...

  4. 使用WinDbg抓取程序报错的Dump文件,例如抓取IE崩溃的Dump

     前几天分享了一个关于如何抓蓝屏Dump的帖子,今天再和大家分享一个使用WinDbg来抓取程序崩溃的Dump.有了Dump后,我们可以很迅速的解决问题,比如说IE崩溃,QQ崩溃,很多时候我们是一点 ...

  5. 使用WinDbg抓取程序报错的Dump文件

    使用WinDbg抓取程序报错的Dump文件,例如抓取IE崩溃的Dump,教程 前几天分享了一个关于如何抓蓝屏Dump的帖子,今天再和大家分享一个使用WinDbg来抓取程序崩溃的Dump.不过还是先来段 ...

  6. [Java]使用jConsole导出java程序的heap dump文件

    [Java]使用jConsole导出Java程序heap dump文件 Heap dump文件存储着在该文件生成时,Java程序的所有未被回收的Objects的信息.通过使用MAT工具,可以揪出内存泄 ...

  7. 自定义VS程序异常处理及调试Dump文件(一)

    1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件.dum ...

  8. Dump 文件的生产,作用,查看和调试

    1. 如何排查程序crash,freeze等问题? 在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM).当发生这种情况时,我们怎么 ...

  9. DUMP文件分析1:DUMP文件简介

    1.1 DUMP文件类型 Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump.内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump ...

  10. java 查看dump文件_[JAVA]JAVA章3 如何获取及查看DUMP文件

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

最新文章

  1. CTFshow php特性 web91
  2. 【通知】深度学习之人脸图像算法重印,欢迎读者支持!
  3. leetcode -- 129. 求根到叶子节点数字之和
  4. 6.6纪念永远的badboy
  5. 用C#完成Swift远程推送通知
  6. 51nod-1351:吃点心
  7. IWAM账号 HTTP500内部错误
  8. 史上最污技术解读,60 个 IT 术语我竟然秒懂了......
  9. 软件设计师中级-数据流图(DFD)
  10. 根据经纬度获取位置信息
  11. oracle 删掉同义词,【oracle删除同义词】作文写作问答 - 归教作文网
  12. 面试阿里数据研发岗,无缘三面,谈谈面经
  13. 数学建模学习(98):CHIO优化算法
  14. 同济大学计算机考试模拟大一上,同济大学大学计算机access作业答案.docx
  15. 参加腾讯云TVP的Coding吐槽大会感想
  16. 多目标线性规划(matlab编程)
  17. Python迭代器和生成器详解(包括yield详解)
  18. python plt.imshow函数显示图像颜色失真
  19. 规范数据处理活动,保障数据安全,促进数据开发利用——《数据安全法》解读
  20. 公众号滑动图代码_微信公众号图文排版之图片滑动的新玩法

热门文章

  1. 神经网络实用工具(整活)系列---使用OpenAI的翻译模型whisper实现语音(中、日、英等等)转中字,从此生肉变熟肉---基础篇
  2. 美国数据隐私管理平台BigID获3000万美元融资
  3. element ui table表中中如何添加事件
  4. Spirngboot+vue登录实战
  5. 拖延,一种惰性生活方式
  6. Springboot word文档数据替换工具类
  7. HackTheBox Behind The Scenes 逆向题目分析
  8. HDOJ 十天刷题及答案 c++
  9. 【NOI2016模拟3.1】hypocritical
  10. win10 休眠不读u盘_电脑休眠唤醒后无法使用USB键盘如何解决,小编告诉你解决电脑休眠唤醒后无法使用USB键盘...