Jdb是基于命令行的Java调试工具。该工具既可以调试本地java程序,也可以调试远程java程序,本文只讨论如何在没有办法远程调试服务端程序,又没有GUI环境的系统中如何调试tomcat应用。在安装了JDK的系统中,${JAVA_HOME}的bin目录中都会有jdb可执行文文件。
在tomcat中使用jdb的两种方法
方法一:
在启动tomcat时使用${TOMCAT_HOME}/bin/catalina.sh debug方式启动,启动时输入run启动应用

1

方法二:
在catalina.sh文件中的JAVA_OPTS或CATALINA_OPTS变量中添加
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8787
然后使用
   jdb -attach 8787

2


以上两种方式中方法一较为简单,但是需要以debug模式启动。如果需要调试的部分可能需要在运行一段时间才能出现,则可以使用第二种方法。先启用tomcat的jdwp,到了需要调试的时候再attch到应用中。
断点设置
断点也有两种设置断点,一种是通过行号设置断点,一种是通过方法名设置断点(只能设置方法的入口断点)
    stop at com.zving.test.ui.TestUI:13
    stop in com.zving.test.ui.TestUI.execute
查看和删除断点
    > clear   #查看断点
        断点集:
            断点com.zving.ui.TestUI:13
            断点com.zving.ui.TestUI.execute
    > clear com.zving.ui.TestUI:13    #删除断点
        已删除: 断点com.zving.ui.TestUI:13

3


当进入断点时,命令行将会显示被阻塞的线程的名称

    断点命中: "线程=http-8080-2", com.zving.test.ui.TestUI.execute(), 行=13 bci=0
    http-8080-2[1]


通过locals指令可以查看断点处的全局和局部变量

    http-8080-2[1] locals
    方法参数:
    za = instance of com.zving.framework.core.handler.ZAction(id=3919)
    本地变量:
    a = 1
    b = 2
    通过eval 可以执行简单的表达式
    http-8080-2[1] eval a+b
    a+b = 3

4


示例中使用的代码

publicclass TestUI extends UIFacade {
    @Priv(login=false)
    @Alias("test")
    publicvoid execute(ZAction za){
        inta = $I("a");
        intb = $I("b");
        za.writeHTML(a+"+"+b+"="+(a+b));
    }
}