编写 Java 调试脚本的实用指南
一、脚本类型与适用场景
二、本地调试脚本模板
#!/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 -l 或 ps -ef | grep java 获取目标 PID,再执行脚本进行本地附加调试。适合“应用已在跑,需要临时挂调试器”的情况。三、远程调试脚本模板
#!/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"
#!/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"
jdb -attach <server_ip>:<port>
transport=dt_socket:基于套接字传输;server=y 表示当前 JVM 作为调试服务器;suspend=n 表示启动不中断(若为 y,会等调试器连上再继续,便于排查启动失败);address=5005 为监听端口(新版本 JDWP 可直接写端口;旧版或某些容器可能需要 address=*:5005 或 address=0.0.0.0:5005)。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"]
JPDA_ADDRESS=9999 JPDA_SUSPEND=y catalina.sh jpda start(本地 IDE 以 Socket Listen 方式连 9999)。四、命令行与日志脚本模板
# 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
五、安全与最佳实践
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。