2011-02-03 10 views
15

Es cierto, mi pregunta es básicamente el mismo que éste, pero parece haber quedado sin respuesta:Eclipse Android Debugger: ¿en qué parte de mi código causé la excepción?

NullPointerException in handleStopActivity -- No reference to my code in stack trace

descargado Eclipse Helios, Android Developer Tools Plugin, y el JDK todo dentro de la última semana. Estuve jugando con una aplicación en mi dispositivo, la ejecuté en el modo de depuración e inesperadamente finalizó. Me di cuenta de que había causado una NullPointerException y que el problema en sí no era un problema por mucho tiempo.

Lo que es un problema, sin embargo, es que el depurador parece incapaz de identificar en qué parte de mi código se lanzó la excepción. El seguimiento de la pila no hace referencia a mi código.

De hecho, si pongo el siguiente en el método OnCreate(), me sale el mismo problema

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //lI("onCreate()"); //A silly logging thing I messed around with 

    Integer iDareYou = null; 
    iDareYou.byteValue(); 

Gran parte de su crédito, Eclipse, sin duda me advierte que el código es probable que estallar en la cara. Pero cuando realmente ejecutar esto en mi dispositivo, el seguimiento de pila devuelto es el siguiente:

Thread [<1> main] (Suspended (exception RuntimeException)) 
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787 
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803 
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135 
ActivityThread$H.handleMessage(Message) line: 2136 
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 144 
ActivityThread.main(String[]) line: 4937  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 521 
ZygoteInit$MethodAndArgsCaller.run() line: 868 
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method] 

Busqué algunas respuestas y por desgracia todo lo que podía llegar a eran preguntas del '¿Por qué está causando mi aplicación para Android una NullPointerException '? variedad.

Espero averiguar qué debería hacer de manera diferente para poder encontrar el punto en mi código donde causé la excepción .... porque estoy seguro de que esta capacidad sería útil en algún punto en el futuro!


Va a editar esto para agregar información. Como menciona el primer comentario a continuación, el estado en el que el depurador suspende el hilo no es el estado 'final' de la aplicación. Al presionar 'reanudar' un par de veces se mueve el proceso hasta el punto donde el proceso realmente termina, aunque lamentablemente no se muestra ningún rastro de pila útil en la ventana de depuración Eclipse/ADT. Sin embargo,, en este punto el seguimiento de la pila pegué por encima de seguido por las primeras 3 líneas únicas del seguimiento de la pila del NPE en mi código se envían a LogCat. Anteriormente había buscado para ver si LogCat tenía algo que pudiera usar, pero probablemente era antes de haber presionado 'reanudar' en el depurador para mover el proceso a este estado. Desafortunadamente, hacerlo de esta manera nunca muestra un rastro de pila del NPE en mi código en el depurador real.

Pero las noticias no son del todo malas: a partir de la información de la ventana 'Variables' de la derecha, puedo ver que hay un NPE en el alcance actual del subproceso, así que al menos podría darme una pista de que un NPE está sucediendo (y, por supuesto, está LogCat).

Basado en una sugerencia sobre un tema diferente, el mejor trabajo que he encontrado es agregar un punto de interrupción "Atrapado y no detectado" para NullPointerException. Cuando hago esto y reinicio, el depurador muestra el rastro de la pila del NPE en mi código, y mueve la ventana de edición directamente a la línea donde causé el NPE.

Por el momento, creo que esto se debe a que la NPE está siendo atrapada (y presumiblemente, arrojada de nuevo) por el marco de Android. Parece que el dilema original fue causado por el hecho de que la ventana Eclipse/ADT/DalvikVM Debug Stack Trace no incluye la información 'causada por' (que yo sepa) que se muestra en el seguimiento de pila "más tarde" que aparece en LogCat.Voy a investigar más sobre si esto puede remediarse :)

Agradezco la sugerencia de Bert F, ya que no era del todo consciente de que el hilo aún no estaba en su estado 'final'. Si bien es cierto que el seguimiento de la pila se muestra [más tarde] en LogCat, no lo "eché de menos" en LogCat porque todavía no estaba [allí], lo que sí extrañé fue presionar 'reanudar', lo que habría causado el seguimiento de la pila para salir en LogCat.

