NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Python Visual Studio Code에서 파이썬 디버깅 하는 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. Visual Studio Code에서 파이썬 디버깅을 하려면 PDB(Python Debugger)를 사용해야 합니다. C#도 디버깅은 PDB 파일을 사용하는데요. 이건 Program Data Base의 줄임말입니다. 그냥 알아두세요 ㅎㅎ; 자~ 우선, 아래와 같은 코드가 있다고 해봅시다.

    [ 플라스크를 이용한 웹서비스 개발 ]

    import pdb
    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def home():
        return '<h2>Hello, World!</h2>'
    
    @app.route('/macro/<user_name>/<int:user_id>')
    def user(user_name, user_id):
        breakpoint()
        if user_name == 'test':
            return '사용자 이름이 다릅니다.';
    
        return f'Hello, NGMsoftware!<br /><b>{user_name}</b> ({user_id})';
    if __name__ == '__main__':
        app.run(debug=True)

     

    첫줄에 import pdb를 추가해야 디버깅 할 수 있습니다. 중단점을 걸고 싶은 위치에 breakpoint()를 추가 해줍니다. 그리고, 실행하세요. 웹브라우저에 아래 주소로 이동합니다.

    • http://localhost:5000/macro/test/1000

     

    그러면, 비주얼 스튜디오 코드에서 중단점이 걸려서 멈춘상태가 됩니다. 터미널에서 아래와 같이 입력하면 변수 값을 확인할 수 있습니다.

    (Pdb) user_name
    'test'
    (Pdb)

     

    pdb 모듈은 파이썬 프로그램을 위한 대화형 소스 코드 디버거입니다. 소스 라인 단계의 중단점(breakpoint) 및 단계 실행(single stepping) 설정, 스택 프레임 검사, 소스 코드 목록 및 컨텍스트에서 임의의 파이썬 코드를 실행하고 평가할 수 있습니다. 또한, 포스트 모템(post mortem) 디버깅을 지원합니다. 디버거를 사용하려면 아래와 같은 함수를 사용합니다.

     

    pdb.run(statement, globals=None, locals=None)
    디버거 제어하에 statement (주어진 문자열 또는 코드 객체)를 실행합니다. 코드가 실행하기 전에 디버거 프롬프트가 나타납니다; 중단점을 지정하고 continue를 입력하거나, step 또는 next를 통해 문장을 단계별로 살펴볼 수 있습니다. (이 모든 명령은 아래에 설명되어 있습니다.) 선택적 인자 globals 와 locals는 코드가 실행되는 환경을 구체적으로 명시합니다. 기본적으로 이 모듈의 딕셔너리 __main__ 이 사용됩니다.

     

    pdb.runeval(expression, globals=None, locals=None)
    디버거 제어하에 문자열 또는 코드 객체로 주어진 expression을 평가합니다. runeval() 을 사용해서, 표현식의 값을 반환합니다. 그렇지 않으면 이 함수는 run()과 동일하게 작동합니다.

     

    pdb.runcall(function, *args, **kwds)
    주어진 인자와 함께 function (문자열이 아닌, 함수 또는 메서드 객체)를 호출합니다. runcall() 이 반환될 때, 함수 호출로 리턴하는 값을 반환합니다. 디버거 프롬프트는 함수에 진입하자마자 나타납니다.

     

    pdb.set_trace(*, header=None)
    호출하는 스택 프레임에서 디버거에 진입합니다. 코드가 디버그 되지 않는 경우라도(예를 들면, assertion이 실패하는 경우), 프로그램의 특정 지점의 중단점에 하드 코딩할 때 유용하게 사용됩니다. header 값을 주면, 디버깅이 시작되기 바로 전에 그 값이 콘솔에 출력됩니다.

     

    pdb.post_mortem(traceback=None)
    주어진 traceback 객체의 포스트-모템(post-mortem) 디버깅으로 진입합니다. 만약 traceback이 주어지지 않았다면, 현재 처리되고 있는 하나의 예외를 사용합니다. (기본값을 사용하는 경우 예외는 반드시 처리되고 있어야 합니다.)

     

    pdb.pm()
    sys.last_traceback 에서 찾은 traceback 의 포스트-모템(post-mortem) 디버깅으로 진입합니다.

     

    특정 모듈의 파이썬을 디버깅하는 경우 아래와 같이 list 명령으로 소스를 출력할 수 있습니다. 

    (Pdb) list
      6         return '<h2>Hello, World!</h2>'
      7
      8     @app.route('/macro/<user_name>/<int:user_id>')
      9     def user(user_name, user_id):
     10         breakpoint()
     11  ->     if user_name == 'test':
     12             return '사용자 이름이 다릅니다.';
     13
     14         return f'Hello, NGMsoftware!<br /><b>{user_name}</b> ({user_id})';
     15     if __name__ == '__main__':
     16         app.run(debug=True)
    (Pdb)

     

    pdb에서 자주 사용하는 명령어는 아래와 같습니다.

    • help: 도움말
    • next: 다음 문장으로 이동
    • print: 변수값 화면에 표시
    • list: 소스코드 리스트 출력. 현재 위치 화살표로 표시됨
    • where: 콜스택 출력
    • continue: 계속 실행. 다음 중단점에 멈추거나 중단점 없으면 끝까지 실행
    • step: Step Into 하여 함수 내부로 들어감
    • return: 현재 함수의 리턴 직전까지 실행

     

    스파이더를 사용하면 IDE 수준에서 디버깅이 가능합니다. 하지만, Visual Studio Code에서는 디버깅에 제약이 있습니다. 아무튼, 중단점에 코드가 걸린 상태에서 한단계씩 실행할 때 위 명령의 첫 글자만 입력해도 됩니다. F5, F8, F10, F11과 같은 동작들이 c, s, n등과 같이 이니셜로도 실행할 수 있습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.