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
:
- Obtener dinámicamente elementos estirables por ID
- Importar 3 SDKs, obtiene el error: Se han encontrado 3 versiones de android-support-v4.jar
- Usar ubicación simulada sin configurarla en la configuración
- No se puede encontrar la clase de símbolo Intent
- Cómo dibujar correctamente texto en una clase extendida para TextView?
> 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?
- Analizar HTML en Android
- Especificar intervalos para que el Administrador de ubicaciones transmita la ubicación actual en Android
- Android detecta instanceof EditText y instanceof TextView como el mismo
- ¿Es posible la llamada a SOAP webservice usando Retrofit?
- Android: EditText causando una pérdida de memoria
- IntelliJ Idea auto crea un nuevo método
- Obtención de error al inflar la clase android.support.design.widget.NavigationView
- ¿Cuál es el ciclo de vida de un fragmento cuando se llama replace ()?
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 cambiar el diseño del elemento recyclerview desde fuera?
- ¿Cómo crear una aplicación de chat en android?