2014-02-16 22 views
30

從執行什麼的角度看,我看不到任何功能錯誤,但我只是浪費了一個小時,證明我的代碼和編譯器正在做他們應該做的事。Android Studio調試器突出顯示錯誤的行

考慮以下代碼:

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

int theAnswer = getAnswer(6); 

斷點調用兩者都含有return和運行代碼之前,嘗試和預測的結果,因此該行會的行擊中。

正如您可能從我的問題的口氣想象的那樣,突出顯示了錯誤的行,但返回了正確的結果。如果你通過代碼,它跳舞了很多。

是否有任何可以不同配置的方式顯示正確的行? (我使用的是最新的Android Studio,我認爲它可能不穩定,但我確信在Eclipse上我已經看到類似的行爲,但我從未花時間跟蹤它;也許它是一個Java事物) 。

回答

41

這是dx的一個問題,它是構建的一部分,可將Java .class文件轉換爲.dx文件以便打包到Android中。根據這樣的:

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

如果一個函數有多個返回路徑,DX合併返回指令到一個單一的返回指令,所以在調試過程中,調試器不能告訴哪一行返回屬於與事跳來跳去。這與我在嘗試重現您的問題時看到的情況相同:每次通過循環時,它會執行if (a == 3)檢查,最後跳轉到return 0,然後跳回到循環中。你會看到最後的return 0在循環中與return retval合併。

我懷疑這個問題很快就會得到解決,所以你可能只需要學會和它一起生活。對不起,我知道這有點瘋狂。

+1

謝謝。恥辱這個dx「優化」不能在調試模式下失調。 –

+0

這不是一個優化。這是Dalvik VM的二進制格式;您無法在Android上直接運行.class文件。 –

+2

不是dx本身;我的意思是它不能創建多個返回指令,就像在源代碼中一樣? –

2

嘗試構建 - >重建項目,然後Shift + F9。您已經過時在應用程序上運行的代碼。

+0

不,不是這樣。清理,重建,重新編譯,僅僅爲了它而移動代碼 - 沒有區別。我創建了一個新的測試項目來檢查它,並且我在真實設備上運行它,而不是仿真器。嘗試一下! –

+0

我在Android開發中使用intellij IDEA(這是相同的)多年,並且只有當我遇到過時的代碼時,您描述的問題纔會出現在我的面前。也許你正在調試庫代碼?如果沒有,那麼對不起,我不知道你可能做什麼錯。 –

+0

不,我簡直就是用Android工作室創建一個新的測試Android項目,將代碼粘貼到它並從onCreate調用它,它的行爲方式每次都是一樣的。 –

2

這裏是爲我工作,至少對於步入Android的SDK源代碼:

  1. 安裝SDK平臺來源爲Android SDK正是的API級別您在開發過程中運行的Android版本(使用Android version history頁面查找您的設備具有哪個API級別)。
  2. 編譯您的應用程序正好該版本。例如,在Android Studio中,打開您的應用的build.gradle文件並相應地設置值compileSdkVersion
  3. 調試您的應用程序。當你進入Android SDK源代碼時,你應該看到正確的行。
  4. (可選)在部署前使用最新的SDK重新編譯。換句話說,換回compileSdkVersion
+0

這也適用於沒有SDK代碼。我切換了我的最小API版本以匹配我的目標設備,現在調試器顯示了正確的行。 – Graeme