예를 들어 “퀘스트를 깼는데 업적 점수가 안 오른다” 같은 버그가 올라오면,
모든 퀘스트/업적 코드를 전부 읽는 게 아니라, 업적이 갱신되는 지점(또는 의심 구간)에 중단점을 걸고
“정말 그 경로로 들어오는지, 변수 값이 무엇인지”를 먼저 확인합니다.
| 조작 | 방법 |
|---|---|
| 설정/해제 | 줄 왼쪽 회색 여백 클릭 또는 F9 |
| 표시 | 빨간 동그라미 |
주의: “실행 줄을 강제로 옮기는 기능(Set Next Statement)”은 강력하지만,
프로그램 상태를 비정상으로 만들 수 있어 마지막 수단으로만 쓰는 게 안전합니다.
hp <= 0 → 죽는 순간에만 정지추가로 자주 쓰는 옵션들:
| 창 | 역할 |
|---|---|
| 로컬 | 현재 함수에 선언된 변수들의 값 자동 표시 |
| 조사식 | hp + 200, (hp > 50) ? "OK" : "FAIL" 등 수식 입력 가능 |
hp + 200이 정말 210이 맞는지 확인(hp <= 0)가 지금 참인지 확인팁:
| 단축키 | 동작 |
|---|---|
| F5 (Continue) | 다음 중단점까지 계속 실행 |
| F10 (Step Over) | 현재 줄 실행, 함수 안으로 들어가지 않음 |
| F11 (Step Into) | 함수 내부로 진입 |
| Shift+F11 | 현재 함수 끝까지 실행 후 호출 지점으로 복귀 |
| Ctrl+F10 | Run to Cursor (커서 위치까지 실행) |
| Ctrl+Shift+F5 | Restart (디버깅 재시작) |
| Shift+F5 | Stop (디버깅 중지) |
| Ctrl+F5 | Start Without Debugging (디버깅 없이 실행) |
핵심 정리:
Ctrl+F5는 “중단점 무시”가 아니라 디버깅 자체를 붙이지 않고 실행입니다.
디버깅을 붙여서(F5) 실행해야 브레이크포인트/콜스택/워치가 제대로 동작합니다.
GameCoding.exe!Test3() 줄 16
GameCoding.exe!Test2() 줄 12
GameCoding.exe!Test() 줄 8
GameCoding.exe!main() 줄 29멈추면 흐름이 깨지거나(실시간 게임 루프), 너무 자주 멈추는 구간이라면 “멈추지 않는 중단점”을 씁니다.
예:
"EnterBattle: hp={hp}, damage={damage}"이 방식은 “코드가 지나가긴 하는지/몇 번 지나가는지/변수 값이 어떻게 변하는지”를 추적할 때 매우 유용합니다.
C++은 메모리/수명(스택/힙) 실수로 크래시가 자주 나기 때문에,
“스택 프레임/호출 스택/수명”을 이해한 디버깅이 특히 강력합니다.
목표: “복사 전달” 때문에 원본이 안 바뀐다는 걸 눈이 아니라 증거(값/콜스택)로 확인합니다.
void AddHp(int hp, int value)
{
hp += value;
}
int main()
{
int hp = 100;
AddHp(hp, 20);
return 0;
}
step-by-step:
AddHp(hp, 20); 줄에 브레이크포인트(F9)hp를 Locals에서 확인 (100)AddHp 내부로 들어가기hp += value; 실행 전/후로 hp 값을 확인main으로 복귀 후, hp가 여전히 100임을 확인핵심 질문:
AddHp 안의 hp는 “main의 hp”인가, 아니면 “복사본”인가?목표: 반복 루프에서 “원하는 순간”에만 멈추는 감각을 익힙니다.
int main()
{
int hp = 100;
for (int i = 0; i < 10; i++)
{
hp -= 13;
// 여기에서 "hp <= 0"일 때만 멈추게 만들기
}
return 0;
}
step-by-step:
hp <= 0i, hp를 올려서 “몇 번째 반복에서 죽는지” 확인목표: “멈추면 흐름이 깨지는 구간(루프)”에서, 로그로만 추적하는 방법을 익힙니다.
int main()
{
int hp = 100;
for (int i = 0; i < 5; i++)
{
hp -= 7;
// 여기: i와 hp를 출력 창에 찍되, 멈추지 않게 설정
}
return 0;
}
설정 힌트:
i={i}, hp={hp}