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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GDB 로 core dump 파일 분석 하기프로 그래 밍 과정 에서 우 리 는 프로그램 을 컴 파일 할 수 있 지만 실행 할 때 Segment fault (단락 오류) 가 자주 발생 할 수 있 습 니 다.세그먼트 오류 가 발생 한 것 은 잘못된 메모리 세그먼...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.