VS code 디버깅 : 코딩은 종종 문제 해결의 여정입니다. 그러나 때로는 코드에 숨은 버그들이 이 여정을 좌우합니다. 여기서 등장하는 주인공, 디버깅!
디버깅은 마치 코드의 탐정처럼 작동합니다. 여러분의 코드가 이상하게 행동할 때, 디버깅은 그 원인을 찾아내고 해결책을 제시해주는 강력한 도구입니다.
이번 포스트에서는 코드의 버그를 찾아내는 과정을 VS code에서 진행해보도록 하겠습니다.
VS code 디버깅 시작
밑에 간단한 예제 코드를 가져왔습니다.
해당 코드는 아주 간단해서 바로 오류를 찾을 수도 있지만 가끔은 정말 간단한 오류도 눈에 보이지 않을 때가 있습니다.
해당 코드에서 무엇이 잘못되었는지 VS code 디버깅 기능으로 알아가 보도록 하겠습니다.
def calculate_recommended_calories(height, weight, gender):
# 유효성 검사
if not isinstance(height, (int, float)) or not isinstance(weight, (int, float)):
return "키와 몸무게는 숫자로 입력해주세요."
if not isinstance(gender, str) or gender.lower() not in ['male', 'female']:
return "성별은 'male' 또는 'female'로 입력해주세요."
# 권장 칼로리 계산
if gender == 'male':
recommended_calories = 10 * weight + 6.25 * height - 5
else:
recommended_calories = 10 * weight + 6.25 * height - 161
return f"권장 칼로리 양: {recommended_calories} Kcal"
# 예시로 함수 호출
height = 170 # 키 (cm)
weight = 60 # 몸무게 (kg)
gender = 'Male' # 성별 ('male' 또는 'female')
result = calculate_recommended_calories(height, weight, gender)
print(result)
VS code 디버깅 시작 방법 1
Termianl 메뉴 -> Start Debugging을 클릭합니다. (혹은 F5키 입력)
원하는 언어의 디버거를 선택합니다. 저는 python 코드에서 시작했으므로 Python Debugger를 선택했습니다.
왼쪽 패널에 Debug 패널이 열린 것을 확인 할 수 있습니다.
VS code 디버깅 시작 방법 2
왼쪽 메뉴에서 벌레 모양이 있는 아이콘을 클릭해서 디버거 패널을 바로 실행할 수도 있습니다.
VS code 디버깅 시작 방법 3
우상단의 재생 버튼 옆의 드랍다운 버튼을 클릭하면 추가 메뉴가 나오는데 여기서 Python Debugger:Debug Python File 메뉴를 클릭합니다.
해당 방법은 디버거 패널을 열면서 동시에 디버깅도 바로 실시합니다.
중단점 (break point) 잡고 디버깅하기
코드의 라인 왼쪽에 마우스를 올리면 빨간 점을 만들 수 있는 것이 보입니다.
해당 라인을 클릭하면 빨간점이 생기면서 중단점이 생기는데요.
우선은 중단점 직전까지만 실행을 하겠다는 의미입니다.
중단점을 만들고 디버깅을 실행하면 왼쪽 패널 (주황색 하이라이트)에 새로운 정보가 생기는 것을 확인 할 수 있습니다.
그리고 중단점 라인에는 노란색 하이라이트가 쳐지는 것을 볼 수 있습니다.
왼쪽 패널 중에 VARIABLES 패널을 보면 지역변수와 전역변수가 어떻게 되는지 확인 할 수 있습니다.
함수가 복잡해지고 함수 내에 함수가 있는 경우 스코프를 생각하지 않고 코딩을 하면 여기서도 오류가 발생할 수 있습니다.
이때 print로 어렵게 디버깅 하지 않고 이 VARIABLES 패널을 보고 디버깅을 할 수 있습니다.
VARIABLES의 변수 값을 변경해가면서 차례로 코드를 실행했을 때 변수들이 어떻게 바뀌는지를 손쉽게 확인 할 수 있습니다.
중단점을 기준으로 순서대로 한 줄씩 실행하기
디버깅을 시작하면 아래와 같은 새로운 창이 상단에 뜨는 것도 확인 할 수 있는데요.
각 기능은 다음과 같습니다
Continue (F5) | 프로그램을 다음 중단점이나 끝까지 실행합니다. 계속 진행합니다. |
Step Over (F10) | 현재 실행 중인 함수나 메소드를 한 번에 실행하고 중지합니다. 함수 내부로 진입하지 않습니다. |
Step Into (F11) | 현재 실행 중인 함수나 메소드로 진입하여 그 안에서 코드를 실행하고 중지합니다. |
Step Out (Shift + F11) | 현재 함수나 메소드의 나머지 부분을 실행하고 중지합니다. 현재 함수를 완전히 벗어납니다. |
Restart (Ctrl + Shift + F5) | 디버깅 세션을 재시작합니다. 모든 상태가 초기화되고 프로그램이 처음부터 다시 실행됩니다. |
Stop (Shift + F5) | 디버깅 세션을 중지하고 프로그램 실행을 종료합니다. |
Continue : 다음 중단점까지 실행 후 중단
각 기능들을 테스트 하기 위해서 다른 예제 코드를 가져와 봤습니다.
def add_numbers(a, b):
result = a + b
return result
def multiply_numbers(x, y):
result = x * y
return result
def main():
num1 = 5
num2 = 3
sum_result = add_numbers(num1, num2)
product_result = multiply_numbers(sum_result, 2)
print(product_result)
main()
위 코드에서 12,13번 코드에 중단점을 만들고 디버깅을 우선 실시합니다.
continue 를 선택하면 그 다음 중단점 전(12라인) 까지 실행이 되면서, sum_result
변수의 값이 VARIABLE에 나온 것을 확인 할 수 있습니다.
continue를 한 번 더 클릭하면 그 다음 중단점이 없기 때문에 디버깅이 종료 됩니다.
Step Over : 함수 내부로 들어가지 않고 다음 코드를 실행 후 중단
다시 디버깅을 시작해서 Step Over키를 누르면, 중단점의 바로 다음 라인 코드까지 실행을 합니다.
이때 함수나 메소드가 있으면 함수나 메소드 내부로 들어가지는 않고 함수를 실행한 결과까지 진행이 됩니다. (함수 내부로 들어가는 건 Step In)
이전 라인에서 반환 값이 무엇이었으며 sum_result
변수에는 무엇이 할당 되었는지 까지 설명해줍니다.
한번 더 step over를 누르면 이전 라인에서 어떤 함수가 실행 되어서 반환 되었고 어떤 변수에 어떤 값이 할당되었는지 보여줍니다.
한번 더 step over를 누르면 코드 실행이 완료되면서 디버깅이 절차가 끝납니다.
Step Into : 함수로 진입하여 한 줄 실행 후 중단
디버깅을 실시하고 step into를 누르면 실행 중인 함수나 메소드로 진입하여 그 안에서 코드를 실행하고 중단합니다.
예제 코드에서는 add_numbers()
함수에서 중단점이 있었고 step into를 하면서 add_number()
내부로 들어가서 코드가 실행된 것을 확인 할 수 있습니다.
Locals variable로 add_numbers()
함수 스코프의 변수들 (a,b)로 바뀐 것을 확인 할 수 있습니다.
한번 더 step into를 누르면 add_number()
함수 내에서 다음 줄까지 실행되는 것을 확인 할 수 있습니다.
한번 더 step into 시, add_numbers()
함수가 모두 실행이 되었기 때문에 main()
함수로 돌아가 스코프가 변경된 것을 확인 할 수 있습니다.
add_numbers()
함수의 반환값이 VARIABLES에 추가된 것을 확인 할 수 있습니다.
Step Out : 현재 함수를 모두 실행 후 벗어나서 중단
그 다음 step into를 누르면 동일하게 실행 중이 함수로 들어가 한 줄 한 줄 실행 후 중단되는 과정이 진행됩니다.
step out 과정은 실행 중인 내부 함수를 확인하다가 다시 함수를 빠져나가고 싶을 때 사용합니다.
아래 그림을 보시면 step into에서 함수 내부에서 한 줄을 실행 한 다음 step out 버튼을 누르니 내부 함수의 다음 줄에서 멈추지 않고 내부 함수를 모두 실행하고 외부로 빠져나간 후 실행이 중단 된 것을 확인 할 수 있습니다.
restart와 stop은 말 그대로 처음 중단점까지만 다시 실행을 하거나, 디버깅 과정을 멈추는 기능입니다.
WATCH 패널 : 특정 변수 트래킹 하기
변수가 많을 경우에는 사용자가 원하는 특정 변수만 트랙킹 할 수 있도록 하는 것이 WATCH 패널 입니다.
WATCH 패널을 클릭해서 나오는 + 버튼을 누르거나 WATCH 패널을 더블 클릭하면 사용자가 보고자하는 변수를 입력할 수 있습니다.
CALL STACK : 코드 실행의 흐름 파악하기
CALL STACK 패널은 코드 실행의 흐름을 시각적으로 보여주는 중요한 도구입니다.
CALL STACK은 현재 실행 중인 함수들의 계층 구조를 표시하여 각 함수 호출의 흐름을 파악할 수 있게 도와줍니다.
CALL STACK 패널은 현재 실행 중인 함수들의 목록을 제공합니다.
맨 위에 있는 함수가 현재 실행 중인 함수이며, 아래에 있는 함수들은 그것을 호출한 함수들입니다.
CALL STACK을 설명하게 위해 새로운 코드 예제를 확인해보세요
def main():
result = calculate_square(5)
print_result(result)
def calculate_square(number):
squared = square(number)
return squared
def square(num):
result = num ** 2
return result
def print_result(value):
print(f"The result is: {value}")
main()
2번 라인에 중단점을 잡고 코드를 한줄 씩 실행할 때 마다 해당 코드의 함수 흐름이 어떤지 한눈에 파악할 수 있는 것을 확인할 수 있습니다.