java-工具-jdb

JDB是java调试工具。

查看jdwp的使用说明:java -agentlib:jdwp=help

启动jdb

方式1:本地启动class

jdb MyClass

方式2:调试器 连 vm

先运行被调试程序,suspend=n表示程序不会暂停,如果值为y表示vm启动后先暂停程序,等被attach后再运行:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 MyClass

然后jdb连接上该vm:

jdb -attach 5005

方式3:vm 连 调试器

jdb启动监听:

jdb -listen localhost:5005

vm主动连接jdb:

java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=5005 Main

调试语法

基础命令

help (或 ?):打印帮助信息
run:设置完断点后,可以开始运行代码
cont:从断点处继续运行
!!:重复执行最后一个命令
<n> <command>:将命令重复执行 n 次
exit (或 quit):退出调试器

打印信息

print:输出表达式的值(如果要打印本地变量,需要这样javac -g编译)

print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k
print myObj.myMethod() (if myMethod returns a non-null)
print new java.lang.String("Hello").length()

dump:输出对象信息

main[1] dump p
 p = {
    a: 0
    b: 0
}

where:打印当前线程调用栈

main[1] where
  [1] Main.m2 (Main.java:30)
  [2] Main.m1 (Main.java:26)
  [3] Main.main (Main.java:20)

断点

设置断点:

stop at MyClass:22(在指定行断点)
stop in java.lang.String.length(在方法入口断点)
stop in MyClass.<clinit>(在类的静态初始化处断点)
stop in MyClass.myMethod(int,java.lang.String)(如果是重载方法,要指定参数类型)
stop in MyClass.myMethod()(如果是重载方法,必须带括号)

清除断点:

clear MyClass:45

查看断点:

stop 或 clear 都行

单步执行

step:执行当前行

step up:一直执行, 直到当前方法返回到其调用方

stepi:执行当前指令

next:执行当前行(跳过调用)

异常

出现指定的异常错误时中断,jdb会暂停但最终异常还是会抛出去:

catch java.io.FileNotFoundException

取消catch:

ignore java.io.FileNotFoundException

查看:

catch 或 ignore 都行

查看class信息

classes:列出当前已知的类

class:显示已命名类的详细资料

main[1] class java.lang.String
类: java.lang.String
扩展: java.lang.Object
实现: java.io.Serializable
实现: java.lang.Comparable
实现: java.lang.CharSequence
嵌套: java.lang.String$CaseInsensitiveComparator

methods:列出类的方法

main[1] methods Main
** 方法列表 **
Main <init>()
Main main(java.lang.String[])
Main m1()
Main m2()
Main m2(int)
java.lang.Object <init>()
java.lang.Object registerNatives()
java.lang.Object getClass()
java.lang.Object hashCode()
java.lang.Object equals(java.lang.Object)
java.lang.Object clone()
java.lang.Object toString()
java.lang.Object notify()
java.lang.Object notifyAll()
java.lang.Object wait(long)
java.lang.Object wait(long, int)
java.lang.Object wait()
java.lang.Object finalize()
java.lang.Object <clinit>()

fields:列出类的字段

main[1] fields java.lang.String
** 字段列表 **
char[] value
int hash
long serialVersionUID
java.io.ObjectStreamField[] serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER

线程

threads:列出所有线程

> threads
组system:
  (java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler正在执行条件等待
  (java.lang.ref.Finalizer$FinalizerThread)0x161  Finalizer        正在执行条件等待
  (java.lang.Thread)0x160                         Signal Dispatcher正在运行
组main:
  (java.lang.Thread)0x1                           main             正在执行条件等待
  (java.lang.Thread)0x26e                         thread-1         正在休眠

thread 0x26e:切换到指定线程

lock (expr):输出对象的锁信息

main[1] lock p
监视p ("Point@52d455b8") 的信息:
  拥有者: main, 条目计数: 2
 正在等待线程: thread-1

threadlocks [thread id]:输出线程的锁信息

main[1] threadlocks 1
监视线程main的信息:
  拥有的监视器: instance of Point(id=449)
  未等待监视器
main[1] threadlocks 0x26f
监视线程thread-1的信息:
  不拥有监视器
   正在等待监视器: instance of Point(id=449)

其他

use (或 sourcepath) [source file path]:显示或更改源路径

classpath:从目标 VM 输出类路径信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值