Thursday, June 10, 2010

使用jdb调试webapps

一般如果需要调试Tomcat或者Jboss的Web Application时,多用eclipse等集成环境。但也会碰到某些情况,比如开发环境内存限制等。这时候可以用jdb作简单的调试。
其实方法很简单,基本原则就是在web server或者app server启动jvm的时候,加上jdwp参数,这样jvm会打开一个端口和jdb通讯。然后再启动jdb连接上这个端口就可以了。
具体到tomcat,可以先建立以下一个脚本:

export JPDA_ADDRESS=8000
export JPDA_TRANSPORT=dt_socket
export JPDA_SUSPEND=y
./catalina.sh jpda start


存成startdebug.sh,放在tomcat的bin目录下

然后用这个脚本启动tomcat

接着就可以用
jdb -attach 8000来启动jdb

用stop 语句设好断点。比如
stop in HelloWorldExample.doGet

然后打开浏览器,进入tomcat自带的例子中的HelloWorld Servlet中,这时候jdb应该执行到断点,就可以用jdb命令跟踪或者打印变量了。

Friday, June 4, 2010

Java日期比较的一个陷阱

昨天在调试程序中,碰到一个问题,简化叙述如下
c是个Calendar对象,d是个Date,程序要判断c是否在d之后,判断条件用了
c.after(d)
当打印出来的时候,c的确是在d之后的,但以上条件却总是不成立。

仔细看了JavaDoc后,发现Calendar类的after方法虽然接受所有类型,但只有参数同是Calendar对象的时候日期比较才有意义。否则一律返回假。

解决办法也很简单,其实Date类也有after函数。只要把c转为Date类即可。
c.getTime().after(d)
这样就可以了。