程序eclipse下run和debug不一致问题

    公司核心代码,这里不上了,主要将如何发现问题、如何排查问题和如何解决问题。

    如何发现的?

    公司运营提出新需求,说系统不好用,于是开始优化。优化完上线后,偶发的发现程序输出的结果不对,于是赶紧下线回滚。把代码跑起来,eclipse里打断点,但结果是没问题啊。试了好几次,都是正常。取消断电,再跑,问题复现了。

    如何排查的?

    刚开始有点懵,这怎么搞?问了下度娘,五花八门说什么的都有。没办法,还是用最老的办法吧,每个一句代码,打印一次log,输出那一句代码用到的变量。最后把debug下的输出复制到文件对比工具中,在把run下的输出复制到文件对比工具中。一对比,现原形了。

    如何解决的?

    现了原形,这就好办了。原型是啥呢,就是发现for循环中有个数据库查询,第一次循环的时候,查询id为1,将结果存在一个map里,并做了逻辑判断,然后又往里面塞了点东西。然后第二次循环的时候,查询id为2,同样将结果存在一个map里,但这个时候,这个map竟然包含了第一次循环的时候,那个map里额外塞的参数!这就影响了后续的程序判断,导致结果异常,而且打断点后这个问题又不见了!这时,想到度娘的一句话:Debug时内存会初始化,但运行时不会。难道第二次循环查询存储结果用到的是第一次的map?

    于是在程序里去用==判断了一下,发现果然是一个。这就很奇怪了,追查spring和mybatis的源码,甚至到jdk也没找到一点能够说服人的依据。回到程序代码调用查询地方,修改原来直接rerurn session.selectOne();的代码,先new一个map,然后map.putAll进去,保存,重启,问题解决了。

    为什么会这样?我在其它项目怎么都无法复现出来,再此记录,留到以后解决。但避免这类问题的根本办法,就是管理好对象,用到再创建,创建时指定初始值。

 

转载于:https://my.oschina.net/shyloveliyi/blog/1523546

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值