Cómo establecer correctamente un punto de interrupción en una clase anidada mediante JDB?

package com.android.internal.telephony.dataconnection; public abstract class DcTrackerBase extends Handler { protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (DBG) log("onReceive: action=" + action); [...] 

En el código anterior, usando jdb , me gustaría establecer un punto de interrupción en el método onReceive . He utilizado el siguiente comando:

 > stop in com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive 

Y lo obtengo de jdb :

 > Deferring breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive. It will be set after the class is loaded. 

Sé que la clase ya está cargada, así que imagino que jdb no está encontrando el método que quiero. ¿Cómo debo fijar mi punto de interrupción entonces?

El nombre del método wrangled es incorrecto.

En JDB, emita este comando para inspeccionar la clase DcTrackerBase :

 > class com.android.internal.telephony.dataconnection.DcTrackerBase Class: com.android.internal.telephony.dataconnection.DcTrackerBase extends: android.os.Handler subclass: com.android.internal.telephony.dataconnection.DcTracker nested: com.android.internal.telephony.dataconnection.DcTrackerBase$1 

Como podemos ver, la clase anidada DcTrackerBase$1 podría ser nuestra clase BroadcastReceiver . Para verificar, emita el siguiente comando:

 > class com.android.internal.telephony.dataconnection.DcTrackerBase$1 Class: com.android.internal.telephony.dataconnection.DcTrackerBase$1 extends: android.content.BroadcastReceiver 

Eso es ! Para establecer el punto de interrupción correctamente, escribimos:

 > stop in com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive Set breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive 

Está creando una clase anónima cuando anula el onReceive como en el código anterior. Esto debería crear una clase con un nombre en la forma DcTrackerBase $ (un número) dependiendo de cuántas otras clases anónimas / internas tiene en el archivo DcTrackerBase.java. Escribí un ejemplo para replicar tu problema.

 public class DebugFun{ public static void main(String[] args){ Object myObj = new Object(){ public String toString(){ int x = 1; x++; return "X is:"+x; } }; System.out.println(myObj); } } 

Luego llame

 jdb DebugFun 

Para iniciar el depurador entonces:

 stop in DebugFun$1.toString run 

Y ahora el depurador está dentro de la clase interna.

  • ¿Cómo saber si ahora el tiempo es entre dos horas?
  • Android READ_EXTERNAL_STORAGE permiso no funciona
  • Error al instalar split apks: com.android.ddmlib.InstallException: Error al finalizar la sesión: INSTALL_FAILED_INVALID_APK
  • Java / Android optimización de código: ¿Java quita el código inalcanzable en la construcción
  • No se puede mostrar el hash correcto en Java. ¿Qué está mal?
  • Abrir archivo adjunto .txt de correo electrónico en la aplicación para Android
  • No se puede resolver "com.google.android.gms.gcm.GcmReceiver"?
  • Android consigue la altura de la bandera de adMob cuando aparece
  • Android AutoCompleteTextView con chips
  • ¿Podemos tener texto ineditable en edittext
  • AChartEngine Y-Axis personaliza los márgenes de área de etiquetas y los valores de gráfico como String?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.