一直在DEBUG整理

把自己在工作、学习中遇到的BUG整理在这里,有些可能并没有技术上的收获,只是一些思考方式、考虑问题的角度等方面的收获,并以此来练习自己的文字表达能力。

2017/7/4 18:15:56
日志里可以看前端同事的接口调用顺序的。今天排BUG的时候,一直找不到后端问题在哪里。后来忽然猜想是不是前端同事改了代码,有两个接口AB,必须先调A再调B才行,观看日志,发现果然是前端同事的修改造成的BUG。

2017/6/6 10:13:01
30.今日改了一bug,还算颇有成就。redis的pub/sub,同一个redis环境,每一个库,比如0库1库,只要订阅了某个话题频道,一但这个话题频道有新消息发布,这些订阅了该频道的库都能收到消息。
BUG产生原因是因为,新起了心率的分析WAR,该WAR与原Analyze用同一个redis,虽指定了该redis的不同的database,但redis的pub/sub发布订阅模式是这样子:只要有订阅了某频道的client,都会收到该发布消息。比如:在库2,给频道CC发布一条消息"hello",库4订阅了频道CC也会收到该消息


2017/5/6 9:54:37
29.
集成shiro的时候,我在shiro.xml里增加了<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />,结果导致一个含有transaction注解的service注入不成功

2017/5/4 15:56:40
28.
在测试环境,出于方便和好心,没有按正常业务流程来给同事弄数据,而是直接对库操作,结果造成了BUG。

2017/5/1 17:02:14
27.
BeanUtils.copyProperties两个对象的时候,有时候要配置ignoreProperty,比如把A复制到B,要保持B的某属性不变。这周就遇到一个BUG,因自己忘记配置忽略,把不正确的playerId返回给了前端同事。

26.
晚的时候在测试线上手动改了shiro配置,取消了某项目的接口安全拦截,事后忘记改回去。(而且我完全想不起来我当时为什么要取消安全拦截,是做什么调试)。告诉自己以后太疲劳的时候千万不要工作。

25.
在优化一个接口的时候,发现接口出参的某个属性命名好丑,于是顺手改了。然后忘记和前端同事联调,我就发布测试与生产。好尴尬。而且那个很丑的命名是我一个月前写的代码。

2017/1/17 11:41:01
24.
ftl里边不要用#,要改成$ 默认密码#{password}

2016/12/28 15:10:27
23.
一定要记得打@Component不然不会跑调度的啊!!


2016/11/7 14:38:28
22. select c1,c2 from tableA union all select c1,c2 from tableB;
字段的对位很容易填错
为后端API的BUG。BUG产生的原因是,其他同事在需求变动后增加新返回字段时,未将union all集的字段正确对位。 
select c1,c2,c3 from tableA
union all
select c1,c3,c2 from tableB
union all语句中的c2,c3未正确对位。


2016/10/23 11:33:53
20.24小时制应用"HH:mm",不用"hh:mm"
19.能满足业务要求的情况下我更倾向于用left join来代替inner join,因为有脏乱数据的情况下,left join容易产生脏的结果集
18.select c1,c2,(c3+c4) from table t;若是c2后面的逗号忘记了,就会报c2不是有效的function这样的错误日志。(我一开始看到这个错误的时候居然想不起来是逗号缺失的原因!!)

17.
数据库命名不可为share-center,只能为share_center。因这个问题导致的BUG!

2016/10/21 15:53:31
16.
复制的时候,把driver弄成了ver


2016/10/1 14:35:27
13.

通常这种都是由于
<mapper namespace="com.tly.dao.PlayerMapper">没写对造成的。 我的这个xml是UserMapper,所以namespace也应是UserMapper啊!

2016/9/29 17:55:24
12.mybatis这种xml配置中出现的不对称符号,有时候不小心多写了,找起来找得够辛苦的,我可能需要一个大显示屏~~!

mybatisshare.png
多写了一个分号!!.png
2016/9/29 17:43:43
10.应该再套一层select,然后再avg。遇到一个需求,求某统计表中某用户近5条平均数据
select avg(t.c1) from table t where 条件
order by t.id desc limit 5;
应改成
select avg(main.c1) from(
select c1 from table t where 条件
order by t.id desc limit 5) main;
AVG的一个BUG.png

2016/9/29 14:32:13
9.很多BUG都产生在复制他人代码复制自己代码的时候


2016/8/5 20:43:37
8.
这周最大的一个收获是,在改一个BUG,登陆的时候报SQL错误,return too many rows……
看库里,确实有两条用户数据一模一样,且ID相邻。我一开始以为是并发情况下增加了两条。后来看到有两条数据一样,但是ID隔着老远的,我就纳闷了,这样就排除了并发同时新增的原因(因为同时新增ID应会相邻)。
后来找啊找发现有一条SQL,其目的是要更新用户的上次登陆时间、登陆IP,这个接口对应的SQL是这样子的
UPDATE USERS SET C1=NEW_C1_VALUE,C2=NEW_C2_VALUE……where phone=**;
这个接口的缺点是,1、where条件不严谨,phone没法判断唯一性,要用主键ID。2、只是更新last_ip,last_login_time,却把其它字段也更新了。
两条相同数据的产生,有可能是insert来的,也有可能是update来的。我以前一直以为只有insert!要学会看日志;这就是经验。
我也很享受这种改BUG的过程,推论的过程。

2016/5/20 17:57:27
7.
wc_attention这个事情;
某个方法中的一长串代码,包含两个插入数据的SQL,且按先后称之为A和B,A是我写的,B是另外的同事写的。
B中仍有对wc_attention表的引用 ,但这张表之前是约定好不用的了。
若只是等APP运行完该方法对应的功能,查看数据库中相关表的数据走向 ,这是一种不太合适的DEBUG方式,因为我们不知道在B之后到方法结束前某个地方会不会报错,而带来数据回滚,影响数据走向,影响自己的判断。
更好的方式还是看中间件日志。 

20151204
6.用公司的框架开发一张查询报表,查询区域的当前已选查询条件功能一直报错,跟踪到代码后问题记录如下:
A处代码<e3:Dataset id="DataSet_HelpTip_Condition" 
B处代码buildQueryInfoLocation(namespace,"Dataset_HelpTip_Condition", 
你看A是DataSet,B是Dataset,这是两个不同的名字。
我来重现一下为什么自己会出现这样的错误呢。1. buildQueryInfoLocation这里的代码我是拷贝B的,拷过来之后,我是用替换语句替换了别人的_后的字符。即Dataset_***这儿的星星。2.<e3:Dataset id="DataSet_HelpTip_Condition"我是拷贝A的,两个人之前写的就不一样。3.而我的所有重点都注意在***这个变量上了。
我一直以为eclipse里边ctrl+k是完完全全的查找上下文字符串(大小写匹配)
看来做为这种开发代码的工具,为了严谨,还是把find/replace功能里的大小定敏感选项勾选起来吧!case sensitive 
花了半个小时啊,好亏。

20151203
5.
让编译器先改成1.4,再改回1.5。有时候编译器“傻傻的”不工作,那么将其改成1.4,IDE必然报工程有错(因为代码里有些东西只能在1.5的level编译通过),再改回来,即可实现1.5下的编译。觉得这好像和技术没有关系,只是工作经验的体现,是一种有趣的解决问题的方式。

20151203
4.
IBATIS这里 id没有放出来的情况。报表碰到一个BUG。查看明细的时候总是捕获到空值。后来看后台ibatis的配置文件里同的SQL语句,别人都写了select id ,c1,c2……from table t,只有自己这里没有写id。所以要遵循大家的规范,要多观察,找异同,即可解决BUG。

20151111
3.最近碰到一个与解析XML有关的BUG。dom4j中selectNodes无法获得节点。
现场的项目是跑在WebSphere上。我拿到项目源码后把它部署在Tomcat上。
dom4j工作的时候还需要依赖jaxen-1.1-beta-7.jar。我拿到的项目包里没有这个jar包。Tomcat的lib下有这个包。解析一直不成功。控制台也找不到报错日志(像什么少包的日志提示)。后来同事告诉我把jaxen-1.1-beta-7.jar放到项目的WebContent\WEB-INF\lib里边,BUG才解决。
这是一个缺包造成的BUG。如果我能早些问人家的话,就不要折腾那么久了!!!

20150918
2.
最近一直在做eclipse插件开发有关的工作,发现
import org.eclipse.core.resources.IFolder; 
IFolder folder = root.getFolder(new Path(filePath));       
            if (!folder.exists()) {
                folder.create(false, true, null);
            } 
这段代码无法成功创建文件夹,于是把它改成调用java.io.File的mkdirs
String newFolder=root.getLocation().toOSString()+File.separator+filePath;
            File newFile = new File(newFolder);
            if(!newFile.exists()){
                newFile.mkdirs();//mkdirs可创建如d:\a\b的多层文件夹,即使a文件夹之前不存在。
            }
后来BUG仍没有修复。执行完mkdirs后,在操作系统看到文件夹已经生成,但后续的代码仍会报类似空指针的异常。跟踪了很久想了很久,偶然看到别的同事在某些地方有写刷新refreshLocal的代码。
紧接着加上刷新代码,问题解决。
代码最后如下:

            String newFolder=root.getLocation().toOSString()+File.separator+filePath;
            File newFile = new File(newFolder);
            if(!newFile.exists()){
                newFile.mkdirs();
            }
            IFolder folder = root.getFolder(new Path(filePath));
            folder.refreshLocal(IResource.DEPTH_INFINITE, null);

//刷新的API查看这里http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcore%2Fruntime%2Fpackage-tree.html
            folder.refreshLocal(IResource.DEPTH_INFINITE, null);
 
 
1.
class.getClassLoader.getResourceAsStream方法无法取到文件的BUG。
定位到这里返回了空。
ResourceManager.class.getClassLoader().getResourceAsStream(templateName)
后来发现是自己在templateName串是这样子的 templates/default\Action.vm
把右斜改成左斜 templateName=templateName.replace("\\", "/");
BUG解决。
【其实一开始就觉得这个串怪怪的,一直没想到是它的原因,解决自己这个BUG花了好多时间,真不应该,基本功还很薄弱,还有很多需要学习的。发生BUG的昨天,我修改了templateName的赋值代码。收获是:发生BUG的时候,回想之前最近的一次操作是什么,并还原它,以此定位问题产生的位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值