我一直在尝试运行jdb尝试将其附加到我的Android设备上的进程。
我尝试过的命令如下:
adb forward tcp:12345 jdwp:4127
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345
我们可以假设pid 4127的过程仍然存在。
但是,输入2个命令后,我收到如下错误消息:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:130)
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:1066)
我注意到一个奇怪的行为,只有在我的一个应用程序运行时才会出现此输出。这可能是由于程序运行时线程或进程或端口的冲突造成的吗?
当特定应用程序关闭时,我可以在大多数情况下获得以下输出:
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> Input stream closed.
我还尝试使用以下步骤在管理员模式下运行命令提示符:
netsh advfirewall set global StatefulFTP disable
adb forward tcp:12345 jdwp:4127
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345
输出如下:
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:1066)
Fatal error:
Unable to attach to target VM.
答案 0 :(得分:1)
尝试退出Android Studio。
问题在于Android Studio保持其ADB运行,这与您的ADB冲突。有关详细信息,请参阅my answer您的类似问题。
答案 1 :(得分:0)
问题在于我的程序启动了android调试桥的实例。当我的程序试图运行jdb时,会发生ADB的竞争条件。由于我的程序在运行jdb之前已经创建了一个ADB实例,因此jdb将永远无法成功附加。即使通过命令提示符运行jdb也会得到相同的结果。关闭我的程序会破坏ADB的实例,这就是为什么我可以在程序关闭后通过命令提示符运行jdb。
我希望我的回答能提供一些线索,说明为何会出现这种现象。