2014-09-25 5 views
1

우리는 WARN 로그 엔트리 (경고 : 헤더를 설정할 수 없음, Response already committed)를 출력하는 메소드를 가진 abstract 클래스를 가지고 있다고 가정하자.이 메소드는 클래스 X에 의해 많은 시간 (로그 플러딩) 호출된다.특정 클래스를 호출하는 클래스를 식별하는 방법은 무엇입니까?

응용 프로그램 서버에서 생성 된 로그 항목을 기반으로 추상 클래스를 식별하고 해당 jar (jarscan 사용)를 찾았습니다. JAR은 응용 프로그램 서버의 OOTB 구성 요소이므로 어떠한 의미로든 수정 될 수있다. 나는 JAR를 해킹 로그 항목을 생성하는 방법 내에서 라인 도입 :

new Exception().printStackTrace() 

이 접근 방식은 나에게 클래스 X. 그러나

를 식별하는 스택 추적을 제공해야을 나는 방법을 모른다 내 테스트 환경에서이 오류를 재현하기 위해 내 작업 공간에없는 많은 프로젝트가 있으며 응답 객체에 어떤 것을 설정하는지 확인하기 위해 수백 가지 클래스를 확인할 수는 없습니다. 테스트 환경에 대해 실행 중이지만 로그에 나타나지 않는 로그 항목 타임 스탬프와 Selenium 테스트 보고서가 일치하는지 확인하십시오.

질문 : 문제점을 제시하는 환경에 영향을주지 않고 클래스 X를 식별하는 훌륭한 문제 해결 방법은 무엇입니까?

+3

Thread.currentThread(), Thread.dumpStack() 및 Thread.getStackTrace() – ControlAltDel

+1

가능한 복제본 [디버거 란 무엇이며 어떻게 문제를 진단하는 데 도움이 될 수 있습니까?] (http://stackoverflow.com/questions/)를 참조하십시오. 25385173/what-of-a-debugger-and-how-can-it-help-me-diagnose-problems) – Raedwald

+1

디버거를 사용하십시오. 1. 메서드에 중단 점을 넣습니다. 2. 프로그램을 실행하십시오. 3. 프로그램이 중단 점에서 정지 할 때 스택 추적을보십시오. – Raedwald

답변

3

환경에 따라 디버거를 사용할 수없는 경우 서버의 JVM에로드 된 클래스를 조사하고 추상 클래스에서 상속받은 클래스를 찾을 수 있습니다.

실행 jvisualvm하고 그런 다음 쿼리를 jvisualvm에 콘솔을 OQL 실행으로 이동, 서버의 JVM에 연결 :

select heap.findClass("com.xyz.my.AbstractClass").subclasses() 

이 현재로드 당신의 추상 클래스의 모든 서브 클래스를 찾을 수 있습니다.

+1

와우, 친구 ... 이거 최고야. – theMarceloR

1
public String getMethodName(final int depth) { 
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
    return ste[depth].getMethodName(); 
} 

사용법 :

public void doSysOutTest() { 
    String getMetNameFunc = getMethodName(1); 
    String callingMethod = getMethodName(2); 

    System.out.println(getMetNameFunc); 
    System.out.println(callingMethod); 
} 

출력 :

ste[depth].getClassName() 
ste[depth].getFileName() 
ste[depth].getLineNumber() 

가보세요 :

getMethodName 
doSysOutTest 

는 이러한 방법을 사용할 수있는 스택에서 더 많은 정보를 얻으려면 여기 : http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html

관련 문제