[Python] Debugging with Decorator
0x00. Intro
Python으로 큰 파일을 분석할 때 어떤 함수에 들어간 값이 올바른 값인지 확인하고 싶을 때 보통 Print( ) 함수를 사용한다.
이렇게 되면 너무 많은 Print( )를 써야할 때도 있고 때론 그 위치를 찾아 삭제/주석처리 과정이 필요해 진다.
특히 OLE와 같은 파일을 분석할 때 어느 위치를 분석하고 있는지 확인하고 싶을 때가 자주 있다. 이럴때 어떻게 하면
효율적으로 확인할 수 있을까? 는 나의 오랜 관심사였다.
Print( ) 함수를 쓰지 않고 보통 IDE들이 제공하는 Debug 모드를 사용해도 소스코드를 한줄한줄 호출하며 원하는 값을 확인하는 작업이 가능하다.
하지만 내가 쓰는 IDE는 이런 Debug 모드를 지원하지 않는다. (notepad++을 사용하고 PyCharm등의 IDE는 너무 무겁다.)
그래서 이런 저런 방법을 찾던 과정에 나름 좋은 방법이 있어서 공유해 본다.
※ PyCharm과 같은 IDE가 제공하듯 tracing은 불가능하다. 단지, 함수 호출관계를 파악하거나 함수별 실행시간을 파악할 때 사용할 수 있다.
※ Decorator를 사용할 때 "@함수명" 이 아니라도 상관없다. "@클래스명" 을 주고 해당 클래스에 "__call__()" 함수를 생성해 주면 동일한 효과를 볼 수 있다.
0x10. Method 1
Refer : [Insight] 파이썬 완벽 가이드 [Web] Page.121
1) sum( ) 함수를 호출한다.
2) sum( ) 함수의 장식자인 @trace가 호출된다. 이때 @trace는 trace( )와 매칭된다.
3) trace( ) 함수가 실행되어 8번째 Print( )가 출력된다.
4) func( )로 최초 호출했던 sum( )함수가 호출된다.
5) sum( )의 결과값이 반환된다.
6) ret 값이 화면에 출력된다.
이러한 과정으로 함수 호출관계를 확인할 수 있으며 trace( ) 함수에서 추가 처리를 통해 다양한 동작이 가능하게 된다.
예를 들어 Print( )로 함수 호출관계를 출력할 수도 있지만 time 모듈을 이용해 시작 시간과 끝 시간을 비교함으로써 함수의 처리 속도를 측정할 수도 있다.
0x20. Method 2
Refer : http://stackoverflow.com/questions/862807/how-would-you-write-a-debuggable-decorator-in-python
[ 샘플코드 ]
[ 결과값 ]
Method 2는 Python 내부 모듈인 sys 내에 작성되어 있는 메소드인 settrace( ) 를 사용해 Tracing 하는 방법이다.
이 방법은 trace 대상 함수가 아닌 trace를 처리할 함수에 대해서만 Decorate 하는 방식이라 대상 함수마다 Decorator를 쓰는 번거로움은 덜하며 Python 의 내부 동작까지 확인할 수 있는 장점이 있다.
0x30. Method 3
Refer : http://stackoverflow.com/questions/862807/how-would-you-write-a-debuggable-decorator-in-python
[ 샘플코드 ]
[ 결과값 ]
Method 3 또한 Method 2와 같이 Python 내부 모듈인 logging을 사용해 Tracing 하는 방법이다.
이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요. |
댓글
댓글 쓰기