You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重装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相关的转发存在异常
解决方案

按优先级逐一测试以下排查修复步骤:

  1. 调整脚本等待时延:当前脚本在完成adb端口转发后立刻发起jdb连接,部分设备上JDWP服务初始化存在延迟,可在adb forward tcp:23915 jdwp:%pid%行后添加2秒等待,批处理中添加代码:timeout /t 2 /nobreak >nul
  2. 检查adb版本兼容性:重装系统后安装的adb版本如果与之前不同,可能存在JDWP转发兼容问题,升级adb到最新稳定版,或回退到重装前使用的adb版本再测试
  3. 检查本地端口占用:执行命令netstat -ano | findstr "23915"确认本地23915端口未被其他进程占用,若存在占用可更换其他未使用的端口测试
  4. 关闭防火墙/安全软件拦截:新装Windows系统默认防火墙可能拦截本地回环端口的JDWP通信,临时关闭系统防火墙和第三方安全软件后再测试,也可手动添加入站/出站规则放行adb.exe、jdb.exe的本地通信权限
  5. 检查设备调试权限:确认设备端USB调试授权已开启,部分机型还需开启USB调试(安全设置)、允许调试应用等特殊权限,重新插拔设备确认授权正常后再测试
  6. 替换jdb连接命令:将原jdb连接命令替换为"%JDK_HOME%\bin\jdb.exe" -attach localhost:23915测试,部分JDK版本的connect参数存在适配问题

内容的提问来源于stack exchange,提问作者fastman92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:24:04