¿Qué hay de malo en depurar en Eclipse en Android?

Posible duplicado:
Ambiente de depuración aparentemente inútil para Android

Obviamente, me ha estropeado Visual Studio, porque aunque estoy aprendiendo Android y el entorno de Eclipse, la depuración de aplicaciones en Eclipse se está convirtiendo en un serio perjuicio para un mayor desarrollo.

Por ejemplo, Eclipse compilará esta división por cero muy bien:

public class Lesson2Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); int i = 1 / 0; TextView tv = new TextView (this); tv.setText ("Hello, Android!"); setContentView (tv); } } 

Y luego, cuando se ejecuta bajo el depurador, voy a obtener una pantalla completa de información de depuración inútil, no de que realmente me señala a la línea específica que contiene el error.

El stackTrace es nulo dentro del árbol de información de excepción ('e'), y simplemente indica un mensaje que indica 'ArithmeticException'. (Que es bueno, ¿qué tal si me señala en la dirección de donde lo encontró !?)

He mirado por toda la pantalla y estoy desconcertado que este IDE no puede conseguir este derecho. ¿Desarrollar con Eclipse todo el mundo recurrir a 1991 con printf () como registro a cada intervalo, a continuación, para rastrear los errores? Seriamente.

¿Hay una configuración o plug-in que me falta para ayudar con esto?

No he probado este caso con XCode, pero si el iPhone dev. IDE maneja esto más como Visual Studio, entonces no es de extrañar que el mercado Android tiene tan pocas aplicaciones.

Estoy entusiasmado con Android, pero parece que Eclipse se interpone en el camino.

Sí, has perdido uno de los plug-ins muy importantes para Eclipse llamado "LogCat". Captura todos los registros de depuración que su programa de Android da, ya sea que se ejecute en el Emulador o un teléfono real. Esto último, obviamente, requiere que el teléfono se conecte a la computadora, y menos, obviamente, el ajuste en Aplicación -> Desarrollo -> Habilitar Depuración USB esté habilitado.

Los mensajes de LogCat le dan el desglose completo de qué causó el error, incluyendo el número de línea. Para abrir LogCat en Eclipse, vaya a Ventana -> Mostrar vista -> Otro -> Android (una de las carpetas de la lista) -> LogCat. A continuación, acoplar la ventana de LogCat en algún lugar donde se puede ver fácilmente, y Eclipse recordará esa ubicación y abrir de nuevo la próxima vez que lo inicie.

(A veces, LogCat y el Emulador se desconectan entre sí.La forma sencilla de solucionarlo es simplemente cerrar Eclipse y el emulador y luego reiniciarlos.)

(Hay mucho que decir en un comentario, así que estoy escribiendo esto como una respuesta.)

Puede configurar Eclipse para detener las excepciones que se detectan, no capturadas o ambas. De forma predeterminada, Eclipse se interrumpirá en cualquier excepción no detectada e ignorará todas las excepciones detectadas (es decir, cualquier elemento bloqueado por un bloque try / catch).

Las cosas se ponen un poco extrañas para Android porque se está ejecutando en un marco de aplicaciones, no en una aplicación independiente. Como se puede ver en el rastreo de pila publicado anteriormente, la excepción fue capturada por ActivityThread. Esto significa que su excepción inicial se considera "atrapada" y no disparará la manipulación sin interrupción de Eclipse hasta que ActivityThread vuelva a lanzarla. Por esta razón, la pila que ve en el depurador cuando se detiene no está cerca de su código.

Puesto que usted sabe que está recibiendo una excepción ArithmeticException, puede hacer que se rompa en instancias "atrapadas" de esa excepción, y se detendrá en el punto de la tirada. (No lo haga quebrar en todas las excepciones cogidas – usted estará golpeando el "curriculum vitae" sin fin.)

En la medida en que el registro sea "tarde", si el depurador deja que el programa continúe ejecutándose hasta que ocurra el registro, no podrá depurar en el punto del lanzamiento.

Obtengo la siguiente traza de pila en logcat:

 03-31 17:01:11.272: ERROR/AndroidRuntime(205): java.lang.RuntimeException: Unable to start activity ComponentInfo{MyClass}: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.access$2100(ActivityThread.java:116) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Handler.dispatchMessage(Handler.java:99) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Looper.loop(Looper.java:123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.main(ActivityThread.java:4203) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invokeNative(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invoke(Method.java:521) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at dalvik.system.NativeStart.main(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): Caused by: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at MyClass.onCreate(MyClass.java:40) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): ... 11 more 

Esto es muy claro. Observe la excepción que causa en la línea 14 del seguimiento de pila y se dice: Divide por cero. Eso es lo que has hecho mal. La siguiente línea dice: en MyClass.onCreate (MyClass.java:40) Esta sería la línea en la que se produce la excepción. No obtengo lo que sería difícil o inútil al respecto. ¿Cómo presentaría VS esto?

Durante semanas después de iniciar el desarrollo de Android, me sentí frustrado por la falta de información que encontré en la ventana de LogCat. Pondría mensajes del registro en mi app y nunca los vería, y sabía que mi app lanzaba excepciones pero nunca vi ésos tampoco.

Finalmente un día lo averigüé: mi ventana de LogCat mostraba el dispositivo incorrecto. Normalmente tengo dos o tres dispositivos Android conectados a mi computadora en un momento dado, y LogCat estaba mostrando uno de esos otros dispositivos. Para cambiar esto, debe mostrar la ventana Dispositivos y seleccionar el dispositivo que desee en esa ventana.

Creo que esto es un ejemplo de UI risiblemente mala. Aquí estoy mirando una ventana de LogCat y en ninguna parte en esa ventana hay ninguna indicación a qué registros del dispositivo estoy mirando. Tengo que saber bastantes para abrir una ventana totalmente diferente y seleccionar el dispositivo allí. Literalmente perdido semanas de tiempo antes de que me di cuenta de esto. Se podría pensar que LogCat predeterminado a todos los dispositivos, o al menos, cambiar automáticamente al dispositivo que más recientemente lanzó una aplicación, pero no lo hace. Si usted está golpeando la cabeza contra su escritorio preguntándose por qué LogCat es tan inútil, tal vez por eso.

Usted está experimentando un típico problema de desarrollo con un dispositivo físico en lugar de una pieza de software en una máquina.

Se le señala el error específico (Publicar la información y le podemos mostrar) Sólo busque los nombres de su paquete en el error que se mostrará donde se produjo la excepción.

También debe utilizar puntos de interrupción para pasar a través del proceso y ver qué sucede el depurador DDMS debe satisfacer todos sus requisitos necesarios.

Y sí, deberías usar el registro Log.i (TAG, "Info:" + x);

No se puede predecir todo lo que sucede y a medida que su base de código crece, se alegrará de que comenzó a hacer esto temprano.

  • ¿Añade una nueva actividad al AndroidManifest?
  • Eclipse ADB error
  • Establecer la ruta existente de android sdk a eclipse
  • Cómo implementar y usar google cloud sql en mi aplicación android (eclipse)
  • Localización y eliminación de valores no referenciados en strings.xml
  • Android redibujar diseño de forma programática
  • Eclipse ADT: Java se inició pero devolvió el código de salida = 13
  • Intenta invocar el método virtual 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query en la referencia de objeto nulo
  • AdMob con Google Play Services: prueba de anuncios: no hay relleno en el servidor de anuncios
  • Eclipse: Especifique varios directorios de res como especificar varios directorios src
  • Error al importar Maven Android Android proyecto a Eclipse con ADT 20
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.