Android Studio 连接到设备上的目标 VM 但不会对其进行调试 - 大多数时候

标签 android debugging android-studio

我正在 ubuntu 14.04 中的 Android Studio 1.0.2 中使用从 Eclipse 迁移的应用程序项目。我是 Studio/IntelliJ 和 Gradle 的新手。当我通过单击 Studio 中的调试图标来调试应用程序时:

  • 应用由 Gradle 构建
  • 弹出“选择设备”对话框,我可以选择我的手机
  • 调试 Pane 在变量下显示:“已连接到目标 VM,地址:'localhost:8601',传输:'socket'

但是没有启用用于单步执行或跨过代码等的调试器图标,并且调试器不会在任何断点处停止。

我没有在我的 list 中设置 android:debuggable="true",因为它现在似乎已被弃用。

我已尝试按照建议删除除一个 JDK 之外的所有 JDK here但我仍然有这个问题。

奇怪的是,有时调试器确实按预期运行,但 10 次中有 8 或 9 次,它就是行不通。这非常令人沮丧!我在另一台机器上使用相同的代码和 Studio 版本也得到了相同的行为。请问关于如何使 Studio 的调试器可靠运行的任何想法?

1 月 23 日更新:相同的 Studio 实例能够很好地调试新创建的“Hello World”应用程序,所以这可能与我的应用程序项目有关,这是问题所在,但我不知道是什么。也许它只发生在从 Eclipse 迁移的某些项目中——例如,合并 list 时;但这是一个完整的猜测。

2 月 7 日更新: 如果我将调试器设置为在出现任何异常时暂停,那么我首先会看到此异常抛出:libcore.io.ErrnoException: access failed: ENOENT (No such file or目录)。主线程的堆栈跟踪是:

<1> main@830017070344, prio=5, in group 'main', status: 'RUNNING'
  at libcore.io.ForwardingOs.access(ForwardingOs.java:38)
  at java.io.File.doAccess(File.java:283)
  at java.io.File.exists(File.java:363)
  at dalvik.system.DexPathList.splitAndAdd(DexPathList.java:168)
  at dalvik.system.DexPathList.splitPaths(DexPathList.java:149)
  at dalvik.system.DexPathList.splitLibraryPath(DexPathList.java:130)
  at dalvik.system.DexPathList.<init>(DexPathList.java:98)
  at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:52)
  at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:65)
  at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:57)
  at android.app.LoadedApk.getClassLoader(LoadedApk.java:317)
  at android.app.LoadedApk.makeApplication(LoadedApk.java:493)
  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4170)
  at android.app.ActivityThread.access$1400(ActivityThread.java:134)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4867)
  at java.lang.reflect.Method.invokeNative(Method.java:-1)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
  at dalvik.system.NativeStart.main(NativeStart.java:-1)

