2010-02-17 8 views
12

Acabo de empezar a depurar mi primera aplicación de Android de tres líneas y parece que no puedo usar la herramienta de depuración como quiero. Aquí está mi código:Entorno de depuración aparentemente inútil para Android

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    int a = 1/0; 
} 

Ahora espero que el depurador para detener el hilo y me muestra el número de línea de la declaración donde se produce la división por cero. No, en su lugar muestra algunos other method internos del sistema para el que no tengo ninguna fuente. Para empeorar las cosas, tampoco hay un mensaje de excepción.

Antes de esta aplicación, creé una que haría algo cuando se presionó un botón. Si se generó alguna excepción, nuevamente no se mostraría ningún número de línea o mensaje de excepción.

En este momento, no hay forma de depurar mi aplicación. ¿Algunas ideas?

Estoy usando el último SDK junto con el plugin Eclipse ADT y la depuración en un dispositivo real (Nexus One).

+3

Siento tu dolor. Visual Studio y otros IDE avanzados nos han echado a perder. Volver a archivos de registro anticuados es como usar printf() una vez más para depurar. –

+3

Ver mi respuesta en http://stackoverflow.com/questions/2552568/whats-wrong-with-debugging-in-eclipse-on-android/. La razón por la que está viendo un método diferente es que, de manera predeterminada, Eclipse solo se rompe con las excepciones no detectadas. Su ArithmeticException fue capturada por el marco de Android, y Eclipse no se detuvo hasta que se reinició la excepción. Si agrega un punto de interrupción de excepción en las ArithmeticExceptions atrapadas, se romperá en el punto del lanzamiento. (Hacerlo fuera del hilo principal también debería funcionar, ya que no estará cubierto por el marco.) – fadden

+4

esto me está volviendo loco. es 2010, no es el año de 1970 – SteelBytes

Respuesta

8

Al principio tengo que admitir que tiene usted razón parcialmente. Hay depuradores que detendrán la ejecución en una excepción y mostrarán la línea de código que la causó. Me encantaría ver este comportamiento en el depurador de eclipse. Pero las otras respuestas son correctas.

Mientras está en Eclipse vaya a Ventana -> Mostrar vista -> Otro -> Android -> LogCat Ahora obtendrá toda la salida de depuración que se produce en el emulador o en un dispositivo conectado. Con tu ejemplo obtendré el siguiente StackTrace.

T03-18 09:45:12.398: ERROR/AndroidRuntime(1778): Uncaught handler: thread main exiting due to uncaught exception 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.client/android.client.ClientMain}: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.os.Looper.loop(Looper.java:123) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at dalvik.system.NativeStart.main(Native Method) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.client.ClientMain.onCreate(ClientMain.java:35) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  ... 11 more 
03-18 09:45:12.438: INFO/Process(52): Sending signal. PID: 1778 SIG: 3 

Si vas a la Excepción más profundo muestra que uno que levantó a todos los demás se verá

03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.client.ClientMain.onCreate(ClientMain.java:35) 

Esto es bastante claro que pienso. En la línea 35 en el Cliente Principal, se lanzó una excepción y se trataba de una excepción de división por cero. Si no puede resolver esto (en un caso no tan claro como el ejemplo) puede establecer un punto de interrupción en esta línea o el punto de entrada del método o algo así. Ahora el depurador le mostrará todas las variables y puede ejecutar paso a paso el código paso a paso hasta que se produzca el error. Si pasa el mouse sobre un varibale, puede ver el valor de esta variable y ahora puede, paso a paso, intentar comprender la causa de la excepción y resolverla.Si profundizas en el código, terminarás en la clase java que es responsable de hacer la división, si no has agregado los jars con el código fuente de estas clases a tu proyecto, el depurador no podrá mostrarte algo en este punto.

2

Eclipse no se depura de esa manera. Necesita usar LogCat para ver el mensaje de error real y luego descubrir dónde sucedió. No recuerdo si LogCat muestra un número de línea.

+1

bueno, eso es un fastidio: ¿quieres decir que la depuración completa de eclipse nativo no tiene ningún motivo? Y sí, hay números de línea en LogCat (afortunadamente). – Mansour

+3

Puede establecer puntos de interrupción, que es realmente lo que significa la depuración. –

1

La depuración no significa que se le presentará un número de línea y un texto de excepción cuando ocurra "algo" ... La depuración significa poder establecer puntos de interrupción, mantener su código en puntos específicos y posiblemente realizar paso a paso instrucciones, ver variables, etc.

Para detectar problemas como ese, usted como programador tendrá que implementar textos de registro útiles usando la clase Log, por ejemplo al salir y al ingresar a funciones. Además, use bloques de excepción donde sospeche que las cosas posiblemente salgan mal. En el caso de una división, por ejemplo, si el divisor no es estático, pero podría ser cualquier cosa, ¡proteja acciones como divisiones! En tu bloque catch, registra el evento encontrado o haz algo útil.

Básicamente eso no es nada específico de Android, ¡pero es común en Java!

+7

No me refiero a comenzar una discusión, pero de todos los entornos de desarrollo diferentes que he usado a lo largo de los años (C, C++, Python, Java para escritorio, Javascript, VB, .NET), poder saber dónde exactamente se produjo una excepción, sus detalles, el retroceso y la visualización de las variables locales en el momento de la excepción, fueron todos una parte central del proceso de depuración. La depuración ciertamente no es SOLO eso, pero está claro que esta es una falla de las aplicaciones de depuración de Android. – Mansour

+1

Obviamente rompiste el guión, pero no creo que entiendas cómo depurar en el entorno. Puede identificar un error ocurrido, ahora agregarle tries, puntos de interrupción y salidas y realmente descomponerlo. Esto es una depuración, hacer que el compilador o el tiempo de ejecución arrojen una excepción sin manejarlo correctamente, solo le indica que hizo algo mal. La depuración es su enfoque proactivo para deshacerse del error. –

Cuestiones relacionadas