2014-02-16 5 views
30

Ich kann nichts funktionell falsch in Bezug darauf, was ausgeführt wird, sehen, aber ich habe nur eine Stunde verschwendet, die beweisen, dass mein Code und der Compiler tun, was sie sollen.Android Studio Debugger markiert die falschen Zeilen

Betrachten Sie diesen Code:

public int getAnswer(int a) { 

    int retval = 18; 

    int x = 25; 
    int y = 50; 

    while (a-- > 0) { 
     if (a == 3) { 
      retval = a; 
      return retval; 
     } 
    } 

    x = 10; 
    y = 20; 

    return 0; 
} 

Called mit

int theAnswer = getAnswer(6); 

Breakpoint- beiden Leitungen enthalten return und bevor Sie den Code ausführen, versuchen, das Ergebnis vorherzusagen, und deshalb wird die Linie schlagen.

Wie Sie sich aus dem Ton meiner Frage vorstellen können, wird die falsche Zeile hervorgehoben, aber das richtige Ergebnis zurückgegeben. Wenn Sie den Code durchgehen, tanzt er ziemlich herum.

Kann irgendetwas anders konfiguriert werden, so dass die richtigen Zeilen angezeigt werden? (Ich benutze das neueste Android Studio, was ich zu schätzen weiß, ist möglicherweise instabil, aber ich bin mir sicher, dass ich vor einiger Zeit ähnliches Verhalten auf Eclipse gesehen habe, aber ich habe nie die Zeit damit verbracht, es aufzuspüren; vielleicht ist es eine Java-Sache) .

Antwort

41

Dies ist ein Problem mit dx, welches der Teil des Builds ist, der Ihre Java-.class-Dateien in .dx-Dateien zum Packen in Android umwandelt. Nach dieser:

https://code.google.com/p/android/issues/detail?id=34193

, wenn eine Funktion mehrere Rückwege hat, dx verschmilzt die Rückkehrbefehl in einem einzelnen Befehl Rückkehr, so bei der Fehlersuche kann der Debugger nicht, welche sagen Linie eine Rückkehr zu und Dinge gehört herumspringen. Dies entspricht dem, was ich sehe, wenn ich versuche, Ihr Problem zu reproduzieren: jedes Mal durch die Schleife macht es die if (a == 3) Prüfung, springt auf die return 0 am Ende, und springt dann zurück in die Schleife. Sie sehen, dass die letzte return 0 mit der return retval in der Mitte der Schleife zusammengeführt werden.

Ich bezweifle, dass dies in nächster Zeit behoben wird, so dass Sie nur lernen müssen, damit zu leben. Entschuldigung, ich weiß, dass es irgendwie verrückt ist.

+1

Danke. Schade, dass diese dx "Optimierung" nicht im Debug-Modus entblößt werden kann. –

+0

Es ist keine Optimierung. Es ist das Binärformat für die Dalvik VM; Sie können .class-Dateien nicht direkt auf Android ausführen. –

+2

Nicht dx selbst; Ich meine, konnte es nicht mehrere Rückgabeanweisungen erstellen, wie im Quellcode? –

2

Versuchen Sie Build -> Projekt neu erstellen und dann Shift + F9. Sie haben veralteten Code, der auf der Anwendung ausgeführt wird.

+0

Nein, das ist es nicht. Gereinigt, wieder aufgebaut, neu gemacht, Code um ein wenig verschoben, nur um es auch zu tun - kein Unterschied. Ich habe ein neues Testprojekt erstellt, nur um es zu überprüfen, und ich verwende es auf einem tatsächlichen Gerät, nicht auf einem Emulator. Versuch es! –

+0

Ich benutze Intellij IDEA (das ist das gleiche) für mehrere Jahre für Android-Entwicklung, und das Problem, das Sie beschrieben, erschien mir nur, wenn ich konfrontiert mit veraltetem Code. Vielleicht debuggen Sie den Bibliothekscode? Wenn nicht, tut mir leid, ich weiß nicht, was Sie falsch machen. –

+0

Nein, ich erstelle buchstäblich ein neues Android-Testprojekt mit Android Studio, schneide den Code aus und füge ihn in onCreate ein und er verhält sich jedes Mal genauso. –

2

Hier ist, was für mich gearbeitet, zumindest für Schritt in Android SDK-Quellcode:

  1. Installieren die SDK Platform und Quellen für Android SDK für genau der API-Ebene der Android-Version, die Sie während der Entwicklung ausführen (verwenden Sie die Android version history-Seite, um herauszufinden, welche API-Ebene Ihr Gerät hat).
  2. Kompilieren Sie Ihre App für genau diese Version. Öffnen Sie beispielsweise in Android Studio die Datei build.gradle Ihrer App und legen Sie den Wert compileSdkVersion entsprechend fest.
  3. Debug Ihre App. Wenn Sie die Android SDK-Quelle aufrufen, sollten Sie die richtige Zeile sehen.
  4. (optional) Kompilieren Sie erneut mit dem neuesten SDK vor der Bereitstellung. Mit anderen Worten, ändern Sie compileSdkVersion zurück.
+0

Dies funktioniert auch für keinen SDK-Code. Ich habe meine Min-API-Version so geändert, dass sie meinem Zielgerät entspricht, und jetzt zeigt der Debugger die richtigen Zeilen an. – Graeme

Verwandte Themen