这之后是加载 BootClassLoader 异常,因为类加载器尝试加载我的应用程序和 Google 的类中的类,但失败了。在我的设备上,我只看到操作栏 - 没有别的:(。我看到其他人有类似的问题 here 。有趣的是,他们也从 Eclipse 迁移到 IntelliJ,但与他们不同的是,我在 Eclipse 中没有遇到问题已经 AFAIK。他们似乎从来没有深入了解它。有什么想法吗?我仍然不明白是什么触发了这个,因为有时调试器确实按预期工作。

最佳答案

简短回答:Google Play 服务 v6.5.87 中存在一个已知错误,这意味着 Google Analytics (GA) 极有可能在 GoogleAnalytics.getInstance() 时发生死锁。尝试加载 list 中定义的 XML 跟踪器文件。您可以通过编程方式配置您的 GA 跟踪器来解决它,就像我所做的那样,或者通过降级您正在使用的 Google Play 服务的版本(或等待更高版本中的修复!)。参见 here , herehere了解更多信息。

我的“Hello World”应用可以运行,因为它没有使用 GA。我注意到我的应用在 Android Studio 中的 build.gradle 文件的依赖项部分是这样说的:

compile 'com.google.android.gms:play-services:+'

我猜我的应用程序的原始 Eclipse 版本引用了没有此问题的旧版本的 Google Play 服务,并且当应用程序迁移到 Android Studio 时,恰好为 v6.5.87 提供了此错误。非常感谢谷歌!我已经将上面的行更改为

compile 'com.google.android.gms:play-services:6.5.87'

所以至少我确切地知道我得到了什么,并且可以自己决定何时升级!

至于类加载错误,它们似乎无关(并且无害?),但我仍然不知道是什么导致了它们。

长答案:我对我的代码进行了分支,并通过一个 Activity 将应用程序剥离到最基本的部分。它在启动时仍然崩溃,但这次我注意到 LogCat 中的这一行:

I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'

我在我的文件系统中使用这个命令将跟踪转储从我的手机拉到我的电脑:

~/android-sdks/platform-tools$ ./adb pull /data/anr/traces.txt

在 traces.txt 的头部我看到了这个(我的应用程序包和名称已更改):

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x41606508 self=0x415f6660
  | sysTid=4925 nice=0 sched=0/0 cgrp=[no-cpu-subsys] handle=1074638640
  | schedstat=( 71380610 113708500 297 ) utm=3 stm=4 core=1
  at com.google.android.gms.analytics.ae.getLogger((null):~-1)
  - waiting to lock <0x420608a0>  held by tid=13 (client_id_fetcher)
  at com.google.android.gms.analytics.ae.V((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.a((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.eZ((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.<init>((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.<init>((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.getInstance((null):-1)
  at com.mycompany.mypackage.MyApp.getTracker(MyApp.java:61)
  at com.mycompany.mypackage.MyActivity.onCreate(MyActivity.java:125)
  at android.app.Activity.performCreate(Activity.java:5047)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
  at android.app.ActivityThread.access$700(ActivityThread.java:134)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4867)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
  at dalvik.system.NativeStart.main(Native Method)

"client_id_fetcher" prio=5 tid=13 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x4205e778 self=0x5a51d948
  | sysTid=4941 nice=0 sched=0/0 cgrp=[no-cpu-subsys] handle=1515314584
  | schedstat=( 16052255 21850583 224 ) utm=1 stm=0 core=1
  at com.google.android.gms.analytics.GoogleAnalytics.eY((null):~-1)
  - waiting to lock <0x4205af48>  held by tid=1 (main)
  at com.google.android.gms.analytics.ae.getLogger((null):-1)
  at com.google.android.gms.analytics.ae.V((null):-1)
  at com.google.android.gms.analytics.k.eq((null):-1)
  at com.google.android.gms.analytics.k$1.run((null):-1)

"GAThread" prio=5 tid=12 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x4205b950 self=0x415e59c8
  | sysTid=4940 nice=10 sched=0/0 cgrp=[no-cpu-subsys] handle=1096703512
  | schedstat=( 15808103 21026609 173 ) utm=1 stm=0 core=1
  at com.google.android.gms.analytics.GoogleAnalytics.getInstance((null):~-1)
  - waiting to lock <0x4205af48>  held by tid=1 (main)
  at com.google.android.gms.analytics.w.<init>((null):-1)
  at com.google.android.gms.analytics.x.init((null):-1)
  at com.google.android.gms.analytics.x.run((null):-1)

您可以看到线程 ID (tid) 1,“main”,正在调用 GoogleAnalytics.getInstance() 但被阻止等待 tid=13 (client_id_fetcher) 持有的锁 <0x420608a0>

但是线程 13“client_id_fetcher”被阻塞,等待 tid=1(主线程)持有的锁 <0x4205af48>。僵局! (线程 12,“GAThread”也被阻止等待相同的锁。)看到这个之后,我能够在 GoogleAnalytics.getInstance() 中用谷歌搜索死锁,这让我找到了上面提到的解决方法。希望这对其他人有帮助,因为我花了很长时间才找到这个!

关于Android Studio 连接到设备上的目标 VM 但不会对其进行调试 - 大多数时候,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013822/

相关文章:

java - 在 onTouch (Android) 上获取颜色(像素)信息

c++ - DirectX 10 资源泄漏

java - 在gradle中获取Android项目的classpath

git - 改进 IntelliJ 注释(git blame)

android - 在平板电脑的 Android 应用程序中获取外部存储路径

android - 有没有办法让 <paper-toolbar> 使用 Polymer Starter Kit 占据屏幕的整个宽度?

android - 如何在 Firebase 实时数据库中连接三个表?

android - 自定义属性不适用于 android 中的主题

android - 有没有办法获得在android中调试的特定权限?

VBA HTML 抓取错误 "Object Variable or With Variable not set"