[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


[ 샘플코드 ]

[ 결과값 ]

Method 2는 Python 내부 모듈인 sys 내에 작성되어 있는 메소드인 settrace( ) 를 사용해 Tracing 하는 방법이다. 
이 방법은 trace 대상 함수가 아닌 trace를 처리할 함수에 대해서만 Decorate 하는 방식이라 대상 함수마다 Decorator를 쓰는 번거로움은 덜하며 Python 의 내부 동작까지 확인할 수 있는 장점이 있다. 

0x30. Method 3


[ 샘플코드 ]

[ 결과값 ]

Method 3 또한 Method 2와 같이 Python 내부 모듈인 logging을 사용해 Tracing 하는 방법이다. 


이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

댓글

가장 많이 본 글