2014-11-12 2 views
3

\n 번을 stdout에 두 번 인쇄하는 타사 라이브러리를 사용하고 있습니다. 로깅에 버그가있는 것으로 보입니다.stdout 출력의 소스 발견

어떤 코드 행이이 출력을 생성하는지 알아내는 가장 좋은 방법은 무엇입니까? (필자는 외부 라이브러리가 아닌 파이썬이라고 기대합니다)?

몇 가지 아이디어 :

  • 가 어떻게 A 같은 인식 무언가에 \n 문자의 표시를 변경할 수 있습니다 내가 디버거를 통해 단계 경우 출력이 발생했을 때, 내가 볼 수있는?

  • 문자를 표준 출력으로 보낼 때마다 저수준 함수를 원숭이 - 패치하여 일부 출력 또는 디버그 - 중단을 일으킬 수 있습니까?

답변

1

당신은 표준 출력을 추월을 시도 할 수 있습니다 :

class StdoutFilter: 
    def __init__(self, realStdout): 
     self.realStdout = realStdout 

    def write(self, text): 
     if text == '\n': # or some more complicated condition 
      raise Exception("Newline alert!") 

     self.realStdout.write(text)    

import sys 
sys.stdout = StdoutFilter(sys.stdout) 

# import the 3rd party library and use it 

을이 필터 클래스에서 만 개 이상의 N 다음 개행 문자가 인쇄 된 후에 카운터를 추가하고 예외를 발생시킬 수 있습니다. 예외 스택 추적은 악의적 인 인쇄 원본을 나타냅니다.

또는 여기에 중단 점을 넣거나 \n을 다른 것으로 변경할 수 있습니다.

+0

우수 - 고맙습니다. 불행히도 라이브러리가 모든 예외를 자동으로 처리하고 있거나 호출이 C 코드에서오고있는 것처럼 보입니다. (pdb.trace()도 실패하기 때문에) 그러나 이것은 문제를 추적하기에 충분할 것입니다. – Zero

+0

다른 사람은 다음과 같이 보았습니다. "traceback"이 내 특별한 문제인 trace traceback을 찾았습니다. traceback.print_stack (file = self.stdout)' – Zero

관련 문제