문제

프로그램의 메소드 호출을 트리의 분기로 표시하여 Java 프로그램의 간단한 시각화를 작성하고 싶습니다. 이것은 프로그램 자체가 수행하는 일을 시각화하도록함으로써 매우 간단하게 수행 될 수 있지만, 수정하려는 방법뿐만 아니라 Java 방법/클래스 로이 작업을 수행 할 수 있기를 원합니다.

내가 필요로하는 것은 프로그램이 호출하는 방법과 해당 방법 내에서 어떤 방법을 호출하는지를 볼 수있는 능력입니다. 분명히 스택 트레이스는이 기능을 정확하게 제공합니다.

 java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)

그래서 나는 스레드에서 실행을 모니터링하고 싶은 프로그램을 가지고 있다고 생각한 다음 그 스레드의 스택을 봅니다. 그러나 스레드 클래스는 실제로 이것을 지원하지 않습니다. 그것은 단지 지원됩니다 인쇄 현재 스택.

물론, 나는 스레드가 스택을 인쇄 할 수 있도록 시스템 클래스의 인쇄물을 단순히 바꾸는 것을 생각했습니다. 나의 Printstream이지만 이것은 잘못된 느낌입니다.

더 좋은 방법이 있습니까? 내가 사용할 수있는 기존 클래스/방법이 있습니까?

또한 현재 Java 소스 코드를 다운로드하여 스레드 클래스가 스택을 정확하게 인쇄하는 방법을 확인하여 스레드를 서브 클래스 스레드와 내 getStack () 메소드로 덤프 스택 () 메소드를 모방 할 수 있습니다.

도움이 되었습니까?

해결책 2

오, 촬영, 소스 코드를 살펴보면 스레드 클래스에 공개 stacktraceElement [] getStacktrace () 메소드가 있음을 알았습니다. 이제 나는 바보 같은 느낌이 듭니다.

예, 그게 해결책 인 것 같습니다.

다른 팁

최신 Java 릴리스와 함께 제공되는 VisualVM도보십시오.

한 가지 방법은 같은 것을 사용하는 것입니다 Bcel 대상 바이트 코드를 전처리하려면 모든 메소드 항목에서 자신의 코드에 호출을 삽입하고 종료합니다 (시도/마침내 블록에서 전체 메소드를 래핑하여 예외 종료를 포착하여 종료하는 것이 가장 좋습니다). 이것으로부터, 당신은 콜 트리를 정확하게 추론 할 수 있습니다.

당신은 사용할 수 있습니다 종자 그에 대한. 이것을 살펴보십시오 설명 정확히 사용 사례.

살펴보십시오 ThreadMxBean 클래스 - 그것은 당신이 필요한 것을 제공합니다. 본질적으로, 당신 :

  • Call ManagementFactory.getThreadMxBean ()을 보려면 ThreadMxBean 인스턴스를 얻으려면;
  • 결과 스레드를 열거하기 위해 결과 ThreadMxBean에서 getAllthreadIds ()를 호출합니다.
  • 주어진 스레드 목록에서 상단 N 스택 추적 요소를 얻으려면 getThreadInfo ()를 호출하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top