连接到Android设备时shmemBase_attach失败

时间:2016-06-07 04:27:36

标签: android jdb

我正在尝试将我的计算机上的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重新联机。无论如何都不能接受,我希望这可以帮助那些有更深入知识的人找出错误的地方!

2 个答案:

答案 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版本只是键入此答案顶部的命令,您将获得预期的输出。