C#调试过程中如何将堆栈信息写入文件

来源:互联网 发布:淘宝买家信誉等级查询 编辑:程序博客网 时间:2024/06/12 01:55

在C#开发的程序过程中,经常遇到崩溃问题,而调试这些问题又非常的棘手,此文给出了调试过程中生成堆栈办法,为调试,特别是远程调试提供了方便。


修改程序入口文件Program.cs,请参考如下代码:


using System;using System.IO;using System.Collections.Generic;using System.Windows.Forms;using DevExpress.LookAndFeel;namespace Vision{    static class Program    {        /// <summary>        /// The main entry point for the application.        /// </summary>        [STAThread]        static void Main()        {            try            {                RUtility.RLog.WriteLog("---------------------------");                RUtility.RLog.WriteLog("Program start begin");                //处理未捕获的异常                  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);                //处理UI线程异常                  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);                //处理非UI线程异常                  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            DevExpress.Skins.SkinManager.EnableFormSkins();            DevExpress.UserSkins.BonusSkins.Register();            DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("DevExpress Dark Style");            Application.Run(new MainForm());                RUtility.RLog.WriteLog("Program start end");            }            catch (Exception ex)            {                string str = "";                //string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";                string strDateInfo = "An unhandled exception in the application:" + DateTime.Now.ToString() + "\r\n";                if (ex != null)                {                    //str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",                    //    ex.GetType().Name, ex.Message, ex.StackTrace);                    str = string.Format(strDateInfo + "Exception types:{0}\r\nException message:{1}\r\nException information:{2}\r\n",                        ex.GetType().Name, ex.Message, ex.StackTrace);                }                else                {                    //str = string.Format("应用程序线程错误:{0}", ex);                    str = string.Format("Error application threads:{0}", ex);                }                RUtility.RLog.WriteLog("Exception:", str);                writeLog(str);                //frmBug f = new frmBug(str);//友好提示界面                //f.ShowDialog();                //MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);            }        }        /// <summary>        ///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考        ///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等        ///这就是仁者见仁智者见智,大家自己做了。        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)        {                   string str = "";            //string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";            string strDateInfo = "An unhandled exception in the application:" + DateTime.Now.ToString() + "\r\n";            Exception error = e.Exception as Exception;            if (error != null)            {            //str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",            //    error.GetType().Name, error.Message, error.StackTrace);            str = string.Format(strDateInfo + "Exception types:{0}\r\nException message:{1}\r\nException information:{2}\r\n",                error.GetType().Name, error.Message, error.StackTrace);            }            else            {                //str = string.Format("应用程序线程错误:{0}", e);                str = string.Format("Error application threads:{0}", e);            }            RUtility.RLog.WriteLog("Exception:", str);            writeLog(str);                      //frmBug f = new frmBug(str);//友好提示界面            //f.ShowDialog();            //MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);            MessageBox.Show("A fatal error, please stop the current operation and promptly contact the author! ", "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error);        }        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)        {            string str = "";            Exception error = e.ExceptionObject as Exception;            //string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";            string strDateInfo = "An unhandled exception in the application:" + DateTime.Now.ToString() + "\r\n";                       if (error != null)            {                str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\rStack information:{1}", error.Message, error.StackTrace);            }            else            {                str = string.Format("Application UnhandledError:{0}", e);            }            RUtility.RLog.WriteLog("Exception:", str);            writeLog(str);                    //frmBug f = new frmBug(str);//友好提示界面            //f.ShowDialog();            //MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);            MessageBox.Show("A fatal error, please stop the current operation and promptly contact the author! ", "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error);        }        /// <summary>        /// 写文件        /// </summary>        /// <param name="str"></param>        static void writeLog(string str)        {            if (!Directory.Exists("Log"))            {                Directory.CreateDirectory("Log");            }            using (StreamWriter sw = new StreamWriter(@"Log\ErrLog.txt", true))            {                sw.WriteLine(str);                sw.WriteLine("---------------------------------------------------------");                sw.Close();            }        }    }}

启动程序,只要程序中有出现崩溃的现象,会将崩溃调试的堆栈信息写入到文件中,如下图


0 0
原创粉丝点击