一、背景
在一次更新现场软件后,启动软件出现报错弹框,提示JSON反序列化失败。
排查代码更改,未变更类型中对象。替换更新之前文件,软件能够正常运行。
在报错弹窗时,抓取DUMP文件。

二、报错分析
1. 使用!t 查看线程报错信息。

2. 使用!pe 打印报错信息。
发现在
SetValue时报错。

3. 继续使用!pe 打印InnerException报错信息。
发现缺失引用dll,
log4net version=2.0.17.0

4. 使用lm 查看当前加载模块。
未发现被加载的
log4net.dll

5. 在程序根目录发现log4net.dll版本为2.0.15
三、为什么反序列化SetValue中会调用到Log4Net
在
!pe打印InnerException时,可以在堆栈中,发现set_CurrentIndex调用了LogHelper.Post
1. 使用!name2ee查看UnLoader对象对应的模块。

2. 使用!savemodule保存模块文件。

3. 反编译查看对应代码。
发现在
get方法中调用了LogHelper.Post

四、解决方法
统一log4net 版本,重新生成,更新到现场。