Visual Studio에서 Python 코드를 디버그하기
Visual Studio는 Python에 대한 포괄적인 디버깅 경험을 제공합니다. 이 문서에서는, 실행 중인 프로세스에 디버거를 연결하고 조사 및 즉시 창에서 식을 평가하는 방법을 살펴봅니다. 디버거에서 로컬 변수를 검사하고, 중단점을 사용하고, 문을 step in/step out/step over하고, 다음 문을 설정하는 등의 작업을 수행할 수 있습니다.
시나리오별 디버깅 정보는 다음 문서를 참조하세요.
필수 조건
Python 워크로드에 대한 지원과 함께 설치된 Visual Studio. 자세한 내용은 Visual Studio에서 Python 지원 설치를 참조하세요.
디버거와 함께 사용할 Python 코드입니다.
프로젝트를 사용하거나 사용하지 않고 코드 디버그하기
Python 환경 및 인수를 제어하려면 먼저 코드에 대한 프로젝트를 만듭니다. 프로젝트를 기존 Python 코드에서 프로젝트 템플릿을 사용해 만들 수 있습니다. 자세한 내용은 기존 Python 코드 파일에서 프로젝트 만들기를 참조하세요.
그러나 Python 코드를 디버그하기 위해 Visual Studio에 프로젝트 또는 솔루션 파일이 있을 필요는 없습니다. 독립 실행형 Python 파일에서 코드를 디버그하려면, Visual Studio에서 파일을 열고 디버그>디버깅 시작을 선택합니다. Visual Studio는 전역 기본 환경을 갖추고 인수는 없는 스크립트를 시작합니다. 그런 다음 코드에 대한 전체 디버깅 지원을 받습니다. 자세한 내용은 Python 환경을 참조하세요.
기본 디버깅 살펴보기
기본 디버깅 워크플로에는 중단점 설정, 단계별 코드 실행, 값 검사 및 예외 처리가 포함됩니다. 디버깅 세션을 시작하려면 디버그>디버깅 시작 을 선택하거나 F5 키보드 바로 가기 키를 사용합니다. 프로젝트의 경우, 이러한 작업이 실행하는 시작 파일 은 프로젝트의 활성 환경과 프로젝트 속성에 지정된 명령줄 인수 또는 검색 경로를 사용합니다. 속성을 구성하려면, 프로젝트 디버깅 옵션을 설정하기를 참조하세요.
포르젝트 시작 파일을 설정하기
프로젝트 시작 파일은 솔루션 탐색기에 볼드체로 표시됩니다. 시작 파일로 사용할 파일을 선택할 수 있습니다.
- 프로젝트 파일을 시작 파일로 지정하려면, 파일을 마우스 우클릭하고 시작 항목으로 설정을 선택합니다.
Visual Studio 2017 버전 15.6 및 이후 버전에서는 지정된 시작 파일 집합이 없는 경우 경고가 표시됩니다. 이전 버전의 Visual Studio에서는 Python 인터프리터가 실행 중인 출력 창을 열거나 출력 창이 잠시 열리고 즉시 닫힙니다.
활성 환경을 지정하기
프로젝트 파일을 사용하는 경우, 디버거는 항상 프로젝트의 활성 Python 환경에서 시작됩니다. 현재 활성 환경을 변경할 수 있습니다. 자세한 내용은 프로젝트에 대한 Python 환경 선택하기를 참조하세요.
독립 실행형 Python 코드 파일을 디버깅하는 경우 Visual Studio는 인수가 없는 전역 기본 환경을 갖춘 스크립트를 시작합니다.
중단점 설정
중단점은 프로그램 상태를 검사할 수 있도록 표시된 지점에서 코드 실행을 중지합니다.
Python의 일부 중단점은 다른 프로그래밍 언어에 익숙한 개발자에게 놀라운 경험이 될 수 있습니다. Python에서 전체 파일은 실행 가능한 코드이므로 최상위 클래스 또는 함수 정의를 처리하기 위해 로드될 때 Python에서 해당 파일을 실행합니다. 중단점이 설정되면 디버거에서 도중에 클래스 선언을 통해 중단되는 것을 알 수 있습니다. 이 동작은 때때로 놀랍긴 해도 올바른 동작입니다.
중단점을 설정하려면, 코드 편집기의 왼쪽 여백을 선택하거나 코드 줄을 마우스 우클릭하고 중단점>중단점 삽입을 선택합니다. 중단점이 있는 각 행 별로 빨간색 점이 표시됩니다.
중단점을 제거하려면, 빨간 점을 선택하거나 코드 줄을 마우스 우클릭하고 중단점>중단점 삭제를 선택합니다. 빨간 점을 선택하고 중단점>중단점 비활성화를 선택하여 중단점을 비활성화할 수도 있습니다.
조건과 작업을 설정하기
변수가 특정 값이나 값 범위에 도달했을 때만 중단하는 것과 같이 중단점을 트리거하는 조건을 사용자 지정할 수 있습니다.
조건을 설정하려면 빨간색 중단점을 마우스 우클릭하고 조건을 선택합니다. 이 중단점 설정 대화 상자가 열립니다.
대화 상자에서, Python 코드를 사용하여 여러 조건을 추가하고 조건식을 만들 수 있습니다. Visual Studio의 이 기능에 대한 자세한 내용은 중단점 조건을 참조하세요.
중단점에 대한 작업 을 설정하는 옵션도 있습니다. 로그에 대한 메시지를 출력 창에 만들고 필요에 따라 자동으로 실행을 계속하도록 지정할 수 있습니다.
메시지를 로깅하면 애플리케이션에 직접 로깅 코드를 추가하지 않고 추적점 이 생성됩니다.
중단점에 대한 조건 및 작업을 구성하는 방법에 따라 왼쪽 여백의 빨간색 아이콘이 변경되어 설정을 나타냅니다. 점 모양, 시계 타이머 또는 다이아몬드가 표시될 수 있습니다.
단계별 코드 실행
Visual Studio가 중단점에서 코드 실행을 중지하는 경우, 몇 가지 명령을 사용해 또 다시 탈출하기 전에 코드 블록을 실행하거나 코드를 단계별로 실행할 수 있습니다. 이 명령은 디버거 툴바, 디버그 메뉴, 코드 편집기의 우클릭 컨텍스트 메뉴, 그리고 키보드 바로 가기 키를 통해 Visual Studio의 몇몇 위치에서 사용 가능합니다.
다음 표에서는 이러한 명령을 요약하고 바로 가기 키를 제공합니다.
명령 | 바로 가기 | 설명 |
---|---|---|
Stop | Shift+F5 | 디버깅 세션을 중지합니다. |
다시 시작 | Ctrl+Shift+F5 | 현재 디버깅 세션을 다시 시작합니다. |
계속 | F5 | 다음 중단점에 도달할 때까지 코드를 실행합니다. |
한 단계씩 코드 실행 | F11 | 다음 문을 실행하고 중지합니다. 다음 문이 함수 호출인 경우 디버거는 호출된 함수의 첫 번째 줄에서 중지합니다. |
프로시저 단위 실행 | F10 | 함수 호출(모든 코드 실행) 및 반환 값 적용을 포함하여 다음 문을 실행합니다. 이 명령을 사용하면 디버그할 필요가 없는 함수를 쉽게 건너뛸 수 있습니다. |
프로시저 나가기 | Shift+F11 | 현재 함수가 끝날 때까지 코드를 실행한 후 호출하는 문으로 이동합니다. 이 명령은 현재 함수의 나머지 부분을 디버그할 필요가 없을 때 유용합니다. |
커서까지 실행 | Ctrl+F10 | 편집기에서 캐럿의 위치까지 코드를 실행합니다. 이 명령을 사용하면 디버그할 필요가 없는 코드 세그먼트를 쉽게 건너뛸 수 있습니다. |
다음 명령문 설정 | Ctrl+Shift+F10 | 코드의 현재 실행 지점을 캐럿 위치로 변경합니다. 이 명령을 사용하면 코드에 결함이 있거나 원하지 않는 부작용이 발생했을 때와 같은 경우 실행되지 않도록 코드 세그먼트를 생략할 수 있습니다. |
다음 명령문 표시 | Alt+Num+\ | 코드에서 실행할 다음 문으로 돌아갑니다. 이 명령을 사용하면 코드에서 디버거가 중지된 위치를 찾을 수 있습니다. |
값 검사 및 수정
디버거에서 코디 실행이 중지되면 변수 값을 검사하고 수정할 수 있습니다. 조사식 창을 사용하여 개별 변수와 사용자 지정 식을 모니터링할 수도 있습니다. 자세한 내용은 변수 검사를 참조하세요.
값을 디버깅 과정에서 데이터팁 기능을 사용하여 보려면, 편집기에서 변수 위로 마우스를 이동하면 됩니다. 변수을 선택하여 변경할 수 있습니다.
이 자동 창을 사용하려면, 디버그>Windows>자동을 선택합니다. 해당 창에는 현재 문에 가까운 변수와 식이 포함되어 있습니다. 값 열을 더블클릭하거나 F2 키를 선택 및 입력하여 값을 편집할 수 있습니다.
이 자동 창 사용 방법에 대한 자세한 내용은, 자동 및 로컬 windows에서 검사하기를 참조하세요.
이 로컬 창을 사용하려면, 디버그>Windows>로컬을 선택하세요. 해당 창에는 현재 범위에 있는 모든 변수가 표시되며, 다시 편집될 수 있습니다.
이 로컬 창 사용 방법에 대한 자세한 내용은, 자동 및 로컬 windows에서 검사하기를 참조하세요.
이 조사 창을 사용하려면, 디버그>Windows>조사>조사 1-4를 선택하세요. 이 옵션을 사용하면 임의의 Python 식을 입력하고 결과를 볼 수 있습니다. 식은 각 단계마다 다시 계산됩니다.
이 조사 창 사용 방법에 대한 자세한 내용은 Watch 및 QuickWatch windows와 함께 변수 조사하기를 참조하세요.
문자열 값을 검사하기 위해 선택해야 하는 보기 (돋보기)는 값 항목 오른쪽에 있습니다. 이
str
,unicode
,bytes
및bytearray
유형은 전부 검사에 사용할 수 있습니다.이 View 드롭다운 메뉴는 Text, HTML, XML, 또는 JSON의 네 가지 시각화 옵션을 보여줍니다.
시각화를 선택한 후, 선택한 형식에 따라 따옴 지정되지 않은 문자열 값이 팝업 대화 상자에 표시됩니다. 줄 바꿈 및 스크롤, 구문 강조 표시 및 트리 뷰를 사용하여 문자열을 볼 수 있습니다. 이러한 시각화는 길고 복잡한 문자열의 문제를 디버그하는 데 도움이 될 수 있습니다.
예외 보기
디버그하는 동안 프로그램에서 오류가 발생하지만 이 오류에 대한 예외 처리기가 없으면 디버거가 예외 지점에서 중단됩니다.
오류가 발생하면, 호출 스택을 포함한 현재 프로그램 상태를 검사할 수 있습니다. 그러나 코드를 단계별로 실행하려고 하면, 예외가 처리되거나 프로그램을 종료할 때까지 디버깅 프로세스가 예외를 계속 throw합니다.
확장된 예외 보기를 하려면, 디버그>Windows>예외 설정을 선택하세요.
이 예외 설정 창에서, 예외가 발생할 때, 다음 체크박스가 디버거가 항상 중단되는 지 여부를 검사합니다.
특정 예외에 대해 더 자주 중단하려면, Exception Settings 창에 있는 예외 옆의 체크박스를 선택합니다.
기본적으로 소스 코드에서 예외 처리기를 찾을 수 없는 경우 예외 대부분이 중단됩니다. 이 동작을 변경하려면 예외를 마우스 오른쪽 단추로 클릭하고 사용자 코드에서 처리되지 않은 경우 계속 옵션을 수정합니다. 예외에 대한 중단을 덜 빈번하게 하려면, 이 옵션을 선택 취소합니다.
이 예외 설정 창에 표시되지 않는 예외를 구성하려면, 추가 (더하기 기호)를 선택합니다. 감시할 예외의 이름을 입력합니다. 이름은 예외의 전체 이름과 일치해야 합니다.
프로젝트 디버깅 옵션 구성하기
기본적으로 디버거는 표준 Python 시작 관리자를 통해 명령줄 인수와 다른 특수 경로나 조건이 없는 프로그램을 시작합니다. 디버그 속성을 설정하여 Python 프로젝트에 대한 시작 옵션을 구성할 수 있습니다.
다음 섹션에서는 특정 속성에 대해 설명합니다.
시작 동작 정의하기
다음 표에는 시작 모드 속성에 사용할 수 있는 값이 나와 있습니다. 이 속성을 사용하여 디버거의 시작 동작을 정의합니다.
값 | 설명 |
---|---|
표준 Python 시작 관리자 | CPython, IronPython 및 Stackless Python 같은 변형과 호환되는 휴대용 Python으로 작성된 디버깅 코드를 사용합니다. 이 옵션은 순수 Python 코드를 디버그하기 위한 최상의 환경을 제공합니다. 실행 중인 python.exe 프로세스에 연결하면 이 속성에 지정된 시작 관리자를 사용합니다. 이 시작 관리자는 CPython에 대한 혼합 모드 디버깅 도 제공하는 덕분에 C/C++ 코드와 Python 코드 간에 단계별로 완벽하게 실행할 수 있습니다. |
웹 시작 관리자 | 시작 시 기본 브라우저를 시작하고 템플릿 디버깅을 활성화합니다. 자세한 내용은 웹 템플릿 디버깅 섹션을 참조하세요. |
Django 웹 시작 관리자 | Django 환경에 대해 웹 시작 관리자 속성과 동일한 동작을 구현합니다. 이 옵션은 이전 버전과의 호환성만을 위해 사용합니다. |
IronPython(.NET) 시작 관리자 | IronPython에서만 작동하는 .NET 디버거를 사용하지만 C# 및 Visual Basic을 포함한 모든 .NET 언어 프로젝트 간 단계별 실행을 허용합니다. IronPython을 호스팅하는 실행 중인 .NET 프로세스에 연결하는 경우 이 시작 관리자가 사용됩니다. |
실행 동작 정의하기
다음 표에서는 디버거에 대한 실행 동작을 구성하도록 설정할 수 있는 속성에 대해 설명합니다.
속성 | 설명 |
---|---|
검색 경로 | Visual Studio에서 프로젝트를 위해 사용하는 파일 및 폴더 검색 경로를 지정합니다. 이러한 값과 일치하는 항목을 보여주는 위치는 프로젝트의 검색 경로 노드로 이는 솔루션 탐색기에서 찾을 수 있습니다. 이 대화 상자에서 검색 경로를 지정할 수 있지만, 폴더를 찾아보고 경로를 상대 양식으로 자동으로 변환할 수 있는 솔루션 탐색기를 사용하는 것이 더 용이할 수 있습니다. |
스크립트 인수 | Visual Studio에서 스크립트를 시작하는 데 사용하는 명령에 추가할 인수를 정의하고 스크립트의 파일 이름 뒤에 표시합니다. 값에 나열된 첫 번째 항목은 sys.argv[1] , 두 번째 항목은 sys.argv[2] 등으로 스크립트에 사용할 수 있습니다. |
인터프리터 인수 | 이러한 인수를 나열하여 시작 관리자 명령줄에서 스크립트의 이름 앞에 추가됩니다. 공통 인수는 -W ... 주의를 제어하고, -O 약간의 프로그램 최적화를 하며, -u 버퍼링되지 않은 IO를 사용하기 위함입니다. IronPython 사용자는 이 필드를 사용하여 -X:Frames 또는 -X:MTA 와 같은 -X 옵션을 전달할 수 있습니다. |
인터프리터 경로 | 현재 환경과 연결된 경로를 재정의할 인터프리터 경로를 식별합니다. 값은 비표준 인터프리터로 스크립트를 시작하는 데 유용할 수 있습니다. |
환경 변수 | 이 속성을 사용하여 폼의 항목을 추가합니다 <NAME>=\<VALUE> . Visual Studio는 PYTHONPATH 이 검색 경로 를 따라 설정된 이후에 기존의 전역 환경 변수 위로 이 속성을 마지막으로 적용합니다. 따라서 이 설정을 사용하여 다른 변수를 수동으로 재정의할 수 있습니다. |
대화형 창 사용하기
두 가지 대화형 창이 있어 디버깅 세션 중에 사용 가능합니다. 표준 Visual Studio 즉시 창과 Python 대화형 디버그 창입니다.
직접 실행 창 사용하기
표준 Visual Studio 즉시 창을 사용하여 Python 식을 신속하게 평가하고 실행 중인 프로그램에서 변수를 검사하거나 할당할 수 있습니다. 자세한 내용은 직접 실행 창을 참조하세요.
- 이 즉시 창을 열려면, 디버그>Windows>즉시창을 선택합니다. 또한 Ctrl+Alt+I키보드 바로 가기 키를 사용할 수도 있습니다.
대화형 디버그 창 열기
이 Python 대화형 디버그 창은 코드 작성 및 실행을 포함한 디버깅 과정에서 사용할 수 있는 전체 대화형 REPL 경험을 갖춘 풍부한 환경을 제공합니다. 이 창은 디버그>프로세스에 연결로 연결된 프로세스를 포함해, 표준 Python 시작 관리자를 사용하여 디버거에서 시작되는 모든 프로세스에 자동으로 연결합니다. 그러나, 이 창은 C/C++ 혼합 모드 디버깅을 사용하는 경우에는 사용할 수 없습니다.
이 대화형 디버그 창은 다음 표에 설명된 대로 표준 REPL 명령에 더해 특수 메타 명령도 지원합니다.
명령 | 설명 |
---|---|
$continue , $cont , $c |
현재 문에서 프로그램 실행을 시작합니다. |
$down , $d |
스택 추적에서 현재 프레임을 한 수준 아래로 이동합니다. |
$frame |
현재 프레임 ID를 표시합니다. |
$frame |
현재 프레임을 지정된 프레임 ID로 전환합니다. - 필요한 요소는 <프레임 ID> 인수입니다. |
$load |
파일에서 명령을 로드하고 완료될 때까지 실행합니다. |
$proc |
현재 프로세스 ID를 표시합니다. |
$proc |
현재 프로세스를 지정된 프로세스 ID로 전환합니다. - 필요한 요소는 <프로세스 ID> 인수입니다. |
$procs |
현재 디버깅 중인 프로세스를 나열합니다. |
$stepin , $step , $s |
가능한 경우 다음 함수 호출을 단계별로 실행합니다. |
$stepout , $return , $r |
현재 함수에서 나갑니다. |
$stepover , $until , $unt |
다음 함수 호출을 건너뜁니다. |
$thread |
현재 스레드 ID를 표시합니다. |
$thread |
현재 스레드를 지정된 스레드 ID로 전환합니다. - 필요한 요소는 <스레드 ID> 인수입니다. |
$threads |
현재 디버깅 중인 스레드를 나열합니다. |
$up , $u |
스택 추적에서 현재 프레임을 한 레벨 위로 이동합니다. |
$where , $w , $bt |
현재 스레드의 프레임을 나열합니다. |
프로세스, 스레드 및 호출 스택과 같은 표준 디버거 창은 대화형 디버그 창과 동기화되지 않습니다. 이 대화형 디버그 창에서 활성 프로세스, 스레드, 또는 프레임을 변경하는 경우, 다른 디버거 창은 영향을 받지 않습니다. 마찬가지로, 다른 디버거 창에서 활성 프로세스, 스레드 또는 프레임을 변경하는 경우 대화형 디버그 창에는 적용되지 않습니다.
레거시 디버거 사용
환경 구성에 따라 레거시 디버거를 사용해야 할 수 있습니다.
- Python 2.6, 3.1에서 3.4까지 또는 IronPython을 사용한 Visual Studio 2017 버전 15.7 및 이전 버전
- Python 2.6, 3.1에서 3.4까지 또는 IronPython을 사용한 Visual Studio 2019 버전 16.5 및 이후 버전
- ptvsd 3.x 및 초기 4.x 버전
레거시 디버거는 Visual Studio 2017 버전 15.7 및 이전 버전의 기본값입니다.
- 레거시 디버거를 사용하려면, 도구>옵션을 선택하고, Python>디버깅 옵션을 확장한 후, 레거시 디버거 사용 옵션을 선택합니다.
이전 버전의 Visual Studio 또는 Python 버전 지원하기
Visual Studio 2017 버전 15.8 및 이후 버전에서는 ptvsd 버전 4.1 이후 버전에 기반한 디버거를 사용합니다. Visual Studio 2019 버전 16.5 및 이후 버전에서는 debugpy에 기반한 디버거를 사용합니다. 이 두 가지 버전의 디버거는 Python 2.7 또는 Python 3.5 및 이후 버전과 호환됩니다.
이러한 버전의 Visual Studio 중 하나를 실행 중이지만 Python 2.6, 3.1에서 3.4 또는 IronPython을 사용하는 경우 Visual Studio에 디버거가 이 Python 환경을 지원하지 않습니다라는 에러가 뜹니다.
Visual Studio에서 이 환경 오류를 보고하는 경우 레거시 디버거를 사용해야 합니다.
이전 ptvsd 버전 지원하기
현재 환경에 이전 버전의 ptvsd를 사용하는 경우(예: 원격 디버깅에 필요한 4.0.x 이전 버전 또는 3.x 버전) Visual Studio에서는 오류 또는 주의를 표시할 수 있습니다.
환경에서 ptvsd 3.x를 사용하는 경우, Visual Studio에서 디버거 패키지를 로드할 수 없습니다라는 오류가 뜹니다.
ptvsd 4.x 이전 버전을 설치한 경우, 디버거 패키지가 만료되었습니다라는 주의가 뜹니다.
Visual Studio에서 이러한 환경 오류를 보고하는 경우 레거시 디버거를 사용해야 합니다.
Important
몇몇 버전의 ptvsd에 대한 주의를 무시할 수 있지만, 그런 경우 Visual Studio가 제대로 작동하지 않을 수 있습니다.
ptvsd 설치를 관리하기
ptvsd 설치를 관리하려면 다음 단계를 수행합니다.
이 Python 환경 창에서 패키지 탭으로 이동합니다.
검색 상자에 ptvsd 를 입력하고 설치된 버전의 ptvsd을 검사합니다.
버전이 4.1.1a9(Visual Studio에서 번들된 버전)보다 낮은 경우 패키지의 오른쪽에 있는 X를 선택하여 이전 버전을 제거합니다. 그러면 Visual Studio는 번들된 버전을 사용합니다. (PowerShell에서 제거하는 데
pip uninstall ptvsd
명령을 사용해도 됩니다.)또는 디버그 시나리오 문제 해결하기 섹션의 지침에 따라 ptvsd 패키지를 최신 버전으로 업데이트할 수 있습니다.
디버그 시나리오 문제 해결하기
다음 시나리오에서는 디버깅 구성에 대한 다른 문제 해결 옵션을 설명합니다.
Visual Studio 2019용 ptvsd를 업그레이드하기
Visual Studio 2019 버전 16.4 및 이전 버전에서 디버거에 문제가 있는 경우, 먼저 다음과 같이 디버거 버전을 업그레이드합니다.
이 Python 환경 창에서 패키지 탭으로 이동합니다.
검색 상자에서 ptvsd --upgrade 를 입력하고, Run command: pip install ptvsd --upgrade를 선택합니다. (PowerShell에서 동일한 명령을 사용할 수도 있습니다.)
문제가 계속되면 PTVS GitHub 리포지토리에 문제를 보고하세요.
참고 항목
Visual Studio 2019 버전 16.5 이상에서는 debugpy가 Visual Studio Python 워크로드의 일부이며 Visual Studio와 함께 업데이트됩니다.
디버거 로깅 사용
디버거 문제를 조사하는 동안, Microsoft에서 진단에 도움이 되는 디버거 로그를 활성화하고 수집하도록 요청할 수 있습니다.
다음 단계를 수행하면 현재 Visual Studio 세션에서 디버깅을 사용하도록 설정할 수 있습니다.
Visual Studio에서 명령 창을 열기 위해 보기>다른 창>명령 창을 선택합니다.
다음 명령을 입력합니다.
DebugAdapterHost.Logging /On /OutputWindow
디버깅을 시작하고 문제를 재현하는 데 필요한 단계를 진행합니다. 이 시간 동안 디버그 로그는 출력 창의 디버그 어댑터 호스트 로그 아래에 나타납니다. 그런 다음, 해당 창에서 로그를 복사하여 GitHub 문제, 이메일 등에 붙여 넣을 수 있습니다.
Visual Studio가 응답을 중지하거나 달리 출력 창에 액세스할 수 없는 경우 Visual Studio를 다시 시작한 다음, 명령 창을 열고 다음 명령을 입력합니다.
DebugAdapterHost.Logging /On
디버깅을 시작하고 문제를 다시 재현합니다. 디버거 로그는
%temp%\DebugAdapterHostLog.txt
에 있습니다.