2013-10-16 2 views
2

내 앱에 ANR 이벤트를 재생하기 가끔 어렵다. 오늘이 일이 일어 났고, 나는/data/anr에 위치한 trace.txt 파일을 장치에서 꺼냈다. 불행히도이 파일의 데이터를 이해할 수 없습니다. 전체 파일 내용입니다. 누군가 내 앱의 UI가 응답하지 않는 것을 이해할 수 있습니까? 내가 pastebinandroid ANR (활동이 응답하지 않음) trace.txt

편집

페이스트 빈에있는 파일의 전체 trace.txt 파일 내용을 붙여 넣은

이미 비슷한 질문을 읽은 여전히 ​​파일을 읽을 수 없습니다 는 .. 아닙니다 더 이상 사용할 수 없으며 trace.txt 파일에 대한 액세스 권한이 없어 응답을 닫을 수 있습니다.

+0

trace.txt는 ANR이 발생 실행중인 모든 스레드의 상황이다. 그리고 주 스레드에서 긴 활동을 수행 할 때 ANR이 발생합니다. 텍스트 파일에서 스레드를 검색하고 ANR이 발생했을 때 실행중인 스레드를 확인하십시오. 또는 오랜 시간이 걸리는 주 스레드에서 수행중인 작업을 확인하고이를 스레드로 오프로드하십시오. –

답변

0

가장 큰 원인은 컴파일러가 UI 스레드에서 일부 interweb 작업을 기다리고 있습니다 감사합니다.

+0

더 잘 설명해 주시겠습니까? "어떤 interweb 작업을 기다리고"당신은 무엇을 의미합니까? – Apperside

0

무슨 일이 일어나는지 코드가 없으면 도움을주는 것이 정말 어렵습니다. 대신이 상황에 있어야 할 일을 자신의 코드에 표시합니다.

  1. 이상한 동작 (무한 루프, 누락 된 사례 등)을 식별하기 위해 내 코드에서 정적 분석 도구를 실행하십시오. 개인적으로 나는 FindBugs을 사용합니다.
    1. 정적 분석 도구에서 팝업되는 오류를 검토하고 수행중인 작업에 적합한 의미를 수정하십시오. 비동기 수 있습니다 정말 긴 루프, 동기 활동으로 "악"코드의 발생에 대한 코드를 통해
  2. 봐, 등을 동 기적으로 처리되고있는 sleep() 기능, 비동기 활동,
  3. 의 사용 위의 어느 것도 영향을주지 않으면 Log 문장을 던지기 시작합니다. 실행 결과를보고 어디로 가는지 또는 반복되는 부분을 확인하십시오.
  4. 위의 어느 것도 효과가 없다면 맥주를 조금 열어 요가를 한 다음 배회하고 다시 한 번 파고보세요!
3

@Mohamed_AbdAllah가 주석에 "trace.txt는 ANR이 발생했을 때 실행중인 모든 스레드의 상황입니다."라고 적었습니다. ANR이 발생하는 동안 스레드에서 ANR의 이유를 찾는 것은 게시하는 것과 같은 추적으로는 불가능한 것처럼 보입니다. 추적의 텍스트가 무엇인지 이해하려면 this에 관심이있을 수 있습니다. (ANR이 트레이스에서 발생했을 때 어떤 스레드가 오랫동안 실행되고 있는지는 알 수 있지만 도움이되지는 않습니다.)

또는 antoid 응용 프로그램에서 어떤 유형의 충돌/ANR이 있는지보고 싶습니다 Google Play에서 개발하고 게시 한 애플리케이션에 관심이 있음) 충돌 보고서 API를 사용할 수 있습니다. 이 목적을 위해 crashlytics을 사용하고 있으며, 실제로 응용 프로그램 충돌을 수정하는 데 도움이됩니다. 이 응용 프로그램을 응용 프로그램에 추가하면 웹 페이지의 모든 충돌/ANR을 추적 할 수 있습니다.

당신의 목표가 trace.txt에서 ANR의 원인을 찾는 방법을 이해한다면 나는 잘 모른다. 그러나 충돌/ANR을 찾아 수정해야하는 경우 충돌 보고서 API를 사용하십시오.

편집 : 나는 당신이 개발하고 Google Play에 게시 한 응용 프로그램에 대해 이야기하고 있다고 가정했습니다.아직 Google에 게시되지 않은 응용 프로그램에 대해 이야기하는 경우 @ Jeffrey Klardie의 제안은 필요한 것입니다. 하지만 Google에서 응용 프로그램에 Strictmode을 사용하도록 설정하지 않는 것이 좋습니다.

4

Strictmode을 사용하면 어떤 스레드가 특정 스레드를 지연시키는 지 확인할 수 있습니다. 그것을 사용하는 가장 좋은 방법은 다음과 같은 형태입니다. 당신의 애플리케이션 onCreate()에서 StrictMode를 활성화합니다. 그 후, (거의) 모든 스레드에 대한 저속 호출은 발생 된 위치의 전체 스택 추적과 함께 로그에보고됩니다. 사용자 지정 응용 프로그램 클래스에서

:

public void onCreate() { 
    if (DEVELOPER_MODE) { 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
       .detectAll() // detect everything potentially suspect 
       .penaltyLog() // penalty is to write to log 
       .build()); 
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
       .detectAll() 
       .penaltyLog() 
       .build()); 
    } 
    super.onCreate(); 
} 
관련 문제