前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序eclipse下run和debug不一致问题

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

作者头像
尚浩宇
发布2018-08-17 11:17:05
3550
发布2018-08-17 11:17:05
举报
文章被收录于专栏:杂烩

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

    如何发现的?

    公司运营提出新需求,说系统不好用,于是开始优化。优化完上线后,偶发的发现程序输出的结果不对,于是赶紧下线回滚。把代码跑起来,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进去,保存,重启,问题解决了。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档