문제

매번 어떻게든 기록하고 싶습니다. Thread.interrupt() 호출된 스레드(및 해당 현재 스택)를 기록하고 중단된 스레드에 대한 정보를 식별합니다.

이를 수행할 수 있는 방법이 있습니까?정보를 검색하던 중 누군가 보안 관리자 구현 가능성을 언급하는 것을 보았습니다.이는 런타임에 수행할 수 있는 작업입니까(예: Applet 또는 Web Start 클라이언트에서), 아니면 이를 수행하기 위해 설치된 JVM 도구를 사용해야 합니까?

아니면 더 좋은 방법이 있나요?

도움이 되었습니까?

해결책

빠른 해킹으로서 이것은 많은 생각보다 쉽게 ​​할 수 있어요.이것은 빠른 해킹이기 때문에 배열을 역참조하기 전에 스택 추적이 충분히 깊은지 확인하는 등의 작업을 수행하지 않았습니다.서명된 Applet의 생성자에 다음을 삽입했습니다.

log.info("Old security manager = " + System.getSecurityManager());
System.setSecurityManager(new SecurityManager() {
      @Override
      public void checkAccess(final Thread t) {
        StackTraceElement[] list = Thread.currentThread().getStackTrace();
        StackTraceElement element = list[3];
        if (element.getMethodName().equals("interrupt")) {
          log.info("CheckAccess to interrupt(Thread = " + t.getName() + ") - "
                   + element.getMethodName());
          dumpThreadStack(Thread.currentThread());
        }
        super.checkAccess(t);
      }
    });

그리고 dumpThreadStack 방법은 다음과 같습니다.

public static void dumpThreadStack(final Thread thread) {
  StringBuilder builder = new StringBuilder('\n');
  try {
    for (StackTraceElement element : thread.getStackTrace()) {
      builder.append(element.toString()).append('\n');
    }
  } catch (SecurityException e) { /* ignore */ }
  log.info(builder.toString());
}

물론 이것을 프로덕션 코드에 남겨둘 수는 없지만 어떤 스레드가 오류를 일으키는지 정확히 알려주는 데는 충분했습니다. interrupt() 내가 기대하지 않았던 것.즉, 이 코드를 사용하면 다음을 호출할 때마다 스택 덤프를 얻게 됩니다. Thread.interrupt().

다른 팁

너무 거친 것을 시도하기 전에 자바 디버깅 API? thread.interrupt ()에서 methodentRyevents를 캡처하면 그렇게 할 것이라고 생각합니다.

eeek, 그것은 오래된 인터페이스입니다. 또한 새로운 것을 확인해야합니다. JVM 도구 상호 작용.

나는 볼 것이다 종자 그리고 방법 호출을 마무리하는 기능. an 실행 포인트 컷 그 주변에 interrupt() 방법이 여기에 도움이 될 것입니다.

Java System Method Call (응용 프로그램 코드와 반대로)을 가로 채려고하므로 위의 사항에 유의하십시오. 5월 적합하지 않습니다. 이 스레드 가능하다고 제안하는 것 같지만 그가 창조했음을 주목하십시오. 직물 Rt.jar.

다른 사람들이 말했듯이 ... 일회성이라면 JVMTI는 아마도 가장 하드 코어 방법 일 것입니다. 그러나 재미있는 것처럼 ASM 라이브러리와 계측 API를 사용하여 thread.interrupt () 호출 직전에 만든 정적 메소드에 호출을 삽입하는 에이전트를 작성하는 것입니다. ) 방법 똑같이하는 방법, 당신이 그렇게 할 수 있다고 생각합니다).

둘 다 배우는 데 약간의 시간이 걸리지 만 함께 일하는 것은 매우 재미 있으며, 일단 그것을 잡으면 앞으로 모든 종류의 재미있는 것들에 사용할 수 있습니다 :-) 나는 여기에 붙여 넣을 좋은 스 니펫이 없습니다. 지금은 ASM을 위해 Google 주위에 Google을 사용하고 ASM을 창의적으로 사용하기 위해 JIP를 보면 영감을 얻을 수 있다고 생각합니다.

JIP : Java Interactive Profiler

JMX와 함께 시도 할 수도 있습니다.

ManagementFactory.getThreadMXBean().getThreadInfo(aThreadID)

이랑 Threadinfo 로그인 할 수있는 개체 :

  • 스레드의 스택 추적
  • 이름, 상태 등과 같은 일반적인 사용자 정보

편집하다

라이브 스레드 ID 목록을 얻으려면 getAllthreadIds ()를 사용하십시오.

long[] ids = ManagementFactory.getThreadMXBean().getAllThreadIds();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top