2014-11-20 1 views
4
package com.android.internal.telephony.dataconnection; 

public abstract class DcTrackerBase extends Handler { 
    protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      String action = intent.getAction(); 
      if (DBG) log("onReceive: action=" + action); 
[...] 

jdb을 사용하여 위의 코드에서 onReceive 메서드에 중단 점을 설정하고 싶습니다. 나는 다음과 같은 명령을 사용 :JDB를 사용하여 중첩 클래스에 중단 점을 올바르게 설정하는 방법은 무엇입니까?

> stop in com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive 

을 그리고 jdb에서이 얻을 :

> Deferring breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive. 
It will be set after the class is loaded. 

내가 클래스가 이미로드 것을 알고, 그래서 JDB 내가 원하는 방법을 찾지 못하는 것을 상상한다. 그러면 중단 점을 어떻게 설정해야합니까?

답변

5

이상한 메소드 이름이 잘못되었습니다. 우리가 볼 수 있듯이, 중첩 클래스 DcTrackerBase$1 우리 BroadcastReceiver 클래스가 될 수

> class com.android.internal.telephony.dataconnection.DcTrackerBase 
Class: com.android.internal.telephony.dataconnection.DcTrackerBase 
extends: android.os.Handler 
subclass: com.android.internal.telephony.dataconnection.DcTracker 
nested: com.android.internal.telephony.dataconnection.DcTrackerBase$1 

:

JDB에서

발행이 명령은 DcTrackerBase 클래스를 검사합니다. 확인하려면 다음 명령을 실행하십시오.

> class com.android.internal.telephony.dataconnection.DcTrackerBase$1 
Class: com.android.internal.telephony.dataconnection.DcTrackerBase$1 
extends: android.content.BroadcastReceiver 

그게 전부입니다! 제대로 중단 점을 설정하기 위해, 우리는 입력 : 위의 코드에서처럼 onReceive를 오버라이드 (override) 할 경우에

> stop in com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive 
Set breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive 
0

당신은 익명의 클래스를 만들 수 있습니다. DcTrackerBase.java 파일에있는 다른 익명/내부 클래스의 수에 따라 DcTrackerBase $ (숫자) 형식의 이름을 가진 클래스를 만들어야합니다. 나는 당신의 문제를 복제하는 예제를 썼다.

stop in DebugFun$1.toString 
run 

을 이제 디버거는 내부 클래스 내에 :

public class DebugFun{ 

    public static void main(String[] args){ 
     Object myObj = new Object(){ 

      public String toString(){ 
       int x = 1; 
       x++; 
       return "X is:"+x;    
      } 
     }; 
     System.out.println(myObj); 

    } 


} 

그런

jdb DebugFun 

다음 디버거를 시작하는 전화.