温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Debug怎样编写调试脚本

发布时间:2025-11-22 07:29:47 来源:亿速云 阅读:111 作者:小樊 栏目:编程语言

编写 Java 调试脚本的实用指南

一、脚本类型与适用场景

  • 本地调试脚本:在开发机直接运行应用,配合 IDE 断点、单步、观察表达式等完成问题定位。适合日常开发与功能验证。
  • 远程调试脚本:在服务器或容器里启动 Java 时开启 JDWP,本地 IDE 通过 Socket Attach 连接调试。适合测试、预发或无法在本地复现的问题。
  • 命令行轻量调试脚本:使用 jdb 或脚本化的日志开关,快速验证启动期问题或无需 IDE 的场景。

二、本地调试脚本模板

  • 使用 JDWP 附加到当前 JVM(适合已由其他方式启动的应用,如应用服务器、测试进程):
#!/usr/bin/env bash
# local-attach.sh
set -e

if [ $# -lt 2 ]; then
  echo "Usage: $0 <pid> <port>"
  exit 1
fi

PID=$1
PORT=$2

jdb -attach $PORT
  • 说明:先用 jps -lps -ef | grep java 获取目标 PID,再执行脚本进行本地附加调试。适合“应用已在跑,需要临时挂调试器”的情况。

三、远程调试脚本模板

  • 服务端启动脚本(主动连接,Attach 模式,推荐)
#!/usr/bin/env bash
# remote-debug.sh
set -e

APP_JAR="your-app.jar"
DEBUG_PORT=${DEBUG_PORT:-5005}
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$DEBUG_PORT"

echo "Starting $APP_JAR with JDWP on port $DEBUG_PORT ..."
exec java $JAVA_OPTS -jar "$APP_JAR"
  • 服务端启动脚本(被动连接,Listen 模式,适合排查启动期问题)
#!/usr/bin/env bash
# remote-listen.sh
set -e

APP_JAR="your-app.jar"
LISTEN_PORT=${LISTEN_PORT:-8000}
# 注意:address 写成 0.0.0.0:8000 便于外部连入;仅本机连入可用 127.0.0.1:8000
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0.0.0.0:$LISTEN_PORT"

echo "Waiting for debugger on port $LISTEN_PORT (suspend=y)..."
exec java $JAVA_OPTS -jar "$APP_JAR"
  • 客户端连接(IDE 或命令行)
    • IDEA/Eclipse:新建 Remote Debug Configuration,Host 填服务器 IP,Port 填 5005/8000,Transport 选 Socket Attach
    • 命令行 jdb 连接:
jdb -attach <server_ip>:<port>
  • 参数要点
    • transport=dt_socket:基于套接字传输;server=y 表示当前 JVM 作为调试服务器;suspend=n 表示启动不中断(若为 y,会等调试器连上再继续,便于排查启动失败);address=5005 为监听端口(新版本 JDWP 可直接写端口;旧版或某些容器可能需要 address=*:5005address=0.0.0.0:5005)。
  • 容器与 Tomcat 快捷方式
    • Docker 示例(主动连接):
FROM openjdk:11-jre-slim
COPY your-app.jar /app.jar
EXPOSE 8080 5005
CMD ["java","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-jar","/app.jar"]
  • Tomcat:使用内置 JPDA 启动,JPDA_ADDRESS=9999 JPDA_SUSPEND=y catalina.sh jpda start(本地 IDE 以 Socket Listen 方式连 9999)。

四、命令行与日志脚本模板

  • 使用 jdb 的最小调试会话
# 1) 启动应用(示例,端口 5005)
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar your-app.jar

# 2) 另开终端连接
jdb -attach localhost:5005

# 常用 jdb 命令
# stop in com.example.Service.handle  # 在方法入口设断点
# cont                           # 继续运行
# step / next / print / locals    # 单步、步入、打印、查看局部变量
  • 开关式日志脚本(无需改代码即可调整输出)
#!/usr/bin/env bash
# run-with-debug.sh
set -e

DEBUG_MODE=${DEBUG_MODE:-false}
JAVA_OPTS="$JAVA_OPTS -Ddebug=$DEBUG_MODE"

echo "Starting with DEBUG_MODE=$DEBUG_MODE ..."
exec java $JAVA_OPTS -jar your-app.jar
  • 在代码中使用日志框架(如 SLF4J/Logback/Log4j2)按级别输出,配合启动参数控制日志详细程度,便于在不改业务代码的情况下动态调节“调试信息量”。

五、安全与最佳实践

  • 远程调试请仅在内网或受控环境开启,避免对公网暴露 JDWP 端口;必要时配合 防火墙/安全组 限制来源 IP,并使用不常用的端口。
  • 生产环境不建议长期开启调试;若必须,使用 suspend=n 并限制访问,调试结束立即关闭或移除调试参数,避免性能与安全风险。
  • 容器化场景务必显式 EXPOSE 调试端口,并在编排文件(如 Kubernetes)中设置 NetworkPolicyService 仅对调试人员开放。
  • 启动失败优先用 suspend=y 捕获初始化阶段问题;定位完成后改回 suspend=n 以免影响正常启动与运行。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI