2010-03-31 13 views
36

Mögliche Duplizieren:
Seemingly useless debugging environment for AndroidWas ist falsch mit dem Debuggen in Eclipse auf Android?

Ich habe offensichtlich von Visual Studio verdorben, denn obwohl ich nur Android Lernen bin und die Eclipse-Umgebung, Debugging-Anwendungen in Eclipse ist ein immer ernsthafter Nachteil für die weitere Entwicklung.

Zum Beispiel wird von Eclipse diese Kluft kompiliert von Null gerade fein:

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); 
    } 
} 

Und dann, wenn sie es unter dem Debugger ausgeführt wird, werde ich ein Vollbild von nutzlosen Debug-Informationen, nicht von denen tatsächlich bekommt verweist mich auf die spezifische Zeile mit dem Fehler.

Der stackTrace ist innerhalb der Ausnahmebedingungsbaumstruktur ('e') null und gibt lediglich eine Meldung mit der Angabe 'ArithmeticException' aus. (das ist nett, wie wäre es, wenn du mich in die Richtung zeigst, wo du sie gefunden hast !?)

Ich habe über den ganzen Bildschirm geschaut und bin verblüfft, dass diese IDE das nicht richtig machen kann. Lässt die Entwicklung mit Eclipse alle zurück auf 1991 mit printf() wie Protokollierung in jedem Intervall dann Bugs aufzuspüren? Ernst.

Gibt es eine Konfiguration oder ein Plug-In, die ich vermisse, um damit zu helfen?

Ich habe diesen Fall nicht mit XCode getestet, aber wenn das iPhone dev. IDE behandelt dies mehr wie Visual Studio, dann ist es kein Wunder, dass der Android-Marktplatz so wenige Apps hat.

Ich bin begeistert von Android, aber es scheint, dass Eclipse in die Quere kommt.

+1

Ich bin überrascht, dass Code zu einer Laufzeitausnahme führt, tut der Android-Compiler keine Konstante-Faltung? Seltsam. – unwind

+4

Ich bin auch ein frustrierter VS-Benutzer, der sich an Android + Eclipse gewöhnt. – SteelBytes

+3

Android verwendet den Standard-Javac-Compiler. Wenn Sie "int i = 5/3" geschrieben haben, wird Code erzeugt, der äquivalent zu "i = 1" ist.Für "int i = 1/0" erkennt es, dass es die Konstanten nicht kombinieren kann, so dass es die divide-Operation an Ort und Stelle belässt und ermöglicht, dass der Fehler zur Laufzeit gemeldet wird. Aus der Perspektive des Compilers ist nichts mit "i = 1/0" falsch, also generiert javac keinen Fehler oder eine Warnung. Einige Eclipse-Modi können dies zusammen mit anderen gültigen, aber nicht vorsichtigen Verhaltensweisen für Ihre Aufmerksamkeit in der Quelle kennzeichnen. – fadden

Antwort

25

Ja, Sie haben eines der sehr wichtigen Plug-ins für Eclipse namens "LogCat" verpasst. Es fängt alle Debugging-Logs ab, die Ihr Android-Programm gibt, egal ob es auf dem Emulator oder einem echten Telefon läuft. Letzteres erfordert offensichtlich, dass das Telefon an den Computer angeschlossen ist, und weniger offensichtlich ist die Einstellung in Anwendung -> Entwicklung -> USB-Debugging aktivieren aktiviert.

Die LogCat-Nachrichten geben Ihnen die vollständige Aufschlüsselung dessen, was den Fehler verursacht hat, einschließlich der Zeilennummer. Um LogCat in Eclipse zu öffnen, gehen Sie zu Fenster -> Ansicht anzeigen -> Andere -> Android (einer der Ordner in der Liste) -> LogCat. Dann docken Sie das LogCat-Fenster irgendwo an, wo Sie es leicht sehen können, und Eclipse wird sich an diesen Ort erinnern und es beim nächsten Mal wieder öffnen.

(Manchmal LogCat und der Emulator erhalten voneinander getrennt Der einfache Weg, dies zu beheben, ist nur Eclipse und den Emulator zu schließen, dann starten sie beide..)

+3

Wie oben muss man die Log-Katze vermissen, nachdem ich VS benutzt habe Ich finde Programmierung und Debugging in Eclipse genauso gut –

+0

Oh, ich weiß über LogCat und habe es auch laufen. Es wird auch kein Fehler angezeigt und kein Zeiger auf eine Zeile #. Ich laufe mit dem Emulator v2.1. Schau dir mein Eclipse LogCat hier an: http://www.appliedpda.com/Eclipse_LogCat.txt –

+2

Ein System ist nicht nutzlos, nur weil du es nicht richtig bedienen kannst. Wenn Sie sich Janusz 'Antwort unten ansehen, gibt es ein Beispiel dafür, was sein LogCat bei der Ausführung Ihres Codes gegeben hat, und er zeigt sehr deutlich die Zeilennummer (14 für ihn) und den genauen Fehlertyp (dividiere durch Null). Ich habe einen ähnlichen Bericht bekommen. Wenn der Debugger angefügt wird, werden die Ausnahmeprotokolle erst an LogCat gesendet, wenn Sie die Anwendung über die Debug-Perspektive beenden. Dies geschieht, weil die Anwendung nicht wirklich abstürzt, bis sich der Debugger löst. –

