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.
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:
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'
traces.txt
mentioned here:I/art: Wrote stack traces to '/data/anr/traces.txt'
– Buatti.widget.GdbdWidgetBase
? – Buatti