当前位置:

首页 > 编程开发 > Java在Debian下如何调试

Java在Debian下如何调试

在Debian这类Linux发行版下开发Ja va应用,调试环节是躲不开的必修课。从基础入门到远程调试,再到配合一些辅助工具排查疑难杂症,每一步都有对应的最佳实践。这篇文章就把Debian下调试Ja va程序的常见招式走一遍,挑着用就行。 准备工作:安装JDK 调试Ja va程序的第一步很直接:得先

在Debian这类Linux发行版下开发Ja va应用,调试环节是躲不开的必修课。从基础入门到远程调试,再到配合一些辅助工具排查疑难杂症,每一步都有对应的最佳实践。这篇文章就把Debian下调试Ja va程序的常见招式走一遍,挑着用就行。

准备工作:安装JDK

调试Ja va程序的第一步很直接:得先确认系统里有JDK(Ja va Development Kit)。这东西是编译、运行和调试Ja va程序的工具箱,像ja vacja vajdb这些命令行工具都靠它。推荐装OpenJDK,版本选11或者更高,用包管理器一条命令就搞定:

Ja va在Debian下如何调试

sudo apt update
sudo apt install openjdk-11-jdk

装完之后验证一下环境:

ja va -version  # 查看Ja va运行时版本
ja vac -version # 查看Ja va编译器版本

屏幕上能正常弹出版本号,那就算准备妥当了。

使用命令行工具jdb调试(基础方式)

如果你偏爱终端操作,或者没有条件装图形界面,jdb就是JDK自带的那把瑞士军刀。听起来是纯键盘战士的玩法,但用熟了反而利落。

第一步,编译时记得加上-g选项。少了这个标记,生成的字节码里不包含行号、局部变量这些调试信息,jdb根本找不到断点的位置:

ja vac -g YourClass.ja va

第二步,启动调试会话:

jdb YourClass

第三步,设置断点。用stop命令可以按文件名加行号,也可以按方法名来:

  • stop at YourClass:10 —— 在第10行停住
  • stop in YourClass.methodName —— 进入指定方法时停住

第四步,正式开始调试。输入run启动程序,代码会在断点处暂停。这时候面前就是一个可以自由探索的战场了:

  • next(或n):逐行执行,不钻进方法体
  • step(或s):执行当前行,且进入方法内部
  • continue(或c):继续跑,直到下一个断点
  • print variableName(或p variableName):查看变量当前值
  • locals:展示当前方法里所有局部变量
  • quit:退出调试会话

使用IDE调试(推荐方式)

对于稍微复杂一点的项目,还是IDE更友好。IntelliJ IDEA或Eclipse这类编辑器提供了图形化的调试界面——点一点、看一看,比命令行直观得多。拿IntelliJ IDEA举个例子:

先导入项目:File -> Open,把Ja va项目拉进来。如果需要调试远端的服务(比如Tomcat、Spring Boot应用),还得加个远程调试配置:

  • 点顶部菜单 Run -> Edit Configurations
  • +号,选Remote JVM Debug
  • 设置好端口(就像5005,得跟远程程序的调试端口对应上)
  • 点击Apply保存

调试操作本身很简单:在编辑器左侧行号旁边点一下,红色圆点就代表断点已设好。然后点击工具栏的Debug按钮(就是那个绿色小虫子),或用快捷键Shift + F9启动。程序会在断点处暂停,调试窗口会展示当前作用域内的变量、自定义表达式,以及线程的调用堆栈。

常用的调试按钮基本都在工具栏上:

  • Step OverF8):不进入方法,自身逐行走
  • Step IntoF7):钻进方法里去
  • Step OutShift + F8):跳出当前方法
  • Resume ProgramF9):继续跑,直到下一个断点
  • Evaluate ExpressionAlt + F8):当场算个表达式,或者改个变量值

远程调试(服务器场景)

有时候Ja va程序是跑在远程的Debian服务器上的,比如Tomcat或Spring Boot应用。这时候就需要借助JDWP(Ja va Debug Wire Protocol)来建立远程调试通道。

第一步,启动远程程序时带上几个JVM参数。以Spring Boot为例,启动命令看起来会是这样:

ja va -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar your-application.jar

拆开看看这几个参数的作用:

  • transport=dt_socket:走Socket通信
  • server=y:当前程序扮演调试服务器的角色,等待调试器来连
  • suspend=n:程序不等人,直接启动。如果设成y,那就得等调试器连上了才启动
  • address=5005:调试端口,可以自己定,但别忘了一块把服务器防火墙打开

第二步,IDE这边,选择之前配置好的远程调试项,点击Debug按钮。IDE就会连到远程服务器的5005端口。剩下的操作就跟本地调试一模一样了,在你设置的断点处停住、单步、查变量,都没问题。

辅助调试工具

调试这件事不止于打断点和单步执行。日志分析永远是最直接的辅助手段,System.out.println或者Log4j、SLF4J这些日志框架都能润物细无声地帮你理清逻辑。如果遇到性能问题或者死锁、内存泄漏这类深层bug,JDK自带的工具就得请出来了:

jstack                                      # 查看进程的线程堆栈(pid由jps提供)
jmap -dump:format=b,file=heap.hprof         # 生成堆转储文件
jhat heap.hprof                                   # 解析堆转储文件,默认7000端口

这些工具很适合用来诊断复杂性能问题,特别是多线程协作不正常或者内存占用居高不下的时候,它们能提供非常核心的线索。

Debian下的Ja va调试场景基本就这些了。命令行适合简单快速的排查,IDE适合做项目级别的精细化调试,远程调试则是面对生产环境必要的一招。选哪种方式,完全取决于你手头的问题有多大、环境有多复杂。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

一个 memwatch 实战案例:定位野指针问题
一个 memwatch 实战案例:定位野指针问题

内存监控工具的价值与挑战在软件开发,尤其是使用C/C++这类手动管理内存的语言时,内存错误是程序员最常遭遇的难题之一。其中,野指针问题因其隐蔽性和破坏性,往往成为最难定位的“幽灵”缺陷。它可能潜伏在代码中,在特定条件下才被触发,导致程序崩溃、数据损坏或难以预测的行为。传统的调试手段,如打印日志或使用

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。