如何让程序抓到dump文件,MiniDumpWriteDump

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();
        }
    }

   
    /**//// <summary>
    /// 该类要使用在windows 5.1 以后的版本,如果你的windows很旧,就把Windbg里面的dll拷贝过来,一般都没有问题
    /// DbgHelp.dll 是windows自带的 dll文件 。
    /// </summary>
    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

时间: 2024-10-01 14:34:46

如何让程序抓到dump文件,MiniDumpWriteDump的相关文章

windows-Windows下抓取程序崩溃的Dump文件 遇到的问题

问题描述 Windows下抓取程序崩溃的Dump文件 遇到的问题 在Windows环境下,程序崩溃的时候抓取Dump文件,经测试在本机的开发环境下及Win 7环境下 抓取都没有问题,而在Xp和Windows 2003下抓取到的Dump文件都是0KB,这是怎么回事, 有哪位仁兄有这方面经验的还请赐教! 解决方案 Python 批量分析windows程序崩溃捕获的dump文件程序崩溃时抓取dump文件windows程序崩溃生成dump文件 解决方案二: 要看你的API是如何生成dump的,可能是用到

程序自动生成Dump文件

前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了mini dump文件格式后,完全可以程序自动生成Dump文件. 本文主要讨论以下内容: 1.  运行原理 2.  程序修改 3.  注意事项 一.   运行原理 当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter(

Windbg抓取程序崩溃的dmp文件的方法

Windbg抓取程序崩溃的dmp文件的方法   一.        简介 windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比VS更为强大.它的另外一个用途是可以用来分析dump数据. 我们使用windbg的主要用途是来抓取IE崩溃产生的dmp文件,然后可以查看是哪个模块导致崩溃,从而协助开发判断分析问题所在.   二.        使用方法 设置WinDbg

dump文件分析-access violation at location 0x000000000000

问题描述 access violation at location 0x000000000000 关机时,程序异常结束,内存不可读写. dump文件分析得到的调用堆栈如下: 根据上面的调用堆栈,好像是回调函数出现问题.请问如何准确定位到代码错误位置? 解决方案 你标框的地方不是已经告诉你了出错的代码文件,行数了,你打开对应的代码分析看看 解决方案二: Unhandled exception at 0x00000000 in CallDll.exe: 0xC0000005: Access viol

AIX的Dump文件学习笔记(原创)

DUMP文件概述  为了增强故障分析能力,IBM的服务器增加了对设备故障当前环境的保存功能,就是保存一份设备故障时的内存.CPU寄存器.IO等设备的数据和状态信息,如果系统并没有停住,只是某个程序死掉,会产生CORE DUMP,在当前目录下产生一个CORE文件.而如果操作系统死掉,则产生System DUMP或者System Crash,通常会引起系统停机.DUMP的记录如下图所示. 作为一般客户通常只需要收集DUMP信息,并反馈给IBM工程师即可.当发生系统DUMP时,机器将会被宕下来.可能的

java-android Runtime.getRuntime.exec()方法调用tcpdump抓包但文件无法保存

问题描述 android Runtime.getRuntime.exec()方法调用tcpdump抓包但文件无法保存 android内置程序调用tcpdump: Runtime.getRuntime().exec("/data/local/tcpdump -XvvennSs 0 -w /mnt/sdcard/cap.pcap -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 or tcp[20:2]=0x504f"); 该命令在cmd上可行,但让

windbg 问题,64位dump文件在32位机的调试

问题描述 windbg 问题,64位dump文件在32位机的调试 服务器是64位机器,产生了dump文件,但是程序是本机32位上生成的,取下dump文件,用VS2008打不开堆栈信息,网上说用windbg来调试,不太会用: STACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. 036ee400 00c97d88 00c98ed0 013e7152 00000000 S

dump 分析 windbg-请教dump文件分析问题

问题描述 请教dump文件分析问题 我的程序在客户电脑上偶尔会死机,保存了死机时的DUMP文件,但是看不出问题,哪位大神指导一下? 0:000> !analyze -v * Exception Analysis * * ******************************************************************************* *** ERROR: Symbol file could not be found. Defaulted to expo

Winshark抓包的文件怎么打开!!?

问题描述 新人第一帖学校学的C#现在实习公司需要写个程序Winshark抓包的文件后缀是.pcapng那请问这个文件除了Winshark之外怎么打开现在需要写个程序来读取里面的内容求大神帮帮忙! 解决方案 解决方案二:http://code.csdn.net/openkb/p-Wireshark