调试Java程序前,需确保Debian系统安装了JDK(Java Development Kit),它包含编译、运行及调试Java程序的工具(如javac、java、jdb)。通过以下命令安装OpenJDK(推荐11及以上版本):
sudo apt update
sudo apt install openjdk-11-jdk
安装完成后,验证安装是否成功:
java -version # 查看Java运行时版本
javac -version # 查看Java编译器版本
若输出版本信息,则说明安装成功。
jdb调试(基础方式)jdb是JDK自带的命令行调试工具,适合习惯终端操作的用户。
javac编译Java程序时,需添加-g选项(包含行号、局部变量等信息,否则jdb无法定位断点):javac -g YourClass.java # 编译时生成调试信息
jdb调试会话jdb命令并指定要调试的类名:jdb YourClass # 启动调试器并加载类
jdb中,使用stop命令在指定位置设置断点:
stop at YourClass:10(在YourClass.java的第10行暂停)stop in YourClass.methodName(在methodName方法入口暂停)run命令启动程序,程序会在断点处暂停。常用调试命令:
next(或n):执行当前行,不进入方法内部(逐行执行);step(或s):执行当前行,进入方法内部(深入调试);continue(或c):继续执行程序,直到下一个断点或程序结束;print variableName(或p variableName):查看指定变量的当前值;locals:查看当前方法的所有局部变量;quit:退出jdb调试会话。IntelliJ IDEA、Eclipse等IDE提供了图形化调试界面,操作更直观,适合复杂项目。以IntelliJ IDEA为例:
File -> Open,导入Java项目(或创建新项目)。Run -> Edit Configurations;+号,选择Remote JVM Debug;Port(如5005,需与远程程序的调试端口一致);Apply保存配置。Shift + F9启动调试。程序会在断点处暂停,调试窗口显示:
list.size());Step Over(F8):逐行执行,不进入方法;Step Into(F7):进入方法内部;Step Out(Shift + F8):跳出当前方法;Resume Program(F9):继续执行至下一个断点;Evaluate Expression(Alt + F8):计算表达式或修改变量值(如variableName = newValue)。若Java程序运行在远程Debian服务器(如Tomcat、Spring Boot应用),需通过**JDWP(Java Debug Wire Protocol)**实现远程调试:
java -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:调试端口(可自定义,需确保服务器防火墙开放该端口)。Remote Debug配置,点击Debug按钮。IDE会连接到远程服务器的5005端口,程序会在断点处暂停,后续操作与本地调试一致。System.out.println或日志框架(如Log4j、SLF4J)输出关键信息,辅助定位问题;jstack查看线程堆栈(排查死锁、线程阻塞),jmap生成堆转储文件(分析内存泄漏),jhat解析堆转储文件(可视化内存使用情况):jstack <pid> # 查看指定进程的线程堆栈(<pid>为Java进程ID,可通过`jps`命令获取)
jmap -dump:format=b,file=heap.hprof <pid> # 生成堆转储文件
jhat heap.hprof # 解析堆转储文件(默认端口7000,通过浏览器访问`http://localhost:7000`)
这些工具可帮助诊断复杂性能问题。以上方法覆盖了Debian下Java调试的常见场景,可根据实际需求选择合适的方式(命令行适合简单调试,IDE适合复杂项目,远程调试适合服务器环境)。