2010-02-17 4 views
12

저는 처음으로 3 행의 긴 안드로이드 앱을 디버깅하기 시작했으며 원하는대로 디버그 도구를 사용할 수 없습니다. 겉으로보기에는 쓸데없는 안드로이드 용 디버깅 환경입니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    int a = 1/0; 
} 

가 지금은 디버거가 스레드를 중단하고 나에게 0으로 나누기가 발생 문장의 줄 번호를 보여 기대 : 다음은 내 코드입니다. 아니요, 대신 소스가없는 시스템 내부에 other method을 보여줍니다. 설상가상으로 예외 메시지도 없습니다.

이 앱을 사용하기 전에 버튼을 누르면 무언가를 할 수있는 앱을 만들었습니다. 예외가 발생하면 다시 유용한 행 번호 또는 예외 메시지가 표시되지 않습니다.

현재로서는 내 앱을 디버그 할 수있는 방법이 없습니다. 어떤 아이디어?

Eclipse 어댑터 ADT 플러그인과 함께 최신 SDK를 사용하고 실제 기기 (Nexus One)에서 디버깅하고 있습니다.

+3

나는 당신의 고통을 느낍니다. Visual Studio와 다른 고급 IDE가 우리를 망쳐 놓았습니다. 골동품 로그 파일로 돌아가는 것은 printf()를 다시 사용하여 디버깅하는 것과 같습니다. –

+3

http://stackoverflow.com/questions/2552568/whats-wrong-with-debugging-in-eclipse-on-android/에서 내 응답을보십시오. 다른 방법을보고있는 이유는 기본적으로 Eclipse는 잡히지 않은 예외 만 중단한다는 것입니다. 귀하의 ArithmeticException은 안드로이드 프레임 워크에 의해 잡히고, 이클립스는 예외가 다시 던져 질 때까지 멈추지 않았습니다. 잡힌 ArithmeticExceptions에 예외 중단 점을 추가하면 throw 시점에서 중단됩니다. (프레임 워크로 감싸지 않기 때문에 주 스레드 바깥에서도 작업하면됩니다.) – fadden

+4

이것이 나를 괴롭 히고 있습니다. 그것은 1970 년대가 아닌 2010입니다. – SteelBytes

답변

8

처음에는 부분적으로 맞다고 인정해야합니다. 예외 발생시 실행을 멈추게하고 디버깅을 일으킨 코드 행을 표시하는 디버거가 있습니다. 이클립스 디버거에서이 동작을보고 싶어요. 그러나 다른 대답은 옳습니다.

Eclipse에서 Window -> Show View -> Other -> Android -> LogCat 이제 에뮬레이터 또는 연결된 장치에서 발생하는 모든 디버깅 결과가 표시됩니다. 예를 들어 다음 StackTrace를 얻습니다. 당신은 모든 다른 사람을 제기 하나를 보여 가장 깊은 예외에 가면

T03-18 09:45:12.398: ERROR/AndroidRuntime(1778): Uncaught handler: thread main exiting due to uncaught exception 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.client/android.client.ClientMain}: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.os.Looper.loop(Looper.java:123) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at dalvik.system.NativeStart.main(Native Method) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.client.ClientMain.onCreate(ClientMain.java:35) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  ... 11 more 
03-18 09:45:12.438: INFO/Process(52): Sending signal. PID: 1778 SIG: 3 

당신은

03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero 
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):  at android.client.ClientMain.onCreate(ClientMain.java:35) 

이 내가 생각하는 매우 분명하다 볼 수 있습니다. ClientMain의 35 번째 줄에 예외가 던져졌고 0으로 나누기 예외였습니다. 이것을 이해할 수없는 경우 (예와 같이 명확하지 않은 경우)이 줄 또는 메서드 또는 항목의 진입 점에 중단 점을 설정할 수 있습니다. 이제 디버거가 모든 변수를 표시하고 오류가 발생할 때까지 단계별로 코드를 단계별로 실행할 수 있습니다. varibale 위로 마우스를 가져 가면이 변수의 값을 볼 수 있으며 이제는 예외의 원인을 이해하고 해결하기 위해 단계별로 시도 할 수 있습니다.코드로 깊숙이 들어가면 부서를 담당하는 Java 클래스에서 종료하게됩니다.이 클래스의 소스 코드가있는 항아리를 프로젝트에 추가하지 않으면 디버거가 표시 할 수 없습니다 이 시점에서 뭔가.

2

Eclipse는 그런 디버깅을하지 않습니다. 실제 오류 메시지를보고 LogCat을 사용하여 오류 메시지가 발생한 위치를 파악해야합니다. LogCat에 줄 번호가 있는지 기억이 안납니다.

+1

글쎄, 그게 파머 야 - 네가 전체 일식 네이티브 디버깅이 이유가 없다고 말하는거야? 그리고 예, LogCat에 라인 번호가 있습니다 (고맙게도). – Mansour

+3

중단 점을 설정할 수 있습니다. 실제로는 디버깅의 의미입니다. –

1

디버깅은 "무언가"가 발생할 때 줄 번호와 예외 텍스트가 표시된다는 것을 의미하지 않습니다 ... 디버깅은 중단 점을 설정하고 특정 지점에 코드를 유지하며 단계별로 수행 할 수 있음을 의미합니다 명령어, 변수보기 등

그런 문제를 감지하려면 프로그래머는 기능을 종료하고 입력 할 때 Log 클래스를 사용하여 유용한 로그 텍스트를 구현해야합니다. 또한 상황이 잘못 될 것으로 의심되는 경우 예외 블록을 사용하십시오. 예를 들어 분단의 경우, 제수가 정적이 아니지만 아무것도 될 수 있다면, 분열과 같은 행동을 보호하십시오! catch 블록에서 발생한 이벤트를 기록하거나 유용한 작업을 수행하십시오.

기본적으로 Android에만 국한된 사항은 아니지만 Java에는 공통입니다!

+7

저는 몇 년 동안 사용해온 (C, C++, Python, Desktop, Javascript, VB, .NET 용 Java) 완전히 다른 개발 환경에서, 어디서부터 시작해야하는지 정확히 알 수 있습니다. 예외 발생시 세부 사항, 백 트레이싱 및 예외시 로컬 변수보기가 모두 디버깅 프로세스의 핵심 부분이었습니다. 디버깅은 반드시 그런 것은 아니지만, 이것은 안드로이드 애플 리케이션 디버깅의 단점입니다. – Mansour

+1

분명히 스크립트가 깨졌지만 환경에서 디버깅하는 방법을 이해하지 못했다고 생각합니다. 오류가 발생했음을 식별 할 수 있습니다. 이제 시도, 중단 점 및 출력을 추가하고 실제로 중단하십시오. 이것은 컴파일러 나 런타임에서 올바르게 처리하지 않고 예외를 던져 디버깅하는 것입니다. 디버깅은 버그를 없애기위한 사전 대책입니다. –

관련 문제