最近和同事在解决一个定时任务的问题,搞了两三天没搞定,但是最终程序还是能够正常运行了。期间有一些定位问题的方法,感觉很好,可以拿来为以后调试问题所用。下面就简单说两句了。
程序中用的quartz这个开源框架来实现定时任务,具体就是30s去调用groovy脚本。groovy脚本里面发送了三四个webservice的请求,然后再根据各自不同的返回值,做相应的逻辑处理。Job这快用一些反射原理来调用groovy,然后从DB中load一些数据,组装成map,传入groovy中。
1、期间最为常用的就是debug,断点调试了,这个是大家所常用的。F5,F6,F7,F8这些键都是为大家所熟知的,如果是远程调试的,需要在远程(linux)上把web服务里 面的相关文件改一下。(jboss里面的bin文件是run.conf,把里面的倒数第二个#放开,端口改一下,在eclipse里面新建远程实例,配上IP,端口。重启服务即可远程调试 debug。但是只能一个人连接使用。)
2、在没有debug模式之前,或许你也会想到看日志,这个也是所常用的。首先你要确实log4j.properties的日志级别是否是你所要。fault ,error ,info,debug,warn五个级 别,从左往右级别依次降低。打印日志:如果配置为warn,则会打印所有级别;如果配置debug,则打印debug(包含)级别以上的日志。看日志调试问题,这就要求你的日 志打印是否合理或者打印的技巧。
3、在我们那个问题在试了以上两招之后,貌似还没有定位出来问题的根源。后来就采用一种排除法,姑且叫排除法吧。
其实就是注释代码。大家在做项目的时候,也可能会遇到,就是我把某几行代码注释了,代码就正常了。这说明问题就出在注释的代码块里。这个方法虽然有点二,但是也是 万不得已的绝招了。
4、还有就是有可能你的异常没有捕获,就是你没有try catch,导致你不能正确定位问题根源。
这个时候你就要走读代码,看那些地方需要捕获异常。
5、还有就是数据库方面,需要事物提交的地方没有提交,这个需要走读代码去查看。
6、当这次遇到问题,但是以前的版本没有遇到,这时候你就会查阅以前的版本代码,对比代码发现问题。
解决问题,调试问题有很多种,大家在编程的时候也都会遇到,掌握多种方法可以提高定位问题的效率。