Android Studio连接到设备上的目标VM,但大部分时间都没有调试它

时间:2015-01-18 19:24:20

标签: android debugging android-studio

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

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

但没有启用任何用于踩入或超过代码等的调试器图标,调试器也不会在任何断点处停止。

我没有在我的清单中设置android:debuggable="true"因为现在似乎已经弃用了。

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

奇怪的是,有时调试器 的行为与预期的一样,但是,10次中的8或9次,它只是不起作用。这非常令人沮丧!我在另一台机器上使用相同的代码和版本的Studio也获得相同的行为。有关如何让Studio的调试器可靠地运行的任何想法吗?

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

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

<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)

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

1 个答案:

答案 0 :(得分:2)

简答: Google Play Services v6.5.87中存在一个已知错误,这意味着当GoogleAnalytics.getInstance()尝试加载XML跟踪器文件时,Google Analytics(GA)极有可能陷入僵局在你的清单中定义。您可以像我一样以编程方式配置GA跟踪器,或通过降级您正在使用的Google Play服务版本(或等待稍后版本中的修复!)来解决此问题。有关详细信息,请参阅hereherehere

我的'Hello World'应用程序有效,因为它没有使用GA。我注意到我的应用程序在Android Studio中的 build.gradle 文件的依赖项部分说过:

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

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

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

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

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

答案很长:我分支了我的代码并将应用程序剥离到只有一个活动的基本要素。它在启动时仍然崩溃,但这次我注意到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()但是被阻止等待锁定&lt; 0x420608a0&gt;由tid = 13持有(client_id_fetcher)

但是线程13“client_id_fetcher”被阻止等待锁定&lt; 0x4205af48&gt;由tid = 1(主要)持有。僵局! (线程12,“GAThread”也被阻止等待相同的锁定。)看到这个后,我能够谷歌在GoogleAnalytics.getInstance()中遇到死锁,这导致我进行上述变通办法。希望这有助于其他人,因为我花了很长时间来追踪这一个!