내 응용 프로그램이 어딘가에 강제 종료를 일으키고 있지만 LogCat에서 일반적인 (매우 유익한) 스택 추적으로 치명적인 오류가 발생하는 대신 다음 4 줄만 수신합니다.캐치되지 않은 예외로 스레드가 종료 됨 : 스택 추적 없음
06-27 07:08:54.546: D/dalvikvm(14351): GC_FOR_MALLOC freed 9923 objects/657416 bytes in 21ms
06-27 07:08:54.769: W/dalvikvm(14351): threadid=20: thread exiting with uncaught exception (group=0x4001d7f0)
06-27 07:08:54.796: W/dalvikvm(14351): threadid=21: thread exiting with uncaught exception (group=0x4001d7f0)
06-27 07:08:54.796: I/Process(14351): Sending signal. PID: 14351 SIG: 9
이것은 로그 필터에 적용된 필터가없는 디버그 모드입니다!
- 이 문제의 원인은 무엇입니까?
- 이 예외의 원인을 알 수있는 방법이 있습니까?
업데이트 : 아래 @assylias에 덕분에, 내가 구현 할 수있었습니다 :
06-27 08:24:47.105: D/dalvikvm(15475): GC_FOR_MALLOC freed 13865 objects/1435952 bytes in 45ms
06-27 08:24:47.136: I/dalvikvm(15475): threadid=15: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI
06-27 08:24:47.136: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x45209338 (56 left)
06-27 08:24:47.140: I/dalvikvm(15475): expanding stack end (0x45209300 to 0x45209000)
06-27 08:24:47.140: I/dalvikvm(15475): Shrank stack (to 0x45209300, curFrame is 0x4520937c)
06-27 08:24:47.159: I/dalvikvm(15475): threadid=16: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI
06-27 08:24:47.159: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520c338 (56 left)
06-27 08:24:47.167: I/dalvikvm(15475): expanding stack end (0x4520c300 to 0x4520c000)
06-27 08:24:47.167: I/dalvikvm(15475): Shrank stack (to 0x4520c300, curFrame is 0x4520c37c)
06-27 08:24:47.175: I/dalvikvm(15475): threadid=17: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI
06-27 08:24:47.175: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520f338 (56 left)
06-27 08:24:47.175: I/dalvikvm(15475): expanding stack end (0x4520f300 to 0x4520f000)
06-27 08:24:47.175: I/dalvikvm(15475): Shrank stack (to 0x4520f300, curFrame is 0x4520f37c)
이 확실히 훨씬 더 유용이 추가 라인을 생산
final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.getStackTraceString(paramThrowable);
subclass.uncaughtException(paramThread, paramThrowable);
}
});
정보,하지만 지금은 다음과 고투하고있어 :
subclass.uncaughtException()
에 대한 호출에도 불구하고 응용 프로그램이 강제 종료되지 않습니다. 왜?- 모든 스택 오버플로의 의미는 무엇입니까? 내 가난한 안드로이드 테스트 장치에 그렇게 과세 할 수 있을까?
- 내 코드에서 어떤 부분이이 문제를 일으키는 지 어떻게 알 수 있습니까?
업데이트 :Log.getStackTraceString(paramThrowable);
실제로 인쇄되지 않았습니다. 받은 여분의 인쇄물은 bogus subclass.uncaughtException (paramThread, paramThrowable)에서 왔습니다. 전체 스택 추적을 기록하는 올바른 방법은 Log.e(TAG, "uncaughtException", throwable)을 사용하는 것입니다.
남은 유일한 질문은 예외를 다시 던지기위한 것입니다. throw paramThrowable
을할까요?
내 마지막 질문에 답하기 : 이클립스는 try/catch를 사용하지 않고서는 내버려 둘 수 없으므로 내가 원하는 것은 다시 던지기가 아니라 killProcess()
이라는 것을 알게되었다. 문제 해결됨.
아마도 코드에 try catch를 사용하면 식별하는 데 도움이됩니다. –
@Mukund 어디에서 코드 사용 하시겠습니까? 이미 수많은 try/catch 절을 사용하고 있습니다. –
아래의 답변으로 좀더 일반적인 try catch를 추가하여 .java 파일의 전체 코드를 둘러 쌉니다. –