studio otra open llamar intent example desde configurar app aplicacion another java android eclipse debugging

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.

  1. En el momento en que se lanza la excepción, el depurador no puede saber si se va a detectar la excepción.

  2. 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 ...

  3. 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:

  1. Ir a Ejecutar -> Agregar punto de interrupción de excepción de Java -> Throwable
  2. Haga clic en Throwable en la vista Breakpoint
  3. Haga clic derecho -> Propiedades de punto de interrupción -> Agregar paquete -> Aceptar
  4. 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 )

  1. Copie el código fuente de com.android.internal.os.ZygoteInit en un nuevo proyecto, por ejemplo MyBootstrap
  2. Modifique el bloque catch (Throwable t) para capturar solo el Error

    } catch (Error t) { Log.e(TAG, "Error preloading " + line + ".", t); throw t; }

  3. Ir a las configuraciones de depuración -> Classpath -> Haga clic en Entradas Bootstrap -> Agregar proyectos -> MyBootstrap . Mueve este proyecto a la parte superior