分类: C/C++
2013-01-20 20:50:38
最近在测试一个模块的稳定性,测试过程中发现该模块时不时的报rename失败。
首先通过日志找到报错的代码,没有记录参数信息、具体出错码,没什么有用的信息。只好修改代码记录下参数信息及errno值,再拿去跑,还好能顺利的重现该现象,得到的errno是2,即ENOENT,再根据参数信息确认下oldpath所指的文件是不是真的不存在,一看果然不存在!怎么会呢,oldpah所指的文件是模块自己的输出,文件肯定是生产了,但现在确实该文件不存在,难道是被其它程序给删除了?于是做了个实验,随便往该目录下拷贝了一个文件,一段时间后果然该文件被删除了,又重复了几次发现该目录下的文件一分钟会被删除一次。
找到原因了,下面还想弄明白到底是哪个程序在干这件事,没什么好办法,只能一个个排除,杀掉一个我们开发的模块,往该目录下丢一个文件,看文件是否被删除。把所有的模块都杀了,文件还是被删除,接下来该排除系统程序了,想到了cron,看了下/etc/crontab,确认没有程序在删除该目录下的文件。又排除了一遍我们开发的模块,还是没找到。没办法还得盯着cron,at了,看下cron的日志/var/log/cron,发现了有几个任务是/etc/crontab配置文件里没有的,突然想起用户还可以通过crontab 工具来编辑定时任务,最后终于逮到了“罪魁祸首”!
通过这次经历有几个教训:
1、日志要写详细,特别是调用第三方库或系统库的地方,详细记录错误码;
2、调试时,要正视问题,你认为再不可能的事情但它就是发生了,只能接受这个事实,冷静分析可能的原因,想办法找到解决问题;
3、以前添加定时任务,都是直接修改/etc/crontab,这种“错误”的做法造成了思维定势,认为只有这个地方可以添加定时任务;
4、自己以后的设计要注意,避免提供多种方法给用户修改配置,且又没统一的视图的做法;