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 crear carpetas en Google Drive sin duplicar?
  • Construir un proyecto con Ant que incluye ActionbarSherlock como un proyecto de biblioteca
  • Diferencia entre system.gc () y runtime.gc ()
  • Cargador universal de imágenes de Android que muestra parcialmente las imágenes
  • Android Studio crear una variante de construcción / tipo excluyendo jniLibs?
  • NullPointerException en getDefaultSharedPreferences
  • La construcción de dos APK de un Android-Source-Tree
  • Cómo extraer imágenes y texto en orden de un archivo PDF utilizando iText en Android
  • Cómo eliminar el espacio específico entre el padre y el niño en un ExpandableListView
  • La forma más agradable de pedir a los usuarios que cambien a un nuevo paquete (eliminar la aplicación actual e instalar una nueva)
  • Usar ubicación simulada sin configurarla en la configuración
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.