Btrace, DTrace 실전 의 Btrace

9583 단어 디 버 깅BTrace
Btrace 및 Dtrace 실전 BTRACE
 
가장 먼저 접촉 한 것 은 btrace 입 니 다. 그것 은 2010 년 에 들 었 을 것 입 니 다. 나중에 Dtrace 라 는 말 을 들 었 습 니 다. 오늘 방학 에 돌아 와 서 이 두 개의 온라인 디 버 깅 기 를 정리 하 겠 습 니 다.
원본 다운로드 주 소 는:http://kenai.com/projects/btrace/downloads 홈 페이지 의 최근 업데이트 시간 을 보면 2 년 전이 다. release 의 업 데 이 트 는 3 년 전 이 었 다. 좋 은 것 은 자주 업데이트 되 지 않 았 지만 오래 사용 되 었 다.iteye 에서 btrace 를 검색 하면 오래된 주인 동료 몇 편 이 쓴 것 을 발견 할 수 있 습 니 다.
http://www.iteye.com/topic/1005918
http://www.iteye.com/topic/586630
모두 잘 썼 습 니 다. 실현 원리 부터 코드 등급 의 해석 까지 저 는 중복 되 는 일 을 하지 않 고 자신의 느낌 만 씁 니 다!
 
 
tips:
소스 코드 는 Mercurial 을 통 해 관 리 됩 니 다.
다운로드 코드: hg clonehttps://hg.kenai.com/hg/btrace~hg  
 
얘 뭐 하 는 거 야?
프로그래머 에 게 가장 큰 문제 중 하 나 는 온라인 이 고장 났 다 는 것 이다. 그러나 우 리 는 debug 로 문제 의 원인 을 찾 을 수 없다. 또한 온라인 에 있 을 때 로그 단 계 는 우리 가 모든 세부 사항 을 log 에 인쇄 할 수 없다 는 것 을 제한 했다. 이 럴 때 고장 이 어디 에 있 는 지, 할 수 있 는 수단 은 소스 코드 를 보고 코드 를 자세히 보면 문 제 를 찾 을 수 있다.그리고 컴 파일 하여 다시 온라인 으로 해결 할 수 있 습 니 다. 이런 수단 으로 일부 코드 를 해결 할 수 있 지만 숨겨 진 bug 에 대해 서 는 어 쩔 수 없습니다. 예 를 들 어 OOM 이나 빈번 한 full gc 는 보통 많은 대상 이 풀 려 나 지 않 거나 한 대상 이 자주 호출 되 지 않 습 니 다. 큰 대상 의 문제 라면 jmap + MAT 를 통 해 찾 을 수 있 습 니 다. 후자 라면...당신 만 해도 머리 가 큽 니 다. 필 자 는 예전 에 OOM 문 제 를 만 났 는데 바로 대상 이 자주 만 들 어 졌 습 니 다. 마지막 으로 찾 을 때 오픈 소스 패키지 의 문제 입 니 다. 이런 방식 은 소스 코드 를 보면 해결 하기 어렵 기 를 바 랍 니 다. 그러면 btrace 스 크 립 트 가 있어 서 다행 입 니 다.
 
시작 합 시다.
즉, 위 에서 대상 의 호출 생 성 을 언급 했 습 니 다. 먼저 Btrace 를 통 해 누가 호출 되 었 는 지 알 아 보 세 요. 5 단계 만 있 으 면 됩 니 다.
 
1) 시작 클래스 가 필요 합 니 다.
 
package com.zhaming.trace.btrace;

import java.util.Random;

public class StartObject {

    public static void main(String[] args) throws InterruptedException {

        Random random = new Random();

        ActionObject actionObject = new ActionObject();
        while (true) {
            int sleepTime = random.nextInt(1000);
            actionObject.work(sleepTime);
            Thread.sleep(1000);
        }
    }
}
 
 
2) 실 행 된 클래스: ActionObject
 
package com.zhaming.trace.btrace;

public class ActionObject {

    private static int totalTimes = 0;

    public int work(int sleepTime) throws InterruptedException {
        System.out.println("sleep " + sleepTime);
        totalTimes += sleepTime;
        Thread.sleep(sleepTime);

        return totalTimes;
    }

}
 
 
3) 보 이 는 구체 적 인 스 크 립 트:
 
package com.zhaming.trace.btrace;

import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace
public class TraceObject {

    @OnMethod(clazz = "com.zhaming.trace.btrace.ActionObject", method = "work", location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/"))
    public static void checkWhoCallMe() {
        println("check who ActionObject.work method:");
        jstack();
    }
}
 
 
4) jps 명령 으로 프로 세 스 ID 가 져 오기:
 
inter12@inter12-VirtualBox:~/install/soft/btrace/bin$ jps 
10617 Jps
10600 StartObject
1876 org.eclipse.equinox.launcher_1.2.0.v20110502.jar
 
 
5) btrace 스 크 립 트 실행
 
inter12@inter12-VirtualBox:~/workspace/Light/target/classes$ btrace -cp /home/inter12/workspace/Light/target/classes  10600  /home/inter12/workspace/Light/src/main/java/com/zhaming/trace/btrace/TraceObject.java
check who ActionObject.work method:
com.zhaming.trace.btrace.ActionObject.work(ActionObject.java:9)
com.zhaming.trace.btrace.StartObject.main(StartObject.java:14)
check who ActionObject.work method:
com.zhaming.trace.btrace.ActionObject.work(ActionObject.java:9)
com.zhaming.trace.btrace.StartObject.main(StartObject.java:14)
 
 
터미널 에서 StartObject 클래스 에서 과 Action Object. work 방법 을 실행 하면 우리 가 원 하 는 실행 대상 을 찾 을 수 있 습 니 다.
 
첫머리 로 돌아가다
지금 다시 고 개 를 돌려 우리 위 에서 무엇 을 했 는 지 살 펴 보 자. 첫 번 째 부터 두 번 째 단 계 는 모두 무시 할 수 있다. 테스트 데 이 터 를 준비 하기 위해 세 번 째 단 계 를 직접 보 자. 우 리 는 주로 두 개의 표 시 를 추가 했다.
 
@BTrace   //    btrace         
public class TraceObject {  
		
    // //                ,             ,           ,      ,      ,           
    @OnMethod(clazz = "com.zhaming.trace.btrace.ActionObject", method = "work", location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/")) 
    public static void checkWhoCallMe() {
    
        //               ,         jstatck  ,               
        println("check who ActionObject.work method:");
        jstack();
    }
}

 
마지막 명령 은: btrace - cp/home/inter 12/workspace/Light/target/classes 10600  /홈/inter 12/workspace/Light/src/main/java/com/zhaming/trace/btrace/TraceObject. java (- cp 뒤 에는 코드 에 의존 하 는 클래스)
줄 이면 btrace - cp [지정 한 클래스 경로] [PID] XXX. JAVA 는 이렇게 해서 btrace 를 해 결 했 습 니 다. 아주 간단 합 니 다!그리고 주의해 야 할 것 이 있 습 니 다. btrace 를 1.2 버 전 으로 다운로드 하기 전에 TraceObject 의 종 류 는 정적 인 static 이 어야 합 니 다. 1.2 버 전 이후 에는 이러한 요구 가 없습니다!
 
Action Object 클래스 의 totalTimes 값 을 알 고 싶다 면 아래 스 크 립 트 를 쓸 수 있 습 니 다.
 
package com.zhaming.trace.btrace;

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TraceObjectValue {

    @OnMethod(clazz = "com.zhaming.trace.btrace.ActionObject", method = "work", location = @Location(Kind.RETURN))
    public static void getMethodValueAndReturn(@Self com.zhaming.trace.btrace.ActionObject instance ,int sleepTime,@Return int totalTime) {
        println("call ActionObject work method:");
        println(strcat("sleepTime", str(sleepTime)));
        println(strcat("return total timeL", str(get(field("com.zhaming.trace.btrace.ActionObject", "totalTimes"), instance))));
    }

}
 
 
스 크 립 트 실행:
 
inter12@inter12-VirtualBox:~/workspace/Light/target/classes$ btrace -cp /home/inter12/workspace/Light/target/classes  11939 /home/inter12/workspace/Light/src/main/java/com/zhaming/trace/btrace/TraceObjectValue.java
call ActionObject work method:
sleepTime45
return total timeL11267
call ActionObject work method:
sleepTime513
return total timeL11780
call ActionObject work method:
sleepTime845
 
 
한 가지 방법의 실행 시간 을 얻 으 면 다음 과 같다.
 
package com.zhaming.trace.btrace;

import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace
public class TraceObjectCost {

    @TLS
    static long startTime;

    @OnMethod(clazz = "com.zhaming.trace.btrace.ActionObject", method = "work", location = @Location(Kind.RETURN))
    public static void start() {
        startTime = timeMillis();
    }

    @OnMethod(clazz = "com.zhaming.trace.btrace.ActionObject", method = "work", location = @Location(Kind.RETURN))
    public static void getMethodExecuteCost(int sleepTime,@Return int totalTime) {
        String str = str(timeMillis() - startTime);
        String strcat = strcat("execute work method cost:", str);
        String strcat2 = strcat(strcat, " ms");
        println(strcat2);
    }
}
 
 
스 크 립 트 실행:
 
inter12@inter12-VirtualBox:~/workspace/Light/target/classes$ btrace -cp /home/inter12/workspace/Light/target/classes  13191 /home/inter12/workspace/Light/src/main/java/com/zhaming/trace/btrace/TraceObjectCost.java 
execute work method cost:1357295586155 ms
execute work method cost:1410 ms
execute work method cost:1005 ms
execute work method cost:1335 ms
execute work method cost:1448 ms
 
 
 
원 하 는 method 의 몇 줄 이 실행 되 었 다 면 다음 스 크 립 트 를 시도 해 보 세 요.
 
package com.zhaming.trace.btrace;

import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace
public class TraceObjectMethodLineCall {
    
    @OnMethod(clazz="com.zhaming.trace.btrace.ActionObject",method="work",location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))
    public static void lineCall(@Self com.zhaming.trace.btrace.ActionObject self, @TargetMethodOrField String method, @ProbeMethodName String probeMethod){
        println(Strings.strcat(method, Strings.strcat(" in ", probeMethod)));
    }
}
 
 
 
TargetMethodOrField :    
ProbeMethodName :    

스 크 립 트 실행:
 
inter12@inter12-VirtualBox:~/workspace/Light/target/classes$ btrace -cp /home/inter12/workspace/Light/target/classes  13544 /home/inter12/workspace/Light/src/main/java/com/zhaming/trace/btrace/TraceObjectMethodLineCall.java 
append in work
toString in work
println in work
sleep in work

좋은 웹페이지 즐겨찾기