在我写的SeleniumGUI工具里面,有一个功能,当前的脚本有改动时,在新建脚本、打开其它脚本、关闭程序时,会提示当前脚本有改动,是否要保存。但是有一个BUG,就是当前脚本没有做任何改动时,有时也会弹这个提示,甚至刚打开程序,什么也不做,关闭程序,也会弹提示,这就很懵逼了。这个BUG,最开始的时候,我就发现了。只是原先简单地调试,没有找到问题的所在,以为是随机BUG,也由于影响不是很大,暂时没有处理。只是,现在由于之前公司的同事,使用这个软件,顺带提起了这件事,就想着把它解决掉,那么我又是怎么解决这个BUG的呢?
首先,在我的程序里,有一个容器,实际上就是一个单例类,里面存放的都是一些全局性的变量或是对象。脚本是否有改动,也是在这里面,用一个变量来维护的。
当脚本作出改动时,会调用这个方法,将changeFile置为true,在新建脚本等操作时,就会判断一下这个值是否为true。如果为true就弹提示。现在是脚本并没有做出改动,也弹提示了,那就说明调用了setChangeFile方法。如果能够知道是谁调用了这个方法,不就可以找出问题的所在了么。要知道这个方法被谁调用了,就需要追踪栈信息,于是在这个方法里加一些代码:
public static void setChangeFile(boolean b){
StackTraceElement[] elems = Thread.currentThread().getStackTrace();
System.out.print(String.valueOf(b) + ":::");
for(StackTraceElement elem : elems){
System.out.print(elem.getClassName() + "." + elem.getMethodName() + "()---");
}
System.out.println();
domain.changeFile = b;
}
加的这些代码,就是将当前线程的方法调用的栈信息,都打印出来。
然后,运行程序,在程序界面上,不改动脚本的情况下,做操作,实际上就是鼠标移来移去,然后就发现是在复选框,鼠标移入移出的时候,会调用这个方法。这样就定位到了BUG的所在,原来是复选框加的监听器不对,改过来就行了,BUG解决。