前言
今天,帮同时解决现场的问题。已经定位了出问题的C#exe.
这个C#exe有年头了,而且没源码,只能拿dnSpy单步调试。
问题描述(伪码):
try {
p_node = new xx; // new一个节点出来
key_new = key; // 将key复制给一个中间变量,key类型为int
// 但是如果key 末尾4位10进制数为0346, key_new的值就是0,而不是key
if (my_hash_map_have_not_key(key)) {
// 这里判断的是key, 而不是key_new
// 导致插入多个末尾为0346的十进制数时,实际上插入key = 0的多个node, 导致抛异常
add_to_hash_map(key_new, p_node);
// 其他业务逻辑
// 抛异常后,这些后续的业务逻辑就不被执行了
}
catch () {
// ...
}
}
问题分析:
这已经不是代码实现的问题,莫名不可描述的原因。
比对环境,唯一可疑的地方,就是这个C#exe,是很久以前写的,有可能是用vs2010C#写的。
发布版其他C#程序,用的都是vs2017C#编译的。
因为C#程序编译出来都是中间层的代码,最后要调用FrameWrok去干活。
那旧版程序调用新版的FrameWrok, 就有可能有问题。
一般新版程序使用旧版的组件,可能还好点。因为编译器开发厂商,会考虑兼容性问题。
如果旧版程序使用新版组件,这个编译器开发厂商是考虑不到的。除非接口和功能完全不变。
解决问题的方法:
- 去找到这版工程,用vs2017重新编译一版。
- 用C#反汇编工具,反一个工程出来,正向编译时,消掉编译错误,再编译一个vs2017编译的新版C#exe出来。