设为首页 加入收藏

TOP

wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)(二)
2019-09-18 11:11:43 】 浏览:104
Tags:wpf 单例 模式 异常 处理 发布 csdn 2017-04-12 20:34:12
(); } Environment.Exit(0); } private int ExceptionFilter(ref long a) { Log4net.gLogger.Fatal("--<ExceptionFilter>--" + Environment.StackTrace); WriteDump(); return 1; } private void WriteDump() { Dump.WriteDumpFile(); } }

对于一些问题,我们可以通过日志文件记录(我目前使用Log4net)。有时候日志不能完全帮助我们找到问题所在,这时dmp文件就可以帮助到我们。

internal class DumpWriter
{
    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
    }

    [DllImport("DbgHelp.dll")]
    private static extern bool MiniDumpWriteDump(
        IntPtr hProcess,
        Int32 processId,
        IntPtr fileHandle,
        MiniDumpType dumpType,
        ref MiniDumpExceptionInformation excepInfo,
        IntPtr userInfo,
        IntPtr extInfo);

    [DllImport("DbgHelp.dll")]
    private static extern bool MiniDumpWriteDump(
        IntPtr hProcess,
        Int32 processId,
        IntPtr fileHandle,
        MiniDumpType dumpType,
        IntPtr excepParam,
        IntPtr userInfo,
        IntPtr extInfo);

    [StructLayout(LayoutKind.Sequential, Pack = 4)]// Pack=4 is important! So it works also for x64!
    private struct MiniDumpExceptionInformation
    {
        public uint ThreadId;
        public IntPtr ExceptionPointers;
        [MarshalAs(UnmanagedType.Bool)]
        public bool ClientPointers;
    }

    [DllImport("kernel32.dll")]
    private static extern uint GetCurrentThreadId();

    private bool WriteDump(String dmpPath, MiniDumpType dmpType)
    {
        using (FileStream stream = new FileStream(dmpPath, FileMode.Create))
        {
            //取得进程信息
            Process process = Process.GetCurrentProcess();

            MiniDumpExceptionInformation mei = new MiniDumpExceptionInformation();
            mei.ThreadId = GetCurrentThreadId();
            mei.ExceptionPointers = Marshal.GetExceptionPointers();
            mei.ClientPointers = true;

            bool res = false;

            //如果不使用MiniDumpWriteDump重载函数
            //当mei.ExceptioonPointers == IntPtr.Zero => 无法保存dmp文件
            //且当mei.ClientPointers == false时程序直接崩溃(mei.ClientPointers == true程序不崩溃)
            //
            //以上测试信息硬件环境 cpu Pentium(R) Dual-Core CPU T4200 @ 2.00GHz
            //                 vs2013update5
            //在公司服务器上测试(64位系统、vs2013)不会出现上述情况
            /*res = MiniDumpWriteDump(
                process.Handle,
                process.Id,
                stream.SafeFileHandle.DangerousGetHandle(),
                dmpType,
                ref mei,
                IntPtr.Zero,
                IntPtr.Zero);*/

            if (mei.ExceptionPointers == IntPtr.Zero)
            {
                res = MiniDumpWriteDump(
                    process.Handle,
                    process.Id,
                    stream.SafeFileHandle.DangerousGetHandle(),
                    dmpType,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    IntPtr.Zero);
            }
            else
            {
                res = MiniDumpWriteDump(
                    process.Handle,
                    process.Id,
                    stream.SafeFileHandle.DangerousGetHandle(),
                    dmpType,
                    ref mei,
                    IntPtr.Zero,
                    IntPtr.Zero);
            }
            return res;
        }
    }

    public DumpWriter()
    {
        FilePath = Environment.CurrentDirectory + @"\Dump";
        if (!Directory.Exists(FilePath))
            Directory.CreateDirectory(FilePath);
    }

    /// <summary>
    /// 保存dmp文件路径
    /// </summary>
    public string FilePath { get; protected set; }
    /// <summary>
    /// 保存dmp文件名称(包括路径)
    /// </summary>
    public strin
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇WPF 启动页面 (原发布 csdn 2017.. 下一篇Winform中跨窗体设置Zedgraph的属..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目