重装Windows10后jdb连接JDWP进程出现握手失败如何解决
问题描述
我正尝试使用jdb.exe连接JDWP进程,重装Windows10系统前相关流程均可正常运行,重装后出现故障。
我使用的批处理脚本如下:
"adb.exe" shell am force-stop com.rockstar.gta3 "adb.exe" shell am start -D -W -n com.rockstar.gta3/.GTA3 setlocal for /f "delims=" %%a in ('"adb.exe" shell pidof com.rockstar.gta3') do @set pid=%%a echo PID=%pid% "adb.exe" forward tcp:23915 jdwp:%pid% set VALUE=CurrentVersion set KEY="HKLM\SOFTWARE\JavaSoft\JDK" reg query %KEY% /v %VALUE% 2>nul && goto JDKisInstalled set KEY="HKLM\SOFTWARE\JavaSoft\Java Development Kit" reg query %KEY% /v %VALUE% 2>nul && goto JDKisInstalled echo JDK not installed, path to JDK could not be read from registry. pause :JDKisInstalled set JDK_VERSION= for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do ( set JDK_VERSION=%%b ) set JDK_HOME= for /f "tokens=2,*" %%a in ('reg query %KEY%\%JDK_VERSION% /v JavaHome ^| findstr JavaHome') do ( set JDK_HOME=%%b ) echo exit | "%JDK_HOME%\bin\jdb.exe" -connect com.sun.jdi.SocketAttach:hostname=localhost,port=23915 pause
脚本此前运行正常,重装系统后执行到jdb.exe步骤时出现如下报错:
C:\Users\fastm\Desktop>"adb.exe" shell am force-stop com.rockstar.gta3 C:\Users\fastm\Desktop>"adb.exe" shell am start -D -W -n com.rockstar.gta3/.GTA3 Starting: Intent { cmp=com.rockstar.gta3/.GTA3 } Status: timeout Activity: com.rockstar.gta3/.GTA3 WaitTime: 10103 Complete C:\Users\fastm\Desktop>setlocal C:\Users\fastm\Desktop>for /F "delims=" %a in ('"adb.exe" shell pidof com.rockstar.gta3') do @set pid=%a C:\Users\fastm\Desktop>echo PID=13456 PID=13456 C:\Users\fastm\Desktop>"adb.exe" forward tcp:23915 jdwp:13456 C:\Users\fastm\Desktop>set VALUE=CurrentVersion C:\Users\fastm\Desktop>set KEY="HKLM\SOFTWARE\JavaSoft\JDK" C:\Users\fastm\Desktop>reg query "HKLM\SOFTWARE\JavaSoft\JDK" /v CurrentVersion 2>nul && goto JDKisInstalled C:\Users\fastm\Desktop>set KEY="HKLM\SOFTWARE\JavaSoft\Java Development Kit" C:\Users\fastm\Desktop>reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit" /v CurrentVersion 2>nul && goto JDKisInstalled HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit CurrentVersion REG_SZ 1.8 C:\Users\fastm\Desktop>set JDK_VERSION= C:\Users\fastm\Desktop>for /F "tokens=2,*" %a in ('reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit" /v CurrentVersion | findstr CurrentVersion') do (set JDK_VERSION=%b ) C:\Users\fastm\Desktop>(set JDK_VERSION=1.8 ) C:\Users\fastm\Desktop>set JDK_HOME= C:\Users\fastm\Desktop>for /F "tokens=2,*" %a in ('reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"\1.8 /v JavaHome | findstr JavaHome') do (set JDK_HOME=%b ) C:\Users\fastm\Desktop>(set JDK_HOME=C:\Program Files\Java\jdk1.8.0_121 ) C:\Users\fastm\Desktop>echo exit | "C:\Program Files\Java\jdk1.8.0_121\bin\jdb.exe" -connect com.sun.jdi.SocketAttach:hostname=localhost,port=23915 java.io.IOException: handshake failed - connection prematurally closed at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136) at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232) at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116) at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90) at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519) at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328) at com.sun.tools.example.debug.tty.Env.init(Env.java:63) at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1082) Fatal error: Unable to attach to target VM. C:\Users\fastm\Desktop>pause
已排查情况
- 尝试JDK8、11、17等多个版本,均无法解决该问题
- 查阅Java源码和JDWP官方规范确认该报错出自handshake方法,原因是JDB未收到目标端返回的
JDWP-Handshake响应。根据规范,调试端发送JDWP-Handshake字符串后,目标VM应返回相同内容完成握手,但本次调试中未收到任何回复 - 测试
adb forward tcp:7000 tcp:7000功能可正常运行,说明adb的普通端口转发功能正常,仅JDWP相关的转发存在异常
解决方案
按优先级逐一测试以下排查修复步骤:
- 调整脚本等待时延:当前脚本在完成adb端口转发后立刻发起jdb连接,部分设备上JDWP服务初始化存在延迟,可在
adb forward tcp:23915 jdwp:%pid%行后添加2秒等待,批处理中添加代码:timeout /t 2 /nobreak >nul - 检查adb版本兼容性:重装系统后安装的adb版本如果与之前不同,可能存在JDWP转发兼容问题,升级adb到最新稳定版,或回退到重装前使用的adb版本再测试
- 检查本地端口占用:执行命令
netstat -ano | findstr "23915"确认本地23915端口未被其他进程占用,若存在占用可更换其他未使用的端口测试 - 关闭防火墙/安全软件拦截:新装Windows系统默认防火墙可能拦截本地回环端口的JDWP通信,临时关闭系统防火墙和第三方安全软件后再测试,也可手动添加入站/出站规则放行adb.exe、jdb.exe的本地通信权限
- 检查设备调试权限:确认设备端USB调试授权已开启,部分机型还需开启USB调试(安全设置)、允许调试应用等特殊权限,重新插拔设备确认授权正常后再测试
- 替换jdb连接命令:将原jdb连接命令替换为
"%JDK_HOME%\bin\jdb.exe" -attach localhost:23915测试,部分JDK版本的connect参数存在适配问题
内容的提问来源于stack exchange,提问作者fastman92
相关产品推荐
相关产品推荐

