문제

각각의 현재 스택을 포함하여 모든 활성 스레드 목록을 덤프하려고합니다. Threading.enumerate ()를 사용하여 모든 스레드 목록을 얻을 수 있지만 거기에서 스택에 도달 할 수있는 방법을 알 수는 없습니다.

배경 : ZOPE/PLONE 앱은 때때로 괴물이 발생하여 CPU의 100%를 소비하며 다시 시작해야합니다. 나는 그것이 제대로 종료되지 않는 루프라고 느끼지만 검증을 위해 테스트-에 vironemt에서 그것을 재현 할 수는 없습니다. 외부에서 트리거 될 수있는 신호 핸들러를 등록 했으므로 상황이 다시 발생하자마자 일부 코드를 트리거 할 수 있습니다. 모든 활성 스레드에 대한 StackTrace를 버릴 수 있다면 무엇이 잘못되는지 전혀 알 수 있습니다. 구멍은 Python 2.4에서 실행됩니다.

이와 같은 상황을 추적하는 방법에 대한 아이디어는 감사합니다. :)

건배, 크리스

도움이 되었습니까?

해결책

Zope를 사용할 때 설치하려고합니다 Products.signalstack 또는 Mr. Freeze; 이것들은이 목적을 위해 설계되었습니다!

USR1 신호를 ZOPE 서버로 보내면 모든 스레드의 스택 추적을 콘솔에 즉시 덤프합니다. 모든 Zope 스레드가 잠겨 있더라도이 작업을 수행합니다.

후드 아래 에서이 패키지는 간접적으로 사용합니다 threadframes; Python 버전 2.5 이상 ~ 아니다 Zope를 사용하면 sys._current_frames() 스레드 당 스택 프레임에 액세스하는 기능.

현재 Zope 2.12.5 이 기능은 Zope 자체에 통합되며 더 이상 추가 패키지를 설치할 필요가 없습니다.

다른 팁

지터가 이전 답변에서 지적한대로 sys._current_frames() v2.5+에 필요한 것을 제공합니다. Lazy의 경우 다음 코드 스 니펫이 저를 위해 작동했으며 도움이 될 수 있습니다.

print >> sys.stderr, "\n*** STACKTRACE - START ***\n"
code = []
for threadId, stack in sys._current_frames().items():
    code.append("\n# ThreadID: %s" % threadId)
    for filename, lineno, name, line in traceback.extract_stack(stack):
        code.append('File: "%s", line %d, in %s' % (filename,
                                                    lineno, name))
        if line:
            code.append("  %s" % (line.strip()))

for line in code:
    print >> sys.stderr, line
print >> sys.stderr, "\n*** STACKTRACE - END ***\n"

파이썬 3.3 이후의 경우 faulthandler.dump_traceback().

아래 코드는 유사한 출력을 생성하지만 스레드 이름을 포함하고 더 많은 정보를 인쇄하도록 향상 될 수 있습니다.

for th in threading.enumerate():
    print(th)
    traceback.print_stack(sys._current_frames()[th.ident])
    print()

2.4. 너무 나쁘다. Python 2.5에서 거기에 있습니다 sys._current_frames().

그러나 당신은 시도 할 수 있습니다 스레드 프레임. 그리고 makefile이 당신에게 문제를 일으키면 당신은 이것을 시도 할 수 있습니다 struleframe 용 setup.py

샘플 출력 ThreadFrame을 사용할 때

완전성을 위해서만 제품 .LongRequestLogger 병목 현상을 식별하는 데 매우 도움이되며, 그렇게하려면 특정 간격으로 스택 트레이스를 덤프합니다.

적용 가능한 레시피가 있습니다 ASPN. 당신이 사용할 수있는 threading.enumerate() 모든 TID를 얻으려면 스택 추적을 강제하기 위해 적절한 예외를 가지고 _ASYNC_RAISE ()를 호출하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top