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

相关文章
|
7天前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
8天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
18 5
|
9天前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
15天前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
17 1
|
1月前
|
缓存 监控 安全
如何提高 Java 高并发程序的性能?
以下是提升Java高并发程序性能的方法:优化线程池设置,减少锁竞争,使用读写锁和无锁数据结构。利用缓存减少重复计算和数据库查询,并优化数据库操作,采用连接池和分库分表策略。应用异步处理,选择合适的数据结构如`ConcurrentHashMap`。复用对象和资源,使用工具监控性能并定期审查代码,遵循良好编程规范。
|
2月前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
48 2
|
2月前
|
搜索推荐 JavaScript 前端开发
简单实用,Python代码调试利器/java代码的设计和解读
尽管有许多高级调试工具,但在多数情况下,`print()`仍是便捷之选。`icecream`库则将`print()`调试法发挥到极致,简化变量检查与信息输出,提升调试效率。无论是基本变量还是复杂数据结构,`icecream`都能轻松应对,并支持自定义输出格式,让你的调试工作更高效。下面,让我们一起探索`icecream`的更多实用功能吧!
17 0
|
2月前
|
数据采集 人工智能 监控
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
|
2月前
|
Java jenkins Shell
还有人不会启动JAVA程序
还有人不会启动JAVA程序
17 0
|
2月前
|
Java 调度
下一篇
无影云桌面