• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

c#程序闪退,有没有监测日志的办法?

oldhunter 2020-11-16 05:23:25
原来正常运行的系统,引入了 CefSharp 浏览器内核,结果导致:关闭子窗口时,主程序闪退。
Form_Closing 中,已经加了日志,仍然未捕获到任何异常。
现在怀疑是某个组件,在Dispose时,可能发生了异常。但只有.net捕获到了异常,所以导致主程序闪退。

就想知道,c#程序闪退,有没有监测日志的办法?到底是哪个组件或代码,导致了异常。
需要一行行代码注释掉,一点点调试吗?
...全文
972 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
glen30 2020-11-16
在static void Main()函数里面注册异常回调函数,在闪退发生的时候会调用注册的回调函数,把异常信息记录到日志里面即可,查看日志文件就可以得到异常信息。
例子如下所示:
static void Main()
{
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new FromXXX());
。。。。

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogUnhandledException(e.Exception.Message + e.Exception.StackTrace);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogUnhandledException(e.ExceptionObject.ToString());
}
static void LogUnhandledException(string msg)
{
StreamWriter sw = new StreamWriter(Application.StartupPath + "\\record.txt", true);
sw.WriteLine(msg);
sw.Close();
}
}
回复
Cryking 2020-11-16
子线程没有捕获异常会导致这个问题,另外windows事件日志里看看有没有相关信息
回复
wanghui0380 2020-11-16
我们只能告诉你在“闪退”前夕抓取dump。至于怎么分析dump无法告诉你,蓝屏+闪退即使微软都烦,因为只分析有dump才知道,而分析dump并没有成规,只是告诉你当时内存里到底有啥,当时cpu正在干啥 怎么抓dump,自己百度“C# minidump” 怎么拦闪退,自己百度“AppDomain.CurrentDomain.UnhandledException” 前两部都有成法 分析dump,同样可以百度“分析dump”,而分析dump无成法,各有各的上下文和关注点。要写成书可以是跟红宝书差不多厚
回复
lorimoon 2020-11-16
未捕获异常win 会写系统日志。
回复
oldhunter 2020-11-16
引用 1 楼 lorimoon 的回复:
未捕获异常win 会写系统日志。


引用 3 楼 Cryking 的回复:
子线程没有捕获异常会导致这个问题,另外windows事件日志里看看有没有相关信息


原来 windows事件日志 -> 应用程序 中,确实存在相关日志:和 CefSharp 相关,像是其子进程崩溃了。

但由于事件日志的数量太多(一万多条),打开很慢,就清空了一次。
再次测试程序,主程序再闪退几次时,发现windows竟然不再保存该程序的windows事件日志,实在是太诡异。目前只能等着windows再写事件日志。
目前能尝试的,就是 wanghui0380 建议的 minidump 的办法。
回复
oldhunter 2020-11-16
引用 4 楼 glen30 的回复:
在static void Main()函数里面注册异常回调函数,在闪退发生的时候会调用注册的回调函数,把异常信息记录到日志里面即可,查看日志文件就可以得到异常信息。
例子如下所示:
static void Main()
{
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new FromXXX());
。。。。

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogUnhandledException(e.Exception.Message + e.Exception.StackTrace);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogUnhandledException(e.ExceptionObject.ToString());
}
static void LogUnhandledException(string msg)
{
StreamWriter sw = new StreamWriter(Application.StartupPath + "\\record.txt", true);
sw.WriteLine(msg);
sw.Close();
}
}




在项目中,之前已经订阅了这2个事件,但并没有写入日志。
CurrentDomain_UnhandledException
Application_ThreadException

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = ((Exception)e.ExceptionObject);

SystemUtility.WriteLog("Current Domain Unhandled Exception", ex.ToString());

UnhandledExceptionDialog dialog = new UnhandledExceptionDialog(ex, "CurrentDomain_UnhandledException");
dialog.ShowDialog();
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
UnhandledExceptionDialog dialog = new UnhandledExceptionDialog(e.Exception, "Application_ThreadException");
dialog.ShowDialog();
}
回复
oldhunter 2020-11-16
引用 2 楼 wanghui0380 的回复:
我们只能告诉你在“闪退”前夕抓取dump。至于怎么分析dump无法告诉你,蓝屏+闪退即使微软都烦,因为只分析有dump才知道,而分析dump并没有成规,只是告诉你当时内存里到底有啥,当时cpu正在干啥

怎么抓dump,自己百度“C# minidump”
怎么拦闪退,自己百度“AppDomain.CurrentDomain.UnhandledException”
前两部都有成法

分析dump,同样可以百度“分析dump”,而分析dump无成法,各有各的上下文和关注点。要写成书可以是跟红宝书差不多厚


非常感谢!已经将 minidump 集成到项目中,试试效果如何。
回复
shawn_yang 2020-11-16
try
catch 抓不到报错吗
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-11-16 05:23
社区公告

让您成为最强悍的C#开发者