java - otra - Eclipse: rompe el código de usuario cuando se genera una excepción no controlada en la aplicación de Android
llamar a otra aplicacion desde android studio (2)
Mi problema es simple:
Uso Ecplise (Luna o Neon) para desarrollar en Android y no quiero usar Android Studio
Deseo depurar saltos en TODAS las excepciones no manejadas solo en la última llamada de código de usuario de la pila que causa la excepción (Así, por ejemplo, no quiero interrumpir un ZygonteInit & MethodAndArgsCaller.run () inútil cuando una excepción es causada por pasando una referencia nula a un método nativo de SDK de Android).
Sé que puedo establecer un punto de interrupción para una excepción particular en la vista de punto de interrupción (NullPointerException..Throwable ...) pero quiero interrumpir TODOS sin ser manejados. Sé que puedo filtrar la depuración configurando "filtros de paso" en la opción de depuración de Java, pero en mi caso esto no funciona para todas las excepciones.
EDITAR
En la imagen debajo de mi pila en la vista de depuración cuando se produce una excepción (una división por cero en mi código)
Y la pila del subproceso principal si configuro un Controlador de Excepciones Sin Recuperar por defecto después de que se levanta la excepción.
Básicamente, si lo entiendo correctamente, desea establecer un punto de interrupción que se activará en el punto en que se produzca una excepción si esa excepción no es / no se manejaría posteriormente.
Si eso es lo que quieres decir, entonces lo que estás pidiendo es básicamente imposible.
En el momento en que se lanza la excepción, el depurador no puede saber si se va a detectar la excepción.
En el punto donde se captura la excepción, se habrá descartado el estado (es decir, cuadros de la pila, variables, etc.) desde el punto de lanzamiento ... y hasta el punto de captura ...
Las API de depuración de Java no admiten un mecanismo de "rebobinado y reproducción" que un depurador podría usar para esto.
En mi opinión, lo mejor que puede hacer es 1) identificar la excepción que sospecha que no se está capturando, 2) establecer un punto de interrupción en su constructor o en un constructor de superclase adecuado, 3) determinar algunas condiciones para filtrar los casos que no son interesantes, y 4) paso a través del código para ver si la excepción está atrapada o no.
Nota: una excepción puede ser lanzada o retornada en un punto diferente al lugar donde fue instanciada, por lo que un punto de interrupción de constructor de excepción no siempre ayudará. Pero normalmente lo hará.
Primero puede verificar si esta configuración en Eclipse está habilitada.
Ventana -> Preferencias -> Java -> Depurar -> Suspender la ejecución en excepciones no detectadas
Si esta configuración está habilitada, cualquier excepción no detectada suspenderá la JVM exactamente en el momento en que se lanzó, incluidas las clases invocadas mediante reflexión. Esto es sin agregar ningún punto de interrupción , pero siempre que no esté manejado , es decir, su código ni siquiera es invocado por un código externo desde un try-catch.
Por ejemplo
int a = 0, b= 0;
System.out.println(a/b); // ArithmeticException
Incluso si se llama a este código desde un código invocado por reflexión, eclipse se suspenderá en sysout con todas las variables aún disponibles en la pila.
Sin embargo, en la clase de inicio de Android ZygoteInit
hay esta línea:
catch (Throwable t) {
Log.e(TAG, "Error preloading " + line + ".", t);
if (t instanceof Error) {
throw (Error) t;
}
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
throw new RuntimeException(t);
}
La razón por la que tal código rompería la depuración de Eclipse es que ahora no se controla la RuntimeException
. Tu UncaughtExceptionHandler
puede estar capturando la clase de inicio en lugar de tu código de usuario. Esto es para Eclipse regular.
Solución 1:
- Ir a Ejecutar -> Agregar punto de interrupción de excepción de Java ->
Throwable
- Haga clic en
Throwable
en la vista Breakpoint - Haga clic derecho -> Propiedades de punto de interrupción -> Agregar paquete -> Aceptar
- Compruebe en la opción Subclases de esta excepción.
Nota: Esto puede capturar marginalmente un java.lang.OutOfMemoryError
pero definitivamente no puede atrapar un java.lang.Error
.
Solución 2: ( Solo si hay demasiadas excepciones detectadas, NO se recomienda lo contrario )
- Copie el código fuente de
com.android.internal.os.ZygoteInit
en un nuevo proyecto, por ejemploMyBootstrap
Modifique el bloque
catch (Throwable t)
para capturar solo elError
} catch (Error t) { Log.e(TAG, "Error preloading " + line + ".", t); throw t; }
Ir a las configuraciones de depuración -> Classpath -> Haga clic en Entradas Bootstrap -> Agregar proyectos ->
MyBootstrap
. Mueve este proyecto a la parte superior