我正在尝试将我的计算机上的jdb连接到我的Android设备上的进程(任何进程),但它根本不起作用。
因此我使用的命令直接取决于Google ADB文档。首先我做
adb forward tcp:3456 jdwp:pid
然后我尝试使用jdb尝试连接
jdb -attach emulatorIP:3456
但是我收到以下错误:
java.io.IOException: shmemBase_attach failed: The system cannot find the file specified
at com.sun.tools.jdi.SharedMemoryTransportService.attach0(Native Method)
at com.sun.tools.jdi.SharedMemoryTransportService.attach(SharedMemoryTransportService.java:108)
at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
at com.sun.tools.jdi.SharedMemoryAttachingConnector.attach(SharedMemoryAttachingConnector.java:63)
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.
编辑:我有更多的线索,但我没有接近实际的解决方案。
JDB -attach由于某种原因默认使用共享内存方法调试,尽管所有文档都坚持指定hostname:port作为-attach参数将强制它使用套接字进行远程调试。要强制它,你使用ykw的答案提供的命令,但它表面上由于某些连接错误而失败。
经过进一步调查后,似乎JDB和ADB在一些未知资源上相互冲突,导致各种套接字连接错误。我目前的解决方法是完全关闭ADB并运行JDB,然后当我完成JDB时,我让ADB重新联机。无论如何都不能接受,我希望这可以帮助那些有更深入知识的人找出错误的地方!
答案 0 :(得分:1)
尝试退出Android Studio。
即使你的项目没有,它的ADB也在运行。下面是一个示例,我退出Android Studio,运行ADB,在设备中启动我的应用程序,然后再次运行ADB以查看新进程ID,转发端口并最终附加JDB:
$ adb -d jdwp
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *
28462
^C
$ adb -d jdwp
28462
1939
^C
$ adb -d forward tcp:7777 jdwp:1939
$ jdb -attach localhost:7777 -sourcepath ./src
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
您还可以在Android Studio中打开和关闭ADB:
Android Studio->Tools->Android->Enable ADB Integration
禁用ADB集成后,您可以照常从控制台运行ADB。您还可以使用以下命令控制和后台ADB守护程序:
adb kill-server
adb start-server
我浪费了几个小时,所以它真的需要更好的文档。此外,我想知道如何同时运行Android Studio调试器和JDB,以便我可以在单步执行调试器时分析所有方法调用(因为内置的Android Studio监视器跟踪不显示连续的方法调用参数):
http://mybrainoncode.com/blog/2013/11/03/debugging-android-with-jdb/
https://teaspoon-consulting.com/articles/tracing-java-method-calls.html
答案 1 :(得分:0)
您可以尝试输入此命令:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=3456
理论上,您应该得到以下输出:
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
但是,我得到了以下内容:
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)
有谁知道为什么会这样?
好的......上述问题已经解决。这是由于adb调用之间的冲突。任何时间点都应该只运行1个adb实例。当jdb尝试连接而adb已在您的程序中运行时,会发生这种情况。 jdb将永远无法在此状态下成功附加。
TLDR版本只是键入此答案顶部的命令,您将获得预期的输出。