[TOOL-007][중급] 중단점으로 변수 변화를 따라가기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[TOOL-007][중급] 중단점으로 변수 변화를 따라가기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 148회 작성일 26-09-02 10:34

본문

[이번 수업]
오류 메시지가 없는데 결과가 틀릴 때는 실행 중인 값을 직접 보는 것이 빠릅니다. 이번에는 디버거(debugger, 프로그램을 잠시 멈추고 상태를 살피는 도구), 중단점, 한 줄 실행, 변수 관찰을 Python 기본 디버거 `pdb`로 연습합니다.

[선수지식]
TOOL-002의 터미널 사용법과 Python 함수·변수를 알고 있어야 합니다. 코드 편집기에서 파일을 저장하고 실행할 수 있으면 됩니다.

[학습목표]
1. 중단점과 호출 스택의 역할을 설명한다.
2. `p`, `next`, `step`, `continue` 명령을 구분한다.
3. 관찰한 변수로 계산 오류의 원인을 찾고 수정한다.

[핵심개념]
디버거는 프로그램 실행을 제어하면서 현재 줄, 변수, 함수 호출 관계를 보여 줍니다. 중단점(breakpoint)은 실행을 멈추기로 정한 위치입니다. 멈춘 순간의 함수 호출 경로를 호출 스택이라 하고, 각 함수의 지역 변수와 인자를 담은 단위를 스택 프레임이라고 합니다. 오류가 어디서 시작되어 어떤 함수를 거쳤는지 함께 볼 수 있습니다.

`next`는 현재 함수 안의 다음 줄까지 실행하며 호출한 함수 내부는 건너뜁니다. `step`은 호출한 함수 안으로 들어갈 수 있습니다. `p 식`은 현재 프레임에서 식을 계산해 출력하고, `where`는 호출 스택, `list`는 주변 소스, `continue`는 다음 중단점까지 실행합니다. IDE의 줄 중단점·변수 창·호출 스택 창도 같은 개념을 화면으로 제공합니다.

좋은 디버깅은 “왜 틀렸지?” 대신 “20%가 0.2로 변환됐을까?”처럼 확인 가능한 가설을 세웁니다. 중단점에서 입력 → 중간값 → 결과 순으로 관찰하고, 원인이 확인되면 한 곳만 고쳐 같은 입력으로 다시 실행합니다. 여러 줄을 동시에 고치면 무엇이 해결했는지 알기 어렵습니다.

[따라하기]
아래 내용을 debug_demo.py로 저장합니다. `//`는 나눗셈의 몫만 남기므로 일부러 넣은 오류입니다.

```python
def discounted_total(prices, rate_percent):
    subtotal = sum(prices)
    rate = rate_percent // 100
    result = subtotal - subtotal * rate
    breakpoint()
    return result

amount = discounted_total([12000, 8000], 20)
print("할인 후 금액:", int(amount))
```

macOS·Linux에서는 `python3 debug_demo.py`, Windows PowerShell에서는 보통 `python debug_demo.py`로 실행합니다. `(Pdb)` 프롬프트가 보이면 다음 명령을 한 줄씩 입력합니다.

```text
p subtotal
p rate
p result
where
list
c
```

핵심 출력은 `subtotal`이 20000, `rate`가 0, `result`가 20000이라는 점입니다. 파일 경로와 줄 번호는 환경마다 달라질 수 있습니다. `c`는 `continue`의 줄임말이며 최종 출력은 `할인 후 금액: 20000`입니다. 원인은 `20 // 100`이 0이 되는 것입니다. `//`를 `/`로 바꾸고 다시 실행하면 `rate`는 0.2, `result`와 최종 금액은 16000이 됩니다.

코드에 중단점을 넣기 싫다면 macOS·Linux에서 `python3 -m pdb debug_demo.py`, Windows에서 `python -m pdb debug_demo.py`로 시작할 수도 있습니다. 이때는 첫 줄에서 멈추므로 `break discounted_total` 뒤 `continue`로 함수 진입 지점을 잡습니다.

[흔한 실수]
- 멈춘 줄은 아직 실행 전일 수 있는데 실행 후 값으로 착각한다. 현재 줄 표시를 확인합니다.
- 함수 내부가 궁금한데 `next`만 사용한다. 그때는 `step`을 씁니다.
- 디버거에서 값을 바꾼 뒤 그것을 실제 수정으로 착각한다. 소스 파일을 고쳐 재실행해야 합니다.
- 중단점 여러 개를 무작정 만들고 어떤 가설을 확인하는지 기록하지 않는다.

[보안 주의]
디버거는 현재 프로세스의 변수와 객체를 볼 수 있으므로 비밀번호, 토큰, 개인정보가 든 운영 환경에 함부로 연결하지 마세요. 본인 소유의 로컬·격리 환경과 가짜 데이터만 사용합니다. 배포 전 `breakpoint()`를 제거하고, 서버가 중단점에서 멈춰 요청을 쌓지 않도록 점검합니다. 디버거 콘솔은 Python 식을 실행할 수 있으므로 출처를 모르는 명령을 붙여 넣지 않습니다.

[직접 해볼 과제]
가격을 `[5000, 15000]`, 할인율을 25로 바꾸고 수정 전·후의 `rate`와 `result`를 예상하세요. 중단점에서 `p type(rate)`도 실행해 값과 자료형을 기록한 뒤 실제 결과와 비교합니다.

[확인문제]
1. 중단점은 프로그램 실행에 어떤 일을 하나요?
2. `next`와 `step`의 차이는 무엇인가요?
3. 디버거에서 본 변수값만 바꾸고 소스를 수정하지 않으면 왜 해결이 아닌가요?

[다음 학습]
다음 PY-007에서는 예외를 처리하고 로그로 실행 상황을 남기는 방법을 배웁니다.

[공식 참고 자료]
- Python pdb 디버거: https://docs.python.org/3/library/pdb.html
- Python breakpoint 함수: https://docs.python.org/3/library/functions.html#breakpoint
- Visual Studio Code 디버깅: https://code.visualstudio.com/docs/debugtest/debugging
- Visual Studio Code Python 디버깅: https://code.visualstudio.com/docs/python/debugging

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,058
어제
6,862
최대
16,772
전체
770,009
Copyright © 소유하신 도메인. All rights reserved.