Maven Tomcat embedded JDB调试

 

1、设置MAVEN_OPTS

 

由于mvn tomcat6:run是使用embedded tomcat的方式,因此,debug必须通过配置Maven实现,在环境变量中配置:

MAVEN_OPTS

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

 

其中,address=8000表示通过JDB连接的端口为8000。配置完成后,运行mvn tomcat6:run 会启动8000端口,用于JDWP调试。

 

2、使用JDB进行调试

 

在命令行中运行:

jdb –connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000

可以通过jdb的命令添加断点,并进行调试,常用的命令如下:

 

** 命令列表 ** 
connectors                -- 列出此 VM 中可用的连接器和传输器

run [类 [参数]]        -- 开始执行应用程序的主类

threads [线程组]     -- 列出线程 
thread <线程 ID>        -- 设置默认线程 
suspend [线程 ID]    -- 暂停线程(默认值为 all) 
resume [线程 ID]     -- 恢复线程(默认值为 all) 
where [<线程 ID> | all] -- 转储线程的堆栈 
wherei [<线程 ID> | all] -- 转储线程的堆栈以及 pc 信息 
up [n 帧]             -- 向上移动线程的堆栈 
down [n 帧]           -- 向下移动线程的堆栈 
kill <线程 ID> <表达式>   -- 中止具有给定的异常对象的线程 
interrupt <线程 ID>     -- 中断线程

print <表达式>              -- 输出表达式的值 
dump <表达式>               -- 输出所有对象信息 
eval <表达式>               -- 计算表达式的值(与 print 作用相同) 
set <lvalue> = <表达式>     -- 为字段/变量/数组元素指定新值 
locals                    -- 输出当前堆栈帧中的所有本地变量

classes                   -- 列出当前已知的类 
class <类 ID>          -- 显示已命名类的详细信息 
methods <类 ID>        -- 列出类的方法 
fields <类 ID>         -- 列出类的字段

threadgroups              -- 列出线程组 
threadgroup <名称>        -- 设置当前线程组

stop in <类 ID>.<方法>[(参数类型,...)] 
                          -- 在方法中设置断点 
stop at <类 ID>:<行> -- 在行中设置断点 
clear <类 ID>.<方法>[(参数类型,...)] 
                          -- 清除方法中的断点 
clear <类 ID>:<行>   -- 清除行中的断点 
clear                     -- 列出断点 
catch [uncaught|caught|all] <类 ID>|<类模式> 
                          -- 出现指定的异常时中断 
ignore [uncaught|caught|all] <类 ID>|<类模式> 
                          -- 对于指定的异常,取消 'catch' 
watch [access|all] <类 ID>.<字段名> 
                          -- 监视对字段的访问/修改 
unwatch [access|all] <类 ID>.<字段名> 
                          -- 停止监视对字段的访问/修改 
trace [go] methods [thread] 
                          -- 跟踪方法的进入和退出。 
                          -- 除非指定 'go',否则所有线程都将暂停 
trace [go] method exit | exits [thread] 
                          -- 跟踪当前方法的退出或所有方法的退出 
                          -- 除非指定 'go',否则所有线程都将暂停 
untrace [方法]         -- 停止跟踪方法的进入和/或退出 
step                      -- 执行当前行 
step up                   -- 执行到当前方法返回其调用方 
stepi                     -- 执行当前指令 
next                      -- 跳过一行(跨过调用) 
cont                      -- 从断点处继续执行

list [line number|method] -- 输出源代码 
use(或 sourcepath)[源文件路径] 
                          -- 显示或更改源路径 
exclude [<类模式>, ...|“无”] 
                          -- 不报告指定类的步骤或方法事件 
classpath                 -- 从目标 VM 输出类路径信息

monitor <命令>         -- 每次程序停止时执行命令 
monitor                   -- 列出监视器 
unmonitor <监视器号>      -- 删除某个监视器 
read <文件名>           -- 读取并执行某个命令文件

lock <表达式>               -- 输出对象的锁信息 
threadlocks [线程 ID]   -- 输出线程的锁信息

pop                       -- 弹出整个堆栈,且包含当前帧 
reenter                   -- 与 pop 作用相同,但重新进入当前帧 
redefine <类 ID> <类文件名> 
                          -- 重新定义类代码

disablegc <表达式>          -- 禁止对象的垃圾回收 
enablegc <表达式>           -- 允许对象的垃圾回收

!!                        -- 重复执行最后一个命令 
<n> <命令>             -- 将命令重复执行 n 次 
# <命令>               -- 放弃(不执行) 
help(或 ?)               -- 列出命令 
version                   -- 输出版本信息 
exit(或 quit)            -- 退出调试器

<类 ID>: 带有软件包限定符的完整类名 
<类模式>: 带有前导或后缀通配符 (*) 的类名 
<线程 ID>: 'threads' 命令中所报告的线程号 
<表达式>: Java(TM) 编程语言表达式。 
支持大多数常见语法。

 

普通运行Java调试方式如下:

java -agentlib:jdwp=transport=dt_socket,address=localhost:8888,server=y,
   suspend=y Hello

你可能感兴趣的:(Maven Tomcat embedded JDB调试)