千里之行始于足下

文件路径问题引起的BUG

Posted on By Peter Yang

工作几个月,觉得有必要把遇到的BUG记录一下,并且总结一些基本的思路方法以避免以后再重蹈覆辙。

现象:

软件中使用到了FTP功能,软件本身作为FTP服务端,可支持客户端从服务端传输文件。这本是个极其简单的功能,FTP使用Apache的开源代码,已知无问题。但是软件运行在Win7和WinXP上表现却不相同,Win7上一切顺利,WinXP上则不行,显示错误是下载文件失败。

分析及解决过程:

从表面上看,问题应该出在配置文件上。

起先认为WinXP下或许未能正确解析文件格式。于是试验一,将软件中FTP功能剥离出来,单独运行于WinXP上,设为进程B,修改软件,让其可以使用B进程的FTP,发现一切正常。

再猜测是否是配置文件中的相对路径问题,于是修改为绝对路径,发现WinXP下仍然失败。

至此,开始觉得问题奇怪以及棘手(开始陷入混乱,一段时间后恢复冷静)。

最后使用基本替换法(找到问题可能性极大,但效率极低),即把认为不错的代码块A依次放到出错代码路径上,逐步检查什么时候出现问题。第一次放在软件开始运行前,发现一切正常;第二次放到软件执行FTP相关功能之前,发现错误。显示FTP下载文件路径不正确。进一步分析,发现由于代码块A中使用了相对路径,而在WinXP下,第一次和第二次的执行路径下,程序的当前路径发生变化,(具体变为第一次当前路径的某个子路径),因而出错。

至此,问题找出,WinXP下程序运行过程中,当前路径可能会发生变化,而FTP配置文件中的根目录使用了相对路径,这就导致两个系统下的软件行为不一致。

解决方法很简单,使用绝对路径就可以了。

总结:

这个BUG其实算不上大问题,本来嘛,相对路径和绝对路径而已,使用相对路径有其灵活性。但是BUG显现的表象不是那么清晰,因为看起来似是两个系统的兼容性问题(起初怀疑的就是这个,因为不是都不行)。这样看,还是绝对路径比较安全,可以在软件初始运行时,获取当前根目录的绝对路径,软件中仍采用相对路径,再使用该绝对路径前缀拼接得绝对路径。

OK,第一个BUG就总结完了。问题虽不难,但前后算起来,耗时足有1天,包括中间混乱阶段的胡乱尝试。其实早在发现不易解决之时就应该使用替换法了,虽慢但绝大多数情况下均有效。