使用JDB调试Java程序

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 如何使用JDB命令行调试Java程序呢?

问题描述:

在使用EAS SANP软件进行影像数据裁剪的时候,遇到了程序报错,通过观察报错信息无法定位错误原因,如下图。

从报错信息来看,提示“Points of LinearRing do not form a closed linestring”,但是我仔细检查了用于裁剪的多边形数据(以WKT格式表示的POLYGON)是闭合的,和报错信息不相符。

至此,陷入迷惘中……

解决思路:

SNAP软件是使用Java开发,GPT工具是一个BASH脚本(类UNIX系统下),这个脚本调用了JAVA实现的功能。那如何进行代码调试找到报错原因呢?

第一:我们需要弄清楚BASH是如何调用Java的;

由于GPT实质是一个BASH脚本,我们可以通过调试BASH的技巧,找到GPT这个脚本到底干了什么,如何调用Java。

通过`bash -x`参数可以实现将BASH脚本的运行过程进行输出,在输出的信息中,我们可以定位到Java的调用代码,如下图。

bash -x ~/Applications/snap/bin/gpt Subset -PgeoRegion="POLYGON((87.40 41.80, 87.40 42.10, 86.70 42.10, 86.70 41.80, 87.40 41.80))" -Ssource=A2014115074500.L2.h5 -f HDF5 -t A2014115074500.L2.h5

第二:我们需要直接调试Java打包的二进制文件。

可以使用Java JDK自带的JDB工具在命令行中直接对Java程序进行调试,JDB的使用和C++ GDB以及Python 的PDG调试类似。但是还有一个问题:这个程序是Java编译以后的字节码,无法查看Java源码。

这个问题可以通过在GitHub下载EAS SANP软件的源码,在调试过程中可以对照源码进行调试。

操作实践:

我们在命令行通过JDB命令启动Java程序:

jdb -Dsnap.mainClass=org.esa.snap.core.gpf.main.GPT -Dsnap.home=/Users/tanzhenyu/Applications/snap/bin/.. -Djava.awt.headless=true -Dinstall4j.noLoggingFix=true -Xmx22G -classpath /Users/tanzhenyu/Applications/snap/.install4j/i4jruntime.jar:/Users/tanzhenyu/Applications/snap/.install4j/launcher4522bb12.jar:/Users/tanzhenyu/Applications/snap/snap/modules/ext/org.esa.snap.snap-core/org-esa-snap/snap-runtime.jar install4j.org.esa.snap.runtime.Launcher_gpt Subset '-PgeoRegion=POLYGON((87.40 41.80, 87.40 42.10, 86.70 42.10, 86.70 41.80, 87.40 41.80))' -Ssource=A2014115074500.L2.h5 -x -f HDF5 -t A2014115074500.L2.h5
 4313  bash -x ~/Applications/snap/bin/gpt Subset -PgeoRegion="POLYGON((87.40 41.80, 87.40 42.10, 86.70 42.10, 86.70 41.80, 87.40 41.80))" -Ssource=A2014115074500.L2.h5 -f HDF5 -t A2014115074500.L2.h5

启动JDB调试以后,首先,首先需要在程序可能出错的地方设置断点。我们可以通过程序的报错信息大致确定需要打断点的地方。通过使用`stop in`在某个类的某个方法中设置断点或者使用`stop at`在某个类文件的某一行设置断点;然后,使用`run`命令将程序跑起来,程序会在之前设置断点的地方停下来;最后,使用`next`、`step`、`step up`以及`cont`等命令进行程序调试,可以使用`print`以及`dump`等命令查看指定变量的值。调试完成,通过`exit`或者`quit`退出JDB调试。

这里涉及很多JDB命令,我们进入JDB以后,可以通过`help`命令查询这些命令是干什么用的,不用刻意进行记忆。基本上每个命令的名字大致给出了其作用。

目录
相关文章
|
3月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
126 2
|
1月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
310 98
|
3月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
430 0
|
2月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
4月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
208 0
|
8月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
168 4
|
8月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
306 0
|
8月前
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
182 3
|
8月前
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
下一篇
oss云网关配置