2010-03-29 3 views
7

매우 오래 있어야하는 파이썬 응용 프로그램이 있지만 때로는 프로세스가 사라지고 그 이유를 모르겠습니다. 이런 일이 발생하면 아무 것도 기록되지 않으므로 약간의 손실이 있습니다.종료되기 전에 파이썬 응용 프로그램 잡기

종료 이벤트에 연결하는 코드가 있습니까? 아니면 프로세스가 종료되기 직전에 일부 코드를 실행하는 다른 방법이 있습니까? 무슨 일이 벌어지고 있는지 더 잘 이해하기 위해 메모리 구조의 상태를 기록하고 싶습니다.

답변

8

atexit은 "at exit"로 발음됩니다. 처음으로 그 함수 이름을 읽었을 때, "texit"이라고 읽었습니다. do not make 거의만큼 의미가 있습니다.

+0

상황이 악화 될 수 있습니다. 예를 들어, 모듈 작성자는 직장에서 상당히 멋진 날을 보낼 수 있기 때문에 사실 이후 모듈의 이름을 지정했습니다. ;) – tzot

3

응용 프로그램을 콘솔 (Windows의 경우 cmd, 유닉스의 경우 sh/bash/etc)에서 직접 실행 해보십시오. 그러면 프로세스가 종료 될 때 콘솔에 인쇄 된 모든 스택 추적을 볼 수 있습니다.

3

나는 당신이 소스 코드를 수정 할 수 있다면 모르겠지만, 만약 그렇다면 당신이 시도 할 수 있습니다 : 당신은 당신이 덤프해야 명령 행에서 파이썬 프로그램을 실행하면

def debugexcept(type, value, tb): 
    if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError: 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     traceback.print_exception(type, value, tb) 
     print 
     pdb.pm() 


sys.excepthook = debugexcept 

을 파이썬 디버거가 죽을 때, 뭔가 '나쁜'일이 예외를 발생시킨 것으로 가정합니다. 아마도 stderr/stdout이 캡처되어 일부 예외가 표시되지 않는 것 같습니까? 찾기 어렵게 될 수있는 과정이 모두는 예외없이 죽어 경우

sys.stdout = open('stdout.log', 'w') 
sys.stderr = open('stderr.log', 'w') 

: 같은 뭔가

즉, 검색 할 수 있습니다. Windows에서 (매우 어려운 방법) windbg와 같은 것을 사용하여 프로세스에 연결하고 관련 지점에서 CRT에 중단 점을 설정하는 것입니다.

행운을 빈다.

관련 문제