使用JDB调试Java程序

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 如何使用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`命令查询这些命令是干什么用的,不用刻意进行记忆。基本上每个命令的名字大致给出了其作用。

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