2014-02-16 4 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를 포함하는 라인의 양쪽 히트.

내 질문의 음색에서 알 수 있듯이 잘못된 선이 강조 표시되지만 올바른 결과가 반환됩니다. 코드를 단계별로 실행하면 꽤 많이 춤을 추게됩니다.

다르게 구성하여 올바른 줄을 표시 할 수있는 항목이 있습니까? (나는 최신 안드로이드 스튜디오를 사용하고 있는데, 이는 불안정 할 수 있지만, 필자는 이클립스에서 비슷한 동작을 본 적이 있음을 확신하지만, 그 시간을 추적하지는 못했을 것이다. 아마도 자바 일 것이다) .

답변

41

이것은 자바 .class 파일을 Android로 패키징하기위한 .dx 파일로 변환하는 빌드의 일부인 dx에서 발생하는 문제입니다. 이에 따라 : 함수가 여러 반환 경로가

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

경우 디버깅하는 동안 디버거가 복귀가 사물 속한 줄을하는 말할 수 있도록, DX는 단일 복귀 명령에 복귀 명령을 병합 뛰어 다니. 이것은 내가 문제를 재현하려고 할 때 볼 수있는 것과 같습니다. 매번 루프를 통해 if (a == 3) 검사를 수행하고 끝에 return 0으로 점프 한 다음 루프로 다시 점프합니다. 마지막으로 return 0이 루프 중간에 return retval과 병합되는 것을보고 계십니다.

나는 이것이 언제든지 곧 수정 될지 의심 스럽다. 그래서 당신은 그걸로 살아가는 법을 배워야 할 것이다. 미안해, 좀 이상해.

+1

감사합니다. 부끄러운이 dx는 "최적화"디버그 모드에서 disbled 수 없습니다. –

+0

최적화가 아닙니다. Dalvik VM의 바이너리 형식입니다. Android에서는 직접 .class 파일을 실행할 수 없습니다. –

+2

DX 자체가 아닙니다. 소스 코드에서와 같이 여러 개의 반환 지시를 작성할 수 없다는 뜻입니까? –

2

빌드 -> 프로젝트 다시 빌드를 시도한 다음 Shift + F9를 누릅니다. 응용 프로그램에서 실행중인 오래된 코드가 있습니다.

+0

아니요. 다시 정리하고, 다시 만들고, 다시 만들고, 코드를 조금만 옮겼습니다. 아무런 차이가 없습니다. 나는 그것을 테스트하기 위해 새로운 테스트 프로젝트를 만들었고, 나는 에뮬레이터가 아닌 실제 장치에서 실행하고있다. 시도 해봐! –

+0

나는 안드로이드 개발을 위해 intellij IDEA (똑같은)를 몇 년 동안 사용하고 있는데, 당신이 기술 한 이슈는 오래된 코드에 직면했을 때만 나타난다. 라이브러리 코드를 디버깅하고 있습니까? 그렇지 않다면, 당신이 할 수있는 일이 무엇이 잘못되었는지 미안합니다. –

+0

아니요. 문자 그대로 Android Studio를 사용하여 새로운 테스트 Android 프로젝트를 만들고, 코드를 잘라내어 붙여 넣은 다음 onCreate에서 호출합니다. 정확히 똑같은 방식으로 동작합니다. –

2

여기에 적어도 안드로이드 SDK 소스 코드에 스테핑 위해, 나를 위해 일한 내용은 다음과 같습니다

  1. 안드로이드 SDK에 대한SDK 플랫폼소스를 설치 정확히의 API를 레벨 개발 중에 실행중인 Android 버전 (Android version history 페이지를 사용하여 기기의 API 수준 확인).
  2. 정확하게 해당 버전으로 컴파일하십시오. 예를 들어 Android Studio에서 앱의 build.gradle 파일을 열고 이에 따라 compileSdkVersion의 값을 설정합니다.
  3. 앱을 디버그하십시오. Android SDK 소스를 방문하면 올바른 행이 표시됩니다.
  4. (선택 사항) 배포하기 전에을 최신 SDK로 다시 컴파일하십시오. 즉, compileSdkVersion을 다시 변경하십시오.
+0

이것은 아무 SDK 코드에도 적용되지 않습니다. 타겟 장치와 일치하도록 내 min API 버전을 전환 했으므로 디버거가 올바른 행을 표시하고 있습니다. – Graeme

관련 문제