概述
2019独角兽企业重金招聘Python工程师标准>>>
公司核心代码,这里不上了,主要将如何发现问题、如何排查问题和如何解决问题。
如何发现的?
公司运营提出新需求,说系统不好用,于是开始优化。优化完上线后,偶发的发现程序输出的结果不对,于是赶紧下线回滚。把代码跑起来,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
最后
以上就是激情樱桃为你收集整理的程序eclipse下run和debug不一致问题的全部内容,希望文章能够帮你解决程序eclipse下run和debug不一致问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复