파이썬 어플리케이션의 stack trace

프로그램이 자꾸 죽는데 어디서 죽는 건지 못 찾겠습니다. 파이썬 인터프리터에 시그널을 줘서 어느 코드를 실행하는 지 알아내려면 어떻게 하죠?

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    저도 평소엔 잘 실행되다가 가끔 왠지 모르게 프로그램이 종료되는 경우가 있었는데 그때 제가 썼던 방법을 알려드릴게요. 제가 개인적으로 만든 코드라서 범용은 아니고 unix환경에서만 쓸 수 있습니다.

    import code, traceback, signal
    
    def debug(sig, frame):
        """Interrupt running process, and provide a python prompt for
        interactive debugging."""
        d={'_frame':frame}         # Allow access to frame object.
        d.update(frame.f_globals)  # Unless shadowed by global
        d.update(frame.f_locals)
    
        i = code.InteractiveConsole(d)
        message  = "Signal received : entering python shell.\nTraceback:\n"
        message += ''.join(traceback.format_stack(frame))
        i.interact(message)
    
    def listen():
        signal.signal(signal.SIGUSR1, debug)  # Register handler
    

    쓸 때는 프로그램 시작 부분에 listen() 함수를 한번 호출해줘야 합니다. os.kill(pid, signal.SIGUSR1)처럼 kill등을 써서 SIGUSR1 시그널을 보내면 파이썬 콘솔이 멈추고 stack trace한 결과를 보여줍니다.

    stack trace에서 계속 실행하려면 ctrl-d(EOF)를 눌러주세요.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.