【C#】记录一次上位机软件界面闪退分析及解决方案

C# 同时被 2 个专栏收录
47 篇文章 1 订阅
2 篇文章 0 订阅

检验人员做仪器检验的过程中发现,软件闪退

根据检验员叙述,在操作仪器的过程中,发现软件突然闪退,没有任何提示

 

事件发生与2021年6月8日, 由于但是正在处理其它事情,没有及时处理,在昨天10号才进行分析处理。

 

当时就获取了相关信息,软件版本信息,故障日期,Windows系统日志,同时还备份了数据库。

 

一,系统日志

查看系统日志,有两个报错,相邻发生

第1个错误是一个.NET Runtime错误,这个错误是由软件报的错,里面是一个String.Format相关的错误。

第2个是Application Error,是由于第1个错而导致的

 

二,软件日志

 

2.1 String.Format

在软件日志中,也记录了同一个错误,也是String.Format错误,详细错误为“输入字符串的格式不正确”,具体操作是,点击了上位机一个按钮,发送指令到下位机,在该过程中发生错误,由于执行了系统方法System.String.Format(String format,object[] args)导致的。

 

后面查了资料,原来是由于String.Format方法中不能包含花括号“{}”

代码是类似这样的

ErrorLog("Send-catch(Exception ex) { ErrorLog(ex) }");

这段代码是在方法执行失败的时候执行的,而ErrorLog方法具体实现如下

Public void ErrorLog(string format,params object[] args)
{
    Error(string.Format(format,args));
}

正是调用了string.Format导致的错误

对于string.Format,正确的写法是这样的

var name = "haha";
string.Format("my name is {0}", name);

是可以含有“{}”的,但是必须是相当于形参,而如果单独存在,则会报错

 

2.2 正在中止线程

继续查看,是由于一个“正在中止线程”错误导致了错误,方法执行失败,从而执行了ErrorLog,导致软件闪退。

后面发现线程在执行一些流操作时,突然中止,会抛出该异常,可能就是在执行指令方法的某个过程中,特定的步骤还未执行完成,就被中止线程,导致抛出异常。

 

三,解决方案

由于执行方法比较复杂,先从String.Format入手

可能改进的方案就是,去除ErrorLog方法中的花括号“{}”

 

修改完,进行对比测试,由于进入ErrorLog方法难以复现,所以添加按钮,执行类似方法进行测试

以string.Format有无“{}”作为测试对比

在测试过程中,发现含有“{}”,居然不卡死。

后面又详细看了原方法,原方法是这样的,使用了Thread执行了指令,于是在测试方法中添加了Thread,于是问题终于复现了,点击按钮后,停留1,2秒时间软件闪退。而去除了“{}”的,点击按钮正常。测试多次,效果符合预期。

 

于是终于有解决方案的,就是去除ErrorLog方法中的花括号“{}”,即string.Format方法中不能单独有花括号“{}”

 

最终的解决方案:

1.去除ErrorLog方法中的“{}”

2.在ErrorLog方法中,添加try...catch...,避免其它特殊字符或其他错误导致问题

3.检测代码其它地方是否有类似错误,并优化

 

 

  • 1
    点赞
  • 4
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值