Java命令行调试程序

简介: Java命令行调试程序

第一部分 进入调试模式


通过jre提供的jdb程序可以实现命令行调试java程序。关于jdb的命令语法可以参考 官方文档。下面我讲通过实例手把手将大家学会命令行调试


Step 1 创建项目

1. mkdir -p ~/jdwp/src/main/java/com/jdwp/test

2. cd ~/jdwp/src/main/java/com/jdwp/test

3. touch Test.java

4. 编写代码Test.java

package com.jdwp.test;
/**
 * Created by jiangbin on 2018/6/29.
 */
public class Test {
    public static void main(String[] args) {
        int i = 0;
        int j = 1;
        int k = i+j;
        System.out.println(k);
    }
}

Step 2 编译字节码

1. cd ~/jdwp

2. mkdir classes

3. javac -g src/main/java/com/jdwp/test/Test.java -d classes

-g参数表示生成debug信息(这个很重要不能漏)

在classes文件夹下的com/jdwp/test/目录下生成了Test.class

Step 3 运行并调试

在此阶段需要开启两个Terminal。一个用来执行java命令。一个用来执行jdb命令调试


1. java命令开启调试模式(在Terminal1中)

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 -cp classes/ com.jdwp.test.Test

如果命令行输出以下内容表示进入调试模式成功

Listening for transport dt_socket at address: 8000

2. 执行jdb命令(在Terminal2中)

jdb -attach 8000


如果命令行输出以下内容表示成功


设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
正在初始化jdb...
VM 已启动: > 当前调用堆栈上没有帧
main[1]


Step 4 调试

这一步的操作都是在Terminal2中进行的


1. 设置断点

输入 stop in com.jdwp.test.Test.main(表示在Test的main方法打断点)

命令行出现如下提示,表示断点成功

正在延迟断点com.jdwp.test.Test.main。
将在加载类后设置。

2. 执行命令

1.输入next,next相当于执行一步方法
2.输入locals,会打印方法本地变量表
3. ...更多命令

何进入调试模式相信大家都会了吧。jdb除了next locals两命令。它有16个调试命令。下面我就一一讲解下


2. jdb命令全面分析

前面的内容通过实例告诉大家如何调试程序。为了过程的连续性,不产生打断,没有过多的讲解jdb的详细内容。比如打断点,前面讲解了 在方法内打断点,那如果想具体到行号,改如何设置。调试的其他命令也没有讲解。下面我将为大家做一个比较全面的讲解


1.设置断点

stop in java.lang.String.length
stop in MyClass.<init>
stop in MyClass.<init>(java.lang.String) //带参数的
stop at MyClass:10//在第1行中断

2.命令

connectors – 列出此 VM 中可用的连接器和传输


run [class [args]] – 开始执行应用程序的主类


threads [threadgroup] – 列出线程


thread – 设置默认线程


suspend [thread id(s)] – 挂起线程 (默认值: all)


resume [thread id(s)] – 恢复线程 (默认值: all)


where [ | all] – 转储线程的堆栈


wherei [ | all]– 转储线程的堆栈, 以及 pc 信息


up [n frames] – 上移线程的堆栈


down [n frames] – 下移线程的堆栈


kill – 终止具有给定的异常错误对象的线程


interrupt – 中断线程


print – 输出表达式的值


dump – 输出所有对象信息


eval – 对表达式求值 (与 print 相同)


set = – 向字段/变量/数组元素分配新值


locals – 输出当前堆栈帧中的所有本地变量


classes – 列出当前已知的类


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


methods – 列出类的方法


fields – 列出类的字段


threadgroups – 列出线程组


threadgroup – 设置当前线程组


stop in .[(argument_type,…)] – 在方法中设置断点


stop at : – 在行中设置断点


clear .[(argument_type,…)] – 清除方法中的断点


clear : – 清除行中的断点


clear – 列出断点


catch [uncaught|caught|all] | – 出现指定的异常错误时中断


ignore [uncaught|caught|all] | – 对于指定的异常错误, 取消 ‘catch’


watch [access|all] . – 监视对字段的访问/修改


unwatch [access|all] . – 停止监视对字段的访问/修改


trace [go] methods [thread] – 跟踪方法进入和退出。 – 除非指定 ‘go’, 否则挂起所有线程


trace [go] method exit | exits [thread] – 跟踪当前方法的退出, 或者所有方法的退出 – 除非指定 ‘go’, 否则挂起所有线程


untrace [methods] – 停止跟踪方法进入和/或退出


step – 执行当前行


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


stepi – 执行当前指令


next – 步进一行 (步过调用)


cont – 从断点处继续执行


list [line number|method] – 输出源代码


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


exclude [, … | “none”] – 对于指定的类, 不报告步骤或方法事件


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


monitor – 每次程序停止时执行命令


monitor – 列出监视器


unmonitor

相关文章
|
1月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
2月前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
1月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
47 2
|
1月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
101 1
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
38 1
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
44 5
|
2月前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
1月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
30 0
|
2月前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
100 1
|
1月前
|
XML 前端开发 Java
JAVA调试webservice接口
JAVA调试webservice接口
22 0