爆一个logcat工具的小小bug

a220315410 2010-12-21 09:50:46
最近在做android平台的自动测试工具,所以读了一些android开发工具的源码,今天不经意间发现了一个小小的BUG,对于一个新手来说,有点沾沾自喜阿,所以上来小小的炫耀下:
在读logcat工具源码的时候,在com.android.ddmuilib.logcat包的logpanel.java文件下的deleteFilter函数的时候,发现存在一处小小的逻辑错误,代码如下:
public void deleteFilter() {
synchronized (mBuffer) {
if (mCurrentFilter != null && mCurrentFilter != mDefaultFilter) {
// remove the filter from the list
removeFilterFromArray(mCurrentFilter);
mCurrentFilter.dispose();

// select the new filter
mFolders.setSelection(0);
if (mFilters.length > 0) {
mCurrentFilter = mFilters[0];
} else {
mCurrentFilter = mDefaultFilter;
}

mCurrentFilter = mDefaultFilter;

selectionChanged(mCurrentFilter);

// update the content of the "other" filter to include what was filtered out
// by the deleted filter.
if (mDefaultFilter != null) {
initDefaultFilter();
}

mFilterStorage.saveFilters(mFilters);
}
}
}

deleteFilter函数在使用者点击logcat面板上的删除Filter按钮的时候被调用,函数的作用是,删除当前的filter,并释放其占用的资源,然后将default filter设定为当前过滤器(mCurrentFilter),并对default filter进行一些初始化操作。
但是在这几句中,发生了矛盾:
  mFolders.setSelection(0);
if (mFilters.length > 0) {
mCurrentFilter = mFilters[0];
} else {
mCurrentFilter = mDefaultFilter;
}

mFolders.setSelection(0);说明显示default filter面板。
但是之后的 if (mFilters.length > 0) {
mCurrentFilter = mFilters[0];
} else {
mCurrentFilter = mDefaultFilter;
}
却仅仅当,删除当前filter后不存在其他的自定义filter的情况下,才将mCurrentFilter设定为mDefaultFilter。所以当使用者创建了2个或者两个以上的自定义过滤器时,删除其中一个过滤器时,这个bug就会表现出来。
这个bug可以很容易地被验证:
1. 首先我们创建两个自定义过滤器,1和2,现在面板上有3个过滤器了,如下:

2. 然后设定log标签(就是代码中的mDefaultFilter,我之前称之为default filter)的log级别为V,如图:

3. 设定1标签的log级别为随便什么,和log标签的log级别不一样就行,我设定为D,如图:

4. 然后删除标签2,正常逻辑来说,界面应该显示log标签,且log级别应该是V,也就是V按钮被选中,但是结果是:

如图所示,被选中的是D按钮,说明当前过滤器的log级别是D。
其实,这里的当前filter是1标签对应的filter,而不是log标签对应的default filter,说明这个BUG是的确存在的。

不过,其实发现这个BUG也没什么意思,基本不影响使用,要不是在读源码,我估计我这辈子也不见得会发现这个bug。
嘛嘛,很无聊的在这里发布下,权当给大家见笑了。
...全文
202 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
FangandBin 2010-12-23
  • 打赏
  • 举报
回复
哈哈,这个给力
csuhanyong 2010-12-23
  • 打赏
  • 举报
回复
楼主真是学习中的榜样,够细心!

up2pu 2010-12-23
  • 打赏
  • 举报
回复
学习很认真啊
Ki_Mi 2010-12-22
  • 打赏
  • 举报
回复
楼主真是学习中的榜样,够细心!
vclongking 2010-12-22
  • 打赏
  • 举报
回复
嗯 ,不错 ,关注了。
hai675264783 2010-12-22
  • 打赏
  • 举报
回复
呵呵,楼主牛叉,佩服佩服,继续
a220315410 2010-12-22
  • 打赏
  • 举报
回复
我去同事的电脑上看了一下,windows下,同样有这个问题存在。
他的环境是:OS 是 winodws XP eclipse 3.6 + ADT 8.0 + sdk2.3
a220315410 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sodino 的回复:]

在Window下,我按楼主的步骤,没检出这样的bug来,为啥???
[/Quote]

恩,我是在Linux下发现这个BUG的,准确的来说,我的开发环境配置是:
eclipse3.52 HELIOS + ADT0.99 + sdk2.2的配置,OS是 ubuntu 10.04
windows下,我去看看
-船长- 2010-12-22
  • 打赏
  • 举报
回复
研究源码 够牛 !
a220315410 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhq56030207 的回复:]

不错噢
[/Quote]
谢谢夸奖,不过sdk中的工具都是用JAVA写的,而且还带注释,其实很简单,很容易读懂的。
纠结的木棉花 2010-12-22
  • 打赏
  • 举报
回复
不错噢
blue2007527 2010-12-22
  • 打赏
  • 举报
回复
lz很给力
dui_cky 2010-12-22
  • 打赏
  • 举报
回复
lz很给力,呵呵~! 了解了
CoolSunfeng 2010-12-22
  • 打赏
  • 举报
回复
RamBo_jay 2010-12-21
  • 打赏
  • 举报
回复
先学习了,我们现在做订制,里面也出现了好多问题
Sodino 2010-12-21
  • 打赏
  • 举报
回复
在Window下,我按楼主的步骤,没检出这样的bug来,为啥???
Dartagnan 2010-12-21
  • 打赏
  • 举报
回复
学习了,自己一直都是在用东西,但还没认真去想过这个东西的原理什么的!

向楼主致敬!
ameyume 2010-12-21
  • 打赏
  • 举报
回复
牛叉,学习
一直都是使用,没研究这么仔细。
妖怪 2010-12-21
  • 打赏
  • 举报
回复
学习一下 android系统中的bug不少
尤其是涉及到工具以及C++和C里面的

至少已经发现了不少JNI接口里面有内存释放的问题了

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