抱歉,"灵异现象"一词是敝公司内部在用的
主要是讲各种 执行不如预期
通常,有很大机率,会被人说"那是你自己写程式不小心"
比如,程式在不该当的地方当了
但怎么查也查不到原因
其实原因是更早之前使用了不存在或已删除的变量
(这状况在 java 还没碰过;我是举 C 的例子)
因为无效指标会让程式流程跑到乱码
也可能破坏堆叠;而且不一定"马上"当
不过这次的例子比较奇怪
主管已经追一个礼拜了
(幸好不是发生在我身上,不然一定骂死我又不相信我
发生在他身上,他则说"解决了有赏"XD)
public void run() {
long __lCurrentTime = 1466154837;
long __lTimeout = __lCurrentTime + 6;
boolean __result = false;
// 中断点1:请在下一行放置一个中断点
int __count = 0;
for ( ; __lCurrentTime<=__lTimeout ; __lCurrentTime++) {
__result = __lCurrentTime<=__lTimeout;
__count++;
}
// 中断点2:请在下一行放置一个中断点
}
这次的例子是上面的小程式
中断点 2 永远执行不到
而检查 __result, 也竟然永远为 true
自己直接把程式放入自己的小专案当然没问题
我们这个是放在敝公司的专案中
而奇怪的是,它还挑 build machine
这段 code 要在特定机器上 build 出 APK
才会执行不完
其他机器去 build, 则不会执行出问题
(而我们信任自己的 build machine 啊,那是装好后只用来 build 程式的一台专用机器)
重灌 build machine 吗?也不对,因为不只一台会出问题
(会出问题的就一直 build 出问题)
程式的逻辑很简单(虽然不实用;因为它是专为了重制问题,简化出来的 code)
同事因此做了个猜测:堆叠炸了
如果堆叠炸了,那当然程式就不必谈逻辑了
但这段程式是位在另一个 thread, 同事加大 thread stack
new Thread(null, null, TAG, 2*1024*1024)
没有用
主管现在用另一个方法回避问题
把原来的 long, 故意 cast 成 double
这样是很无聊啦,但 compare 结果会正确了!!
(如果是堆叠炸了,应该要减少使用自动变量才对
奇奇怪怪的回避方法未必能解决问题吧!)
同事说,这种奇怪的问题,未必能用以前 C/C++ 时的逻辑去猜想
可能要更深入 byte code 去推断
请问有没有人解过类似的问题
(这不像 java 语法问题,而是 java 环境使用上的问题)
谢谢