Debugging Day

今天下午审查我们这边的Java代码时捕捉到N个bug,收获颇多。在这里小总结一下。

1. 最难找的bug

这个bug困惑我们很久了,我们为了它 已经有好几天食不甘味了。bug的症状是这样的,在通过ls读取数据连接的数据时,总是停在最后那里。我们一直以为是read的原因,而且网上也有讨论说是靠read()的返回值并不可靠。于是我们都在研究read()……但今天孔建军突然报告说是close()出问题了,而且把FTPOutStream.close()去了问题就没有了!最后分析发现,应该是Java中的stdout不能关闭。

修补很简单,如果是标准输出跳过关闭就行了。


+if (!LocalFile.equals(“”)) //We can NOT close the stdout.

  • FTPOutStream.close();
    2. 最无奈的bug

我们ls/get某个文件总是出错,一开始还以为是编码问题,后来我才发现竟然是空格问题!

修补就是把多余的空格去了!

3. 最头疼的bug

FTPConnection.Status的值几乎总是不对,关键是处理异常后没有恢复原来的状态。因为它和异常处理缠绕在一起,所以不太好修复。

4. 处理最巧妙的bug

到最后,周晓炜发现一个问题,我们竟然无法区分close和quit,因为有控制连接时我们都把它翻译成了QUIT!在处理QUIT时无法对最初的输入进行判断。

我想到的修复办法比较巧妙,那就是在quit对应的QUIT后面再加一个QUIT。发送第一个QUIT命令后,可以通过检查后一个命令是否还是QUIT来判断是quit还是close。这样问题就解决了。