Aunque originalmente conseguí que el depurador se detuviera en la línea de mi código utilizando un punto de interrupción, hay razones para el hecho de que finalmente pude obtener el seguimiento de pila en LogCat después de reanudar el hilo, lo que efectivamente resuelve el problema. La única otra cosa que realmente podría pedir sería hacer que el depurador se detenga en la línea de mi código y cause la excepción, en lugar de que sea capturado y luego relanzado por el marco de Android. Pero creo que esa sería una pregunta diferente :) Y Eclipse, siendo útil como es, me enviará allí si hago clic en la línea apropiada en el seguimiento de la pila que se muestra en la ventana de LogCat.

+2

Parece que el programa se suspendió en el depurador y no continuó imprimiendo la excepción y el seguimiento completo de la pila. Permitir que el programa continúe y luego mostrar el mensaje completo de excepción y stacktrace completo sería útil. A menudo, un NPE está envuelto por múltiples excepciones (impresión "causada por" en el seguimiento de la pila) - el mensaje "causado por" más bajo es probablemente el más importante.Además, si conoce su rev, puede ayudar encontrar la fuente para que coincida con el rastro de la pila. –

+0

Bert, si deseas volver a publicar como respuesta, estoy dispuesto a aceptarlo, se podría decir: "empujando el currículum vitae obtendrá el seguimiento de la pila que pedí" – user602347

+0

¡No eres la única persona que no pudo entender esto! Sin embargo, estás en lo cierto: toca el juego un par de veces para que la excepción salte y luego mira LogCat en lugar del rastro de la pila. He usado muchos IDEs y me parece extraño que "la línea de mi código que salió mal" parezca ser algo que solo los expertos pueden descubrir ... –

Respuesta

2

que corrió su código exacto y LogCat me dio las siguientes excepciones:

Caused by: java.lang.NullPointerException 
    at mypackage.test.TestActivity.onCreate(TestActivity.java:23) 

Por supuesto, es la declaración

iDareYou.byteValue();

. Esto es claro como un día brillante!

Le sugiero que debe aprender a usar Dalvik Debug Monitor Server de la manera correcta.

El registro que ha publicado parece bastante inútil, ¿ha estropeado algunos de los filtros LogCat (me pasó una vez)?

OFFTOPIC: "¿Dónde en mi código causé la excepción?" - Creo que tu pregunta no está bien formulada.

Creo que el nombre correcto de esta pregunta podría ser: '¿Cómo usar el depurador de Android y LogCat? ¡Algunas excepciones no se registran correctamente!

+1

Gracias por sus opiniones. Creo que el nombre de la pregunta era apropiado porque no estaba viendo el seguimiento de la pila con LogCat, estaba usando la ventana de depuración en Eclipse/ADT que indiqué en el nombre de la pregunta. Está sugiriendo que puedo resolver el problema original con LogCat, lo cual es cierto, sin embargo, mi pregunta era acerca de por qué la ventana Eclipse/ADT parecía no mostrar ningún rastro de pila útil. – user602347

+1

También el seguimiento de la pila no se mostró en LogCat en el momento en que el depurador suspende el hilo, por lo que la respuesta no fue tan simple como no poder interpretar correctamente lo que se muestra en LogCat. – user602347

1

En Eclipse, el SDK de Android ofrece varias vistas. En el se llama "LogCat". Allí puede encontrar los rastreos de la pila de excepción

0

En mi experiencia, Android se come las excepciones causadas al inflar un diseño. Sin duda debería informar la excepción, pero aparentemente algún desarrollador de Android lamentablemente decidió atraparlo y crear uno nuevo, sin agregar el primero como cause. Lo veo como una deficiencia del entorno de Android; ya que puede ser difícil llegar al equipo de Android que he vivido hasta ahora, pero lo reportaría a Google si realmente me molestara.

+0

Creo que esto es cierto, pero no está haciendo eso en este caso. –

Cuestiones relacionadas