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

在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值