您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 博尔塔拉蒙古分类信息网,免费分类信息发布

Bug修复经历

2023/8/19 17:44:27发布41次查看
在做上配置文件处理。当向sp插入字符串时,只要插入值与已存储的值不同,会抛出cce, s b. 纳闷了好些时间,特写下此文以做纪念。据性能测试工具行业资深人士表示,其发展还会处于很好的态势。
出现问题的代码
(ks , s ) {
pu=pu();
..s(.(), );
..();
}
很标准的写法,但是每次调用这里,都会抛出一个强制转换异常,s不能强制转换成b。问题是,这里跟b有一毛线关系啊= =
通俗的说,是系统要我提供一个苹果给他,然后我给了一个苹果给他,他告诉我,我想要的是雪梨,你给我个苹果干嘛?()?
经历
一开始一直以为是系统抽风了,肯定是我api没用对吧。但是翻看了以前写的一些代码,几乎是一模一样啊,这怎么可能啊。
没办法,直接调进去看看系统都做了些啥吧。
() {
mcr= tm();
r c =r() {
() {
{
.tdl.();
}(ie ) {
}
}
};
qw.(c);
r wr =r() {
() {
c.();
qw.(c);
}
};
spi..dw(, wr);
o &#;
sp,
.
l();
}
这是函数的代码,第二行的 tm() 是把更新值写入到内存中;之后等待写入锁;获取到写入锁后调用 dw 把更新值写入到存储设备中;后通知各监听器。
可以看到,我们调用 s 时所作的更改,会在 tm() 里写入到内存。
现在可以猜测,跟进去 tm() 应该能看到问题所在了吧?( &; )?
r
mcr tm() {
...
(m.e&;s, o&;: m.s()) {
s= .k();
o= .v();
( == ) {
(!m.k()) {
;
}
m.();
}{
s = ;
(m.k()) {
o v = m.();
(v !=&;&; v.()) {
;
}
}
m.(, );
}
.m = ;
(l) {
.m.();
}
}
...
}
关键代码这么多,不是把更新值与原值比对一下,如果相同不更新,不相同才写入到中进行下一步的更新嘛。不可能存在任何类型问题啊。
关键
多次调试后,发现只有当需要更新值时才会抛出强转错误,但是即使是抛出强转错误,新值也是正常写入到了配置文件中的。
想起韩老师的《老码识途》一书中的一句话: &;当我们关注案发现场时,元凶很有可能转移场地了。
此时我们应该肯定的是我们的调用方法应该是没有错的。这里有一个关键点:错误只会在需要更新值时才会抛出。
到这里其实已经比较清晰了,更新值会产生两种动作:. 写入配置文件;. 通知监听器。
解决
既然写入文件是系统代理了的,问题基本不可能出现在这里,所以可以明确的是:错误应该是发生在监听器中。
把整个项目的监听器找了个遍,竟然发现了以下这样的二逼代码:
@o
spc(sp p, s _) {
ks= ks.o(_);
= pu.(, );
() {
s();
}{
o();
}
}
发现了没,竟然没有做任何的类型检测把值转换成了,怎么可能不错= =
后记
静下来想想,出现这样的情况,主要是两个原因:
一开始时想着配置文件只存值,不存其他值。但是在后续开发时忘记了之前的约定,把一个s写入了配置文件
由于前面的约定,在所有用到配置文件取值的地方省去了类型检测
调试的时候不够冷静,其实直接把异常后查看其st很容易找到问题所在,毕竟还是太轻了
可以想象,这么一个个人项目,都可能发生违反约定的情况,何况多人合作的项目呢。
其实对于第一二点,解决也不难,是在所有函数的入口都做有效性检测,不能相信任何传入值的正确性。
博尔塔拉蒙古分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录