检验人员做仪器检验的过程中发现,软件闪退
根据检验员叙述,在操作仪器的过程中,发现软件突然闪退,没有任何提示
事件发生与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.检测代码其它地方是否有类似错误,并优化