응용 프로그램을 개발 중이며 실행할 때마다 메시지가 나타납니다.
불행히도 MyApp가 중지되었습니다.
이 문제를 해결하려면 어떻게해야합니까?
이 질문에 대해- 스택 추적이란 무엇이며, 응용 프로그램 오류를 디버깅하는 데 어떻게 사용할 수 있습니까? 자세한 내용없이 애플리케이션이 다운되었다는 내용의 질문이 많이 있습니다. 이 질문은 초보 Android 프로그래머에게 문제를 직접 해결하고 올바른 질문을하는 방법을 알려줍니다.
응용 프로그램을 개발 중이며 실행할 때마다 메시지가 나타납니다.
불행히도 MyApp가 중지되었습니다.
이 문제를 해결하려면 어떻게해야합니까?
이 질문에 대해- 스택 추적이란 무엇이며, 응용 프로그램 오류를 디버깅하는 데 어떻게 사용할 수 있습니까? 자세한 내용없이 애플리케이션이 다운되었다는 내용의 질문이 많이 있습니다. 이 질문은 초보 Android 프로그래머에게 문제를 직접 해결하고 올바른 질문을하는 방법을 알려줍니다.
답변:
이 답변은 스택 추적을 검색하는 프로세스를 설명합니다. 이미 스택 추적이 있습니까? " 스택 추적이란 무엇이며 어떻게 추적하여 애플리케이션 오류를 디버깅 할 수 있습니까? " 에서 스택 추적을 읽어보십시오.
잡히지 않아서 응용 프로그램이 종료되었습니다 RuntimeException
.
이들 중 가장 일반적인 것은입니다 NullPointerException
.
안드로이드 응용 프로그램 (또는 그 문제에 대한 Java 응용 프로그램)이 충돌 할 때마다 a Stack trace
가 콘솔 (이 경우 logcat)에 기록됩니다. 이 스택 추적에는 문제를 해결하기위한 중요한 정보가 포함되어 있습니다.
창의 하단 막대에서 Logcat
버튼을 클릭하십시오 . 또는 alt+ 를 누를 수도 있습니다 6. Devices
패널 에서 에뮬레이터 또는 장치가 선택되어 있는지 확인하십시오 . 그런 다음 빨간색으로 표시되는 스택 추적을 찾으십시오. logcat에 많은 것들이 로그인되어있을 수 있으므로 약간 스크롤해야 할 수도 있습니다. 스택 추적을 쉽게 찾을 수있는 방법은 오른쪽의 휴지통을 사용하여 로그 캣을 지우고 앱이 다시 충돌하게하는 것입니다.
예이! 당신은 문제를 해결하기 위해 반쯤입니다.
스택 추적을 분석하여 정확히 응용 프로그램 충돌을 일으킨 대상 만 찾으면됩니다.
" 스택 추적이란 무엇이며 어떻게 추적하여 애플리케이션 오류를 디버깅 할 수 있습니까? " 에서 스택 추적을 읽어보십시오.
귀하 Exception
와 귀하 의 회선을 찾았 지만 여전히 고치는 방법을 알 수 없다면 언제든지 주저하지 말고 StackOverflow에 질문하십시오.
가능한 한 간결하게 작성하십시오. 스택 추적 및 관련 코드를 게시하십시오 (예 :을 던진 줄까지 몇 줄 Exception
).
Android > Devices|Logcat
새 필터 ( i.imgur.com/145dtkx.png )를 추가하고 by Log Message
여기에 대해 필터링 할 수 있습니다 FATAL EXCEPTION
( i.imgur.com/HpELhaU .png )이 상자에서 Exceptions
응용 프로그램이 던지는 모든 것을 읽을 수 있습니다 . 이를 통해 logcat을 지우고 충돌을 다시 수행 할 필요가 없습니다. Android Studio 에도이 옵션이 있다고 생각합니다.
당신이 사용할 수있는 구글의 ADB 도구를 얻기 위해 Logcat file
문제를 분석 할 수 있습니다.
adb logcat > logcat.txt
logcat.txt
파일을 열고 응용 프로그램 이름을 검색하십시오. 실패한 이유, 줄 번호, 클래스 이름 등에 대한 정보가 있어야합니다.
-d
. 그렇지 않으면 ctrl-C로 이동하여 logcat을 종료하십시오. 나는adb logcat -v time -d > filename.txt
참고 : 이 답변은 Android Studio 2.2.2를 사용하고 있습니다.
참고 2 : 장치가 성공적으로 연결되어 있다고 생각합니다.
응용 프로그램이 충돌 할 때 가장 먼저해야 할 일은 LogCat을 보는 것입니다 .Android Studio의 맨 아래에는 메뉴 목록이있는 도구 모음이 있습니다.
"Android 모니터"를 클릭하십시오 (위의 이미지에서 밑줄이 그어진 것입니다. ^)
이제 다음과 같은 것을 얻을 수 있습니다 :
" Verbose
"를 " Error
"로 변경하십시오. 이제 기록 된 오류 만 표시됩니다. 이 모든 오류에 대해 걱정하지 마십시오.
확인. 이제 앱을 다운시키기 위해했던 일을하십시오. 앱이 다운되면 logcat으로 이동하십시오. 예를 들어 , at:x.x.x
다음과 같은 많은 크래시 로그를 찾아야합니다 Caused by: TrumpIsPresidentException
. Caused by:
logcat에서 해당 문장으로 이동 하십시오.
다음에 그 Caused By:
, 일어난 예외가 있어야한다. 내 경우에는 a RuntimeException
와 그 아래에 다음 과 같은 파란색 링크 가 포함 된 줄이 있어야합니다 .
Caused by:
그 아래 어딘가에 파란색 텍스트가있는 줄이 없다면 다른 Caused by:
것을 찾으십시오 .
파란색 링크를 클릭하십시오 . 문제가 발생한 곳으로 이동해야합니다. 제 경우에는 다음 줄로 인한 것입니다.
throw new RuntimeException();
이제 왜 충돌하는지 알고 있습니다. 내가 직접 예외를 던지기 때문입니다. 이것은 명백한 오류 였다.
그러나 다른 오류가 있다고 가정 해 봅시다.
java.lang.NullPointerException
나는 logcat을 확인하고 그것이 나에게주는 파란색 링크를 클릭했고 여기로 데려 갔다.
mTextView.setText(myString);
이제 디버깅하고 싶습니다. 이 StackOverflow 질문 에 따르면 NullPointerException은 무언가가 있다고 말합니다 null
.
null이 무엇인지 알아 봅시다 . 두 가지 가능성이 있습니다. 어느 쪽이 mTextView
null의 경우, 또는 myString
null입니다. mTextView.setText(mString)
줄 앞에, 다음 두 줄을 추가합니다.
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
이제 이전과 마찬가지로 (Verose를 Error로 변경) "Error"를 "Debug"로 변경하려고합니다. 우리는 디버깅으로 로깅하기 때문에. 모든 Log 메소드는 다음과 같습니다.
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
그래서 Log.d
우리는를 사용했기 때문에 디버그를 점검하고 있습니다. 이것이 우리가 디버그로 변경 한 이유입니다.
통지 Log.d
에는 첫 번째 매개 변수가 있습니다 (이 경우 "AppDebug"). logcat의 오른쪽 상단에있는 "No Filters"드롭 다운 메뉴를 클릭하십시오. "필터 구성 편집"을 선택하고 필터 이름을 지정한 다음 "로그 태그"에서 "앱 디버그"를 입력하십시오. "확인"을 클릭하십시오. 이제 logcat에 두 줄이 나타납니다.
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
이제 mTextView가 null이라는 것을 알았습니다.
내 코드를 관찰했는데 이제 무언가를 발견했습니다.
나는 private TextView mTextView
수업의 최상위에 선언했다. 그러나 나는 그것을 정의하지 않습니다.
기본적으로 onCreate () 에서이 작업을 잊어 버렸습니다.
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
그래서 mTextView
내 응용 프로그램이 무엇인지 알려주는 것을 잊었 기 때문에 왜 null이 됩니까 ? 따라서 해당 줄을 추가하고 앱을 실행하면 앱이 중단되지 않습니다.
이 팝업은 코드에서 치명적인 예외가 발생하여 앱 실행이 중지 된 경우에만 표시됩니다. 그것은 예외가 될 수 NullPointerException
, OutOfMemoryException
등
확인하는 가장 좋은 방법 은 Android Studio에서 여전히 앱을 개발하는 경우 Logcat을 사용 하는 것입니다.이 방법은 스택 추적을 읽고 앱의 원인을 확인하는 빠른 방법입니다.
앱이 이미 활성화 된 경우 logcat을 사용할 수 없습니다 . 따라서 Crashlytics
발생하는 예외에 대한 버그 보고서를 제공하도록 구현할 수 있습니다 .
다음 도구 중 하나를 사용할 수 있습니다.
adb logcat
adb logcat> logs.txt (편집기를 사용하여 오류를 열고 검색 할 수 있습니다.)
이클립스 logcat (이클립스에 표시되지 않으면 Windows->보기 표시-> 기타-> Android-> LogCat로 이동하십시오)
- Android 디버그 모니터 또는 Android 장치 모니터 (유형 명령 모니터 또는 UI를 통해 열기)
- 안드로이드 스튜디오
Android Debug Monitor 를 사용 하는 것이 좋습니다. 너무 많은 로그가있을 때, adb logcat 필터를 통해 일식이 멈추기 때문에 모두 어렵습니다.
아래 showToast () 메소드에서 컨텍스트 또는 애플리케이션 컨텍스트에 대한 다른 매개 변수를 전달하여 시도해야합니다.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
Force Close를 만날 때 (앱이 작동을 멈출 때)에 대한 기본 Logcat 분석을 공유하겠습니다.
DOCS
로그 수집 / 분석을위한 Android의 기본 도구는 logcat입니다.
여기 logcat에 대한 안드로이드 페이지입니다
android Studio를 사용하는 경우이 링크를 확인할 수도 있습니다 .
캡처
기본적으로 다음 명령을 사용하여 수동으로 logcat을 캡처 할 수 있습니다 (또는 AndroidStudio에서 AndroidMonitor 창을 확인하십시오).
adb logcat
원하는 메시지를 필터링하고 표시하는 데 도움이되는 명령에 추가 할 수있는 많은 매개 변수가 있습니다. 이것은 개인적인 것입니다 ... 나는 항상 아래 명령을 사용하여 메시지 타임 스탬프를 얻습니다.
adb logcat -v time
출력을 파일로 리디렉션하고 텍스트 편집기에서 분석 할 수 있습니다.
분석하는
앱이 충돌하는 경우 다음과 같은 결과가 나타납니다.
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
로그의이 부분에는 많은 정보가 표시됩니다.
07-09 08:29:13.475
문제가 발생한시기를 확인하는 것이 중요합니다 ... 로그에 여러 오류가있을 수 있습니다 ... 올바른 메시지를 확인하고 있는지 확인해야합니다. :)
com.example.khan.abc
이렇게하면 어떤 앱이 다운되었는지 알 수 있습니다 (메시지에 대한 로그를 확인하고 있는지 확인하기 위해)
java.lang.NullPointerException
NULL 포인터 예외 오류
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
객체 onBackPressed()
에서 메소드를 호출하려고했습니다 FragmentActivity
. 그러나 그 대상은 null
당신이 그것을했을 때였습니다.
스택 추적 : 스택 추적은 메서드 호출 순서를 보여줍니다. 때로는 호출 된 메서드가 아니라 호출 된 메서드에서 오류가 발생합니다.
com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)에서
line 메소드의 com.example.khan.abc.AudioFragment.java
내부 파일에서 오류가 발생했습니다 onClick()
: 125
(stacktrace는 오류가 발생한 행을 보여줍니다)
다음에 의해 호출되었습니다.
at android.view.View.performClick(View.java:4848)
다음에 의해 호출되었습니다.
at android.view.View$PerformClick.run(View.java:20262)
이것은 다음에 의해 호출되었습니다.
at android.os.Handler.handleCallback(Handler.java:815)
기타....
개요
이것은 단지 개요 일뿐입니다 ... 모든 로그가 단순하지는 않습니다 ... 단지 아이디어를 공유하고 엔트리 레벨 정보를 제공하는 것입니다 ...
어쨌든 당신을 도울 수 있기를 바랍니다 ... 감사합니다
LogCat을 사용하여 앱 충돌의 원인을 찾으십시오.
Android Studio 를 사용하는 경우 Logcat을 보려면 ALT + 6 또는
Eclipse 를 사용하는 경우 Window-> Open Perspective-> Other-LogCat
드롭 다운 메뉴에서 오류를 선택하여 LogCat으로 이동하십시오. 여기에는 디버그에 도움이되는 모든 필수 정보가 포함됩니다. 그래도 문제가 해결되지 않으면 LogCat을 질문에 대한 편집 내용으로 게시하면 누군가 도와 줄 것입니다.
어떤 이유로 든 좋은 추적 추적없이 앱이 충돌하는 경우. 첫 번째 줄에서 디버깅을 시도하고 충돌 할 때까지 한 줄씩 이동하십시오. 그러면 어떤 줄이 문제를 일으키는 지에 대한 답을 얻게 될 것입니다. 아마도 당신은 그것을 catch catch 블록 및 인쇄 오류 출력에 랩핑 할 수 있습니다.
스택 추적이나 추가 오류 메시지없이이 오류 메시지를 자체적으로 얻을 수도 있습니다.
이 경우 Android 매니페스트가 올바르게 구성되어 있는지 (라이브러리에서 발생하는 매니페스트 병합 및 라이브러리에서 발생하는 모든 활동 포함) 확인해야하며 매니페스트 파일에서 애플리케이션에 표시되는 첫 번째 활동에 특히주의해야합니다. .
내가 좋아하는 툴 logview 를 사용하여 개발 중에 로그를 가져와 분석하십시오. Linux에서 실행할 때는
반드시 표시 ./logview
하고 ./lib/logview.jar
실행 파일 로 표시하십시오 .
마음에 들지 않으면 Android 용 대체 데스크탑 로그 뷰어 가 많이 있습니다.
사용자 기기에서 발생한 처리되지 않은 예외의 스택 추적 을 얻기 위해 Firebase Crashlytics 와 같은 실시간 충돌보고 도구를 통합 합니다.
읽기 (이야기를하고 라이브) 버그가 응용 프로그램을 해제하는 방법 현장에서 버그 처리에 대한 자세한 알고.
Logcat - Android Studio의 개발 단계에서 로그를 확인하려면
처음에는 Logcat을 지우고 앱이 다시 충돌하도록하여 충돌 한 로그 세부 정보 만 얻을 수 있습니다. 스택 추적을 확인해야합니다
불행하게도 MyApp는 중지되었습니다. 그 이유는 여러 가지가 있습니다. 로그에서 동일하게 확인할 수 있습니다. 이를 위해 Log.e ( "TAG", "Message");
앱 충돌 중 일반적인 오류 :
앱 충돌 오류를 해결하려면 :
터미널에 흥미로운 로그가 없거나 응용 프로그램과 직접 관련이없는 경우 기본 라이브러리 때문일 수 있습니다. 이 경우 터미널 내 "tombstone"파일을 확인해야합니다.
삭제 표시 파일의 기본 위치는 모든 장치에 따라 다르지만이 경우에는 다음과 같은 로그가 나타납니다. Tombstone written to: /data/tombstones/tombstone_06
자세한 내용은 https://source.android.com/devices/tech/debug 에서 확인 하십시오 .