1

Sie haben ein typisches Problem bei der Entwicklung mit einem physischen Gerät im Gegensatz zu einer Software auf einem Computer.

Es wird Sie auf den spezifischen Fehler verweisen (Post die Info und wir können Ihnen zeigen) Suchen Sie einfach nach Ihren Paketnamen in dem Fehler wird es zeigen, wo die Ausnahme ausgelöst wurde.

Sie sollten auch Breakpoints verwenden, um durch den Prozess zu gehen und zu sehen, was passiert, wenn der DDMS-Debugger alle Ihre Anforderungen erfüllt.

Und ja, Sie sollten Protokollierung verwenden Log.i (TAG, "Info:" + x);

Sie können nicht alles vorhersagen, was passiert, und wenn Ihre Codebasis wächst, werden Sie froh sein, dass Sie so früh damit angefangen haben.

10

ich folgende Stack-Trace in logcat erhalten:

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 

Dies ist kristallklar. Sehen Sie sich die verursachende Ausnahme in Zeile 14 des Stack-Trace an und es heißt: Dividiere durch Null. Das hast du falsch gemacht. Die nächste Zeile sagt: at MyClass.onCreate (MyClass.java:40) Dies wäre die Zeile, in der die Ausnahme auftritt. Ich verstehe nicht, was schwierig oder nutzlos wäre. Wie würde VS dies präsentieren?

+2

Die Sache, die mich getäuscht hat, ist, dass im Falle von NULL deref ein Backtrace von Eclipse 'vor' angezeigt wird, sehen Sie entsprechende Meldungen in logcat . Daher müssen Sie möglicherweise die von Eclipse erfassten Backtraces/Exceptions beibehalten, bevor Sie die relevanten Logcat-Informationen sehen. – tonylo

+0

wie geht das? Immer wenn es in onCreate eine unbehandelte Ausnahme gibt, ist dies mein StackTrace: ActivityThread.performLaunchActivity (ActivityThread $ ActivityClientRecord, Intent) – Arvin

11

(Es gibt zu viel in einem Kommentar zu sagen, so dass ich dies als eine Antwort zu schreiben auf.)

Sie Eclipse-Konfiguration können auf Ausnahmen zu stoppen, die gefangen werden, nicht abgefangene oder beides. Standardmäßig bricht Eclipse jede nicht abgefangene Ausnahme ab und ignoriert alle abgefangenen Ausnahmen (d. H. Alles, was von einem try/catch-Block abgefangen wird).

Die Dinge werden ein wenig seltsam für Android, weil Sie in einem Anwendungsframework, nicht eine eigenständige Anwendung ausgeführt werden. Wie Sie der oben beschriebenen Stapelverfolgung entnehmen können, wurde die Ausnahme tatsächlich von ActivityThread abgefangen. Dies bedeutet, dass Ihre anfängliche Ausnahme als "abgefangen" betrachtet wird und Eclipse die Behandlung bei Einbruch und Unerhebung nicht auslöst, bis ActivityThread sie erneut auslöst. Aus diesem Grund ist der Stapel, den Sie im Debugger sehen, wenn er stoppt, nicht in der Nähe Ihres Codes.

Da Sie wissen, dass Sie eine ArithmeticException erhalten, können Sie sie bei "gefangenen" Instanzen dieser Ausnahme unterbrechen, und sie wird an der Stelle des Wurfs stoppen. (Lassen Sie es nicht bei allen gefangenen Ausnahmen brechen - Sie werden "endlos" treffen.)

Soweit die Protokollierung "spät" ist, wenn der Debugger ließ das Programm bis zur Protokollierung weiter ausführen passiert ist, würden Sie nicht in der Lage sein, am Punkt des Wurfs zu debuggen.

3

Wochen nach dem Start der Android-Entwicklung war ich frustriert über den Mangel an Informationen, die ich im LogCat-Fenster fand. Ich würde Log-Nachrichten in meine App einfügen und sie nie sehen, und ich wusste, dass meine App Ausnahmen enthielt, aber ich habe diese auch nie gesehen.

Endlich eines Tages habe ich es herausgefunden: mein LogCat-Fenster zeigte das falsche Gerät an. Ich habe normalerweise zwei oder drei Android-Geräte an meinen Computer angeschlossen, und LogCat zeigte eines dieser anderen Geräte an. Um dies zu ändern, müssen Sie das Gerätefenster anzeigen und das gewünschte Gerät in diesem Fenster auswählen.

Ich finde dies ein Beispiel für lächerlich schlechte UI. Hier schaue ich auf ein LogCat-Fenster und nirgends in diesem Fenster gibt es einen Hinweis darauf, welche Geräteprotokolle ich sehe. Ich muss genug wissen, um ein ganz anderes Fenster zu öffnen und das Gerät dort auszuwählen. Ich habe buchstäblich Wochen verschwendet, bevor ich das herausgefunden habe. Sie würden denken, dass LogCat standardmäßig auf allen Geräten oder zumindest automatisch auf das Gerät umschalten würde, auf dem Sie zuletzt eine App gestartet haben, tut dies aber nicht. Wenn Sie Ihren Kopf gegen Ihren Schreibtisch schlagen und sich fragen, warum LogCat so nutzlos ist, vielleicht deshalb.