¿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.
- El dispositivo no se muestra en DDMS
- El proyecto puede estar utilizando una versión de Gradle que no contenga el método 'compileSdkVersion ()'
- Android Studio proguardRelease FALLO debido biblioteca de frasco de salida vacío
- Compile Flags para el desarrollo de Eclipse / Android
- ERROR: La instrucción de proceso que coincide con " " no está permitida
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.
- Eclipse se queda atascado en "iniciar actividad" al enviar la aplicación al dispositivo. ¿Cómo resolver esto?
- No se puede importar org.apache.http.HttpResponse en Android Studio
- ¿Por qué no debería establecer layout_width y layout_height en un estilo?
- Problema al convertir .docx al archivo pdf en android
- Creación de un proyecto de Android desde la línea de comandos con Eclipse
- No se puede resolver el destino 'android-17'
- Cómo actualizar el contenido de la ficha de fragmento en el botón de clic
- Problema del nombre del proyecto al importar proyectos de Android en Eclipse
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.
- Android En la facturación de la aplicación: No se puede iniciar launchPurchaseFlow porque launchPurchaseFlow está en curso
- ¿Cómo puedo simular el acelerómetro en el emulador de Android?