Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugger disconnecting in Android Studio when debugging a home screen widget

I am trying to debug an Android home screen widget application that I made. When pressing a button on the widget, the debugger starts and then it just disconnects from the VM. No reason is given. I am using Windows 10.

This is what the logs say:

D/Atlas: Validating map... D/libEGL: loaded /system/lib/egl/libEGL_emulation.so D/libEGL: loaded /system/lib/egl/libGLESv1_CM_emulation.so D/libEGL: loaded /system/lib/egl/libGLESv2_emulation.so  D/         ] HostConnection::get() New Host Connection established 0xef0394f0, tid 3709  I/OpenGLRenderer: Initialized EGL, version 1.4 D/OpenGLRenderer: Enabling debug mode 0 W/EGL_emulation: eglSurfaceAttrib not implemented  W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xef1485e0, error=EGL_SUCCESS D/roboguice.RoboGuice: Using annotation database(s). D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice] D/roboguice.RoboGuice: Time spent loading annotation databases : 21 W/art: Verification of com.gdbd.geedeebeedee.model.GdbdWidgetRecord      com.gdbd.geedeebeedee.model.GdbdWidgetRecordsRealmImpl.create(java.util.Date) took 127.878ms W/art: Verification of com.gdbd.geedeebeedee.model.GdbdWidgetRecord     com.gdbd.geedeebeedee.model.GdbdWidgetRecordsRealmImpl.getTodaysRecord() took 111.586ms D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_ENABLED D/GdbdWidgetBase: Updating widget index: 0 with id: 23 D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_UPDATE D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_UPDATE_OPTIONS D/GdbdWidgetBase: Received intent: change_day_staus I/art: Thread[5,tid=3470,WaitingInMainSignalCatcherLoop,Thread*=0xf3c30c00,     peer=0x22c0a0a0,"Signal Catcher"]: reacting to signal 3 I/art: Wrote stack traces to '/data/anr/traces.txt'  Disconnected from the target VM, address: 'localhost:8619', transport: 'socket' 

I also pulled traces.txt, but haven't found any obvious error message. Maybe I don't know what to look for. When first placing the widget on the screen the debugger doesn't disconnect. This happens with both the official Emulator and GenyMotion. The emulator is Google Nexus 5 5.1.0 API 22.

enter image description here

These are the Gradle build setting:

android {     compileSdkVersion 25     buildToolsVersion "25.0.0"     defaultConfig {         applicationId "com.gdbd.geedeebeedee"         minSdkVersion 15         targetSdkVersion 25         versionCode 1         versionName "1.0"         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"     }     buildTypes {         release {             minifyEnabled false             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         }     } }  dependencies {     compile fileTree(dir: 'libs', include: ['*.jar'])     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {         exclude group: 'com.android.support', module: 'support-annotations'     })      compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1'     compile 'com.android.support:appcompat-v7:25.0.0'      compile 'org.roboguice:roboguice:3.+'     provided 'org.roboguice:roboblender:3.+'      testCompile 'junit:junit:4.12' } 

Does anyone know what is happening and why I cannot debug? Thanks.

Edit 1:

Apparently the process dies.
enter image description here

D/OpenGLRenderer: Enabling debug mode 0  W/EGL_emulation: eglSurfaceAttrib not implemented  W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xf3ff6900, error=EGL_SUCCESS D/roboguice.RoboGuice: Using annotation database(s). D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice] D/roboguice.RoboGuice: Time spent loading annotation databases : 19 80:   80 D/         ] Socket deconnection  D/GdbdWidgetBase: Received intent: change_day_staus 80:   80 D/         ] Socket deconnection 80:   80 D/         ] Socket deconnection 80:   80 D/         ] Socket deconnection 80:   80 D/         ] Socket deconnection  I/art: Thread[5,tid=13474,WaitingInMainSignalCatcherLoop,Thread*=0xf3c30c00,     peer=0x12c0a0a0,"Signal Catcher"]: reacting to signal 3 I/art: Wrote stack traces to '/data/anr/traces.txt' 

Edit 2 added Android manifest file

`

<application     android:allowBackup="true"     android:icon="@mipmap/ic_launcher"     android:label="@string/app_name"     android:supportsRtl="true"     android:theme="@style/AppTheme">      <meta-data         android:name="roboguice.modules"         android:value="com.gdbd.geedeebeedee.model.ModelModule" />       <activity         android:name=".activity.StatsActivity"         android:label="@string/app_name">         <intent-filter>             <action android:name="android.intent.action.MAIN" />              <category android:name="android.intent.category.LAUNCHER" />         </intent-filter>     </activity>      <receiver android:name=".widget.GdbdWidgetBase" >         <intent-filter>             <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />         </intent-filter>         <intent-filter>             <action android:name="change_day_staus" />         </intent-filter>           <meta-data android:name="android.appwidget.provider"             android:resource="@xml/gdbd_widget_info" />      </receiver>  </application> 

`

Edit 3 traces.txt https://ufile.io/c41eb

Edit 4 GdbdWidgetBase

@Inject     GdbdWidgetRecords gdbdWidgetRecords;      public void onHandleUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {         // Perform this loop procedure for each App Widget that belongs to this provider         for (int widgetIndex = 0; widgetIndex < appWidgetIds.length; widgetIndex++) {             int widgetId = appWidgetIds[widgetIndex];             Log.d(TAG, "Updating widget index: " + widgetIndex + " with id: " + widgetId);              GdbdWidgetRecord todaysRecord = gdbdWidgetRecords.getTodaysRecord();              RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gdbd_widget);              if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY)                 views.setImageViewResource(R.id.btnClicker, R.drawable.ic_gd);             else if(todaysRecord.getCurrentStatus() == DayStatus.BADDAY)                 views.setImageViewResource(R.id.btnClicker, R.drawable.ic_bd);             else if(todaysRecord.getCurrentStatus() == DayStatus.NOTSET)                 views.setImageViewResource(R.id.btnClicker, R.drawable.ic_undecided);               Intent intent = new Intent(context, GdbdWidgetBase.class);             intent.setAction(CHANGE_DAY_STATUS);             intent.putExtra(WIDGET_ID_EXTRA, widgetId);             PendingIntent changeStatusIntent = PendingIntent.getBroadcast(context, widgetId, intent,                     PendingIntent.FLAG_CANCEL_CURRENT);             views.setOnClickPendingIntent(R.id.btnClicker, changeStatusIntent);              scheduleUpdateAtMidnight(context, widgetId);              appWidgetManager.updateAppWidget(widgetId, views);         }     }      @Override     public void onHandleReceived(Context context, Intent intent) {         Log.d(TAG, "Received intent: " + intent.getAction());         //Log.d(TAG,"getDebugUnregister: " + (getDebugUnregister()?"true":"false"));          if (CHANGE_DAY_STATUS.equals(intent.getAction())) {              int appWidgetId = intent.getIntExtra(WIDGET_ID_EXTRA, -1);             if (appWidgetId >= 0) {                 GdbdWidgetRecord todaysRecord = gdbdWidgetRecords.getTodaysRecord();                 Log.d(TAG, "today record: " + todaysRecord.toString());                 DayStatus newDayStatus = DayStatus.NOTSET;                  if(todaysRecord.getCurrentStatus() == DayStatus.NOTSET)                     newDayStatus = DayStatus.GOODDAY;                 else if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY)                     newDayStatus = DayStatus.BADDAY;                 else if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY)                     newDayStatus = DayStatus.NOTSET;                  Log.d(TAG, "newDayStatus: " + newDayStatus);                  gdbdWidgetRecords.changeTodaysStatus(newDayStatus);                 onHandleUpdate(context, AppWidgetManager.getInstance(context), new int[]{appWidgetId});             }         }     }      private void scheduleUpdateAtMidnight(Context context, int widgetId) {         Calendar calendar = Calendar.getInstance();         calendar.setTimeInMillis(System.currentTimeMillis());         calendar.set(Calendar.SECOND, 1);         calendar.set(Calendar.MINUTE, 0);         calendar.set(Calendar.HOUR_OF_DAY, 0);         calendar.add(Calendar.DAY_OF_YEAR, 1);          Intent updateAtMidnightIntent = new Intent(context, GdbdWidgetBase.class);         updateAtMidnightIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);         updateAtMidnightIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetId});          PendingIntent broadcastIntent = PendingIntent.getBroadcast(context, widgetId + 1,                 updateAtMidnightIntent, PendingIntent.FLAG_CANCEL_CURRENT);          AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {             alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcastIntent);         } else {             alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcastIntent);         }     } 

Edit 5 The breakpoint is always in the onReceive() method of my AppWidget. For other intents like android.appwidget.action.APPWIDGET_ENABLED it takes more before the debugger stops, but my app still dies

01-09 22:28:20.861 3881-3881/com.gdbd.geedeebeedee D/GdbdWidget: Received intent: android.appwidget.action.APPWIDGET_ENABLED 01-09 22:29:20.854 3881-3886/com.gdbd.geedeebeedee I/art: Thread[2,tid=3886,WaitingInMainSignalCatcherLoop,Thread*=0x7fbcebe06000,peer=0x2ac070a0,"Signal Catcher"]: reacting to signal 3 01-09 22:29:21.013 3881-3886/com.gdbd.geedeebeedee I/art: Wrote stack traces to '/data/anr/traces.txt' 

Whereas for my own intent that is sent when a button is pressed within the widget it takes 10 seconds.

01-09 22:34:25.353 4314-4314/com.gdbd.geedeebeedee D/GdbdWidget: Received intent: change_day_staus 01-09 22:34:35.362 4314-4319/com.gdbd.geedeebeedee I/art: Thread[2,tid=4319,WaitingInMainSignalCatcherLoop,Thread*=0x7fbcebe06000,peer=0x2ac070a0,"Signal Catcher"]: reacting to signal 3 01-09 22:34:35.549 4314-4319/com.gdbd.geedeebeedee I/art: Wrote stack traces to '/data/anr/traces.txt' 
like image 789
Para Avatar asked Jan 02 '17 10:01

Para


People also ask

What is JDWP Android?

JDWP debugger The Dalvik VM (Virtual Machine) supports the JDWP protocol to allow debuggers to attach to a VM. Each application runs in a VM and exposes a unique port that you can attach a debugger to via DDMS.

Does Android Studio support wireless debugging?

Today, in the latest release of Android Studio called Bumblebee, a new and much easier wireless debugging tool has been released into the IDE. This tool, however, currently only works for Android devices running API 11 or higher.


2 Answers

I went to the emulated device's Settings -> Developer Options and enabled "Show all ANRs" and now a warning appears "Your application is not responding" and I can tap "WAIT" and it seems to work.

like image 145
Para Avatar answered Sep 25 '22 04:09

Para


This is not a solution to stop the detaching. But you can re-attach the debugger directly afterwards. You can attach the debugger to running processes with the button in the toolbar:

enter image description here

I know that it is not ideal, but maybe it is already enough to continue debugging for you.

like image 37
Björn Kechel Avatar answered Sep 26 '22 04:09

Björn Kechel