debug

newhyork·2022년 8월 10일
0

Flask debugger


  • 터미널에 export FLASK_DEBUG=1(True)를 입력한다.
    • Flask App 실행 시, .run(debug=True)로 하지 않아도 debug mode로 진입한다.
      • debug mode에서 코드를 수정 후 저장 시,
        Flask 서버를 껐다 켜지 않아도 실시간으로 재실행하여 반영한다.
        - .py 파일 변경 시에만 재실행하고, HTML 파일 변경시는 페이지를 refresh 해줘야 한다.
        - (이로 인해, VSC의 auto save가 유용하지 못해진다는 단점이 있긴 하다. )
    • 해당 터미널에서만 debug mode로 동작한다.
      • ((venv와 함께) 모든 터미널에서 동작하게 하고 싶으면, 자동화 스크립트를 짜도록 한다.
        단, 위 명령어 자체만 실행되게 할 수 있는게 아니라, .sh 파일에 명령어를 작성하고,
        해당 파일의 경로를 통해 실행하는 방법으로 할 수 있는 걸로 보인다.)
    • FLASK_ENV=development와는, debug가 on인 것은 동일하나 env가 다르다.
  • 에러 메시지를 터미널이 아니라 해당 웹 페이지 상에서 확인할 수 있다.
  • VSC의 breakpoint와는 별개이다.
  • 로컬에서 Flask app server를 디버깅하며 개발할 때 주로 이용하곤 한다.

VSC run & debug


  • bug를 파악할 때도, breakpoint로 흐름을 짚어가며 코드를 파악할 때도 유용하다.
  • F5로 실행한다. (Ctrl+F5는, 디버깅 없이 실행한다.)
  • .vscode/launch.json에 script를 작성함으로써, 다음에 디버깅 할 때 재사용 할 수 있다.
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name":"{name}",
                "args": ["{argument_1}", "{argument2}", ..],
                "type":"python",
                "request":"launch",
                "program": "${workspaceFolder}/{file_path}",
                "justMyCode":true
            }
        ]
    }
    • "args": argument를 전달하여 실행할 수 있다.
    • "console": "integratedTerminal"이 기본값이며, VSC 상에서 터미널을 새로 열어 실행한다.
      "internalConsole"은 따로 TERMINAL에서 출력하지 않고, DEBUG CONSOLE에서 확인할 수 있다.
    • "env": 터미널에 실행에 필요한 환경 변수를, "key":"value" JSON 형식으로 추가한다.
      • "internalConsole"시, PYTHONPATH 부재로 ModuleNotFoundError가 발생할 수 있다.
        이 때, "env": {"PYTHONPATH":"${workspaceRoot}"}와 같이 한다.
    • "justMyCode": true가 기본값이며, false로 해두면 표준 라이브러리 함수까지 디버깅한다.
  • 단순히 .py 파일을 디버깅 해야 할 때 유용하다.

with Flask debugger

  • VSC run & debug로 Flask debugger를 실행하려면, 다음과 같이 script를 작성한다.

    {
        "name": "flask web app",
        "type": "python",
        "request": "launch",
        "module": "flask",
        "env": {
            "FLASK_APP": "${workspaceFolder}/{file_path}",
            "FLASK_ENV": "development",
            "FLASK_DEBUG": "1"
        },
        "args": [
            "run", "--port", "5000",
            "--no-debugger",
            "--no-reload"
        ],
        "jinja": true
    }
    
    • 단, 이렇게 실행되는 Flask APP은, 다른 .py를 run & debug로 실행했을 때와 달리,
      메인 모듈로써 if __name__ == '__main__'에 의해 실행되는 것은 아니게 된다.

JS debugger


  • 개발자 도구의 source 탭에서 breakpoint등을 사용할 수 있다.
    • 코드 상으로는, debugger; 로 breakpoint를 둘 수도 있다.
  • 좌측 Filesystem 탭에서 workspace에 프로젝트 directory를 추가해 놓으면,
    VSC 등의 editor에서 코드를 수정 시 실시간으로 연동되어 반영된다.

Python traceback


에러 발생 File "{file_path}", 에러 발생 line {number} , line이 속한 함수 
에러 발생 line
...
에러 클래스: 에러 메시지
  • 함수 단위로 call stack으로 표시한다.
    • 에러가 발생하게 된 경로/로직 파악에 용이하다.
    • 아래 쪽에 발생한 것이, 에러 발생의 직접적인 원인이다.
  • framework/library의 에러로 잡힐 때는, 이를 잘못 사용하여 호출한 경우가 대부분이다.
    따라서, 그 이전을 확인하면 된다.
  • traceback library의 format_exc()으로, 최근 발생한 traceback 메시지를 출력할 수 있다.

0개의 댓글