Trace32로 디버깅을 하다 보면 처음에는 자연스럽게 Step 버튼을 누르게 된다.
코드를 한 줄씩 따라가면 흐름을 이해할 수 있을 것처럼 보이기 때문이다.
하지만 실제로 몇 번만 사용해 보면 금방 이상한 느낌이 든다.
분명히 “한 줄씩 보려고” Step을 눌렀는데,
어느 순간부터는 코드가 아니라 함수 내부를 계속 따라가고 있는 상황이 된다.
원래 보고 싶었던 흐름은 사라지고, 전혀 관심 없던 함수 안에서 한 줄씩 디버깅을 하고 있게 된다.
이 지점에서 대부분 이렇게 생각한다.
“한 줄만 실행하고 다음 줄로 가고 싶은데, 왜 계속 들어가지?”
이 문제의 원인은 Step 자체가 잘못된 게 아니라, Step의 동작 방식을 정확히 모르기 때문이다.

Step은 "실행 흐름을 그대로 따라가는 명령"이다.
Step은 단순히 “한 줄 실행”이 아니다.
Step은 CPU가 실제로 실행하는 흐름을 그대로 따라간다.
예시 코드
void Main(void)
{
Init();
Control();
}
이 코드에서 Init(); 줄에 멈춰 있다고 가정해보자.
여기서 Step을 누르면 어떻게 될까?
많은 사람들이 “다음 줄로 가겠지”라고 생각하지만, 실제로는 그렇지 않다.
CPU 입장에서는 다음 동작이 “함수 호출”이다.
그래서 Init() 함수 내부로 들어간다.
즉, Step은
함수 호출이면 함수 안으로 들어가고,
분기문이면 분기 경로를 따라가고,
반복문이면 반복 흐름을 그대로 따라간다.
말 그대로 “실행되는 그대로 따라간다”
그래서 문제가 생긴다
이 동작 방식은 정확하지만, 디버깅 관점에서는 오히려 불편해지는 경우가 많다.
왜냐하면 우리가 항상 원하는 건 “실행 흐름 그대로”가 아니기 때문이다.
예를 들어 이런 상황을 보자.
void Main(void)
{
Init(); // 이미 검증된 함수
Control(); // 여기 흐름을 보고 싶음
}
여기서 우리가 알고 싶은 건 Control()의 동작이다.
하지만 Step을 사용하면 Init() 내부로 들어가 버린다.
이미 문제가 없는 코드인데도 불필요하게 내부를 계속 따라가게 된다.
이것이 Step만 계속 사용할 때 디버깅이 비효율적으로 되는 이유다.
Over는 “한 줄을 하나의 단위로 실행한다”
이 문제를 해결하는 것이 Over다.
Over는 Step과 비슷해 보이지만, 동작 기준이 완전히 다르다.
Over는 “현재 줄 전체를 하나의 단위로 실행한다”
같은 코드에서 다시 보자.
void Main(void)
{
Init();
Control();
}
Init(); 줄에서 Over를 누르면 함수 내부로 들어가지 않는다.
Init() 전체를 한 번에 실행하고, 다음 줄로 이동한다.
이걸 다르게 표현하면 이렇게 된다.
Step → 함수 내부까지 실제 실행 흐름을 따라간다.
Over → 함수 호출을 하나의 동작으로 처리하고 다음 줄로 이동한다.
왜 이 차이가 중요한가
이 차이를 이해하지 못하면, 디버깅 방식 자체가 비효율적으로 변한다.
Step만 계속 사용하면 불필요하게 함수 내부로 진입하게 되고,
디버깅 시간이 길어지며, 전체 흐름을 놓치는 상황이 반복된다.
반대로 Over를 적절히 사용하면 함수 내부로 불필요하게 들어가지 않으면서도
전체 흐름을 유지할 수 있고, 필요한 부분에만 집중할 수 있다.
결과적으로 디버깅 속도와 분석 효율이 눈에 띄게 달라진다.
실무에서 사용하는 방식
실제 디버깅에서는 Step과 Over를 따로 쓰지 않는다.
상황에 따라 섞어서 사용한다
처음에는 Over로 전체 흐름을 따라간다.
이렇게 하면 코드가 어떻게 흘러가는지 빠르게 파악할 수 있다.
그리고 특정 지점에서 이상이 보이면 그때 Step으로 들어간다
이 방식이 중요한 이유는 하나다.
“필요할 때만 깊게 들어간다”
흐름으로 보면 이렇게 된다
디버깅은 보통 다음과 같은 흐름으로 진행된다.
1. Over로 전체 흐름 확인
2. 이상한 지점 발견
3. Step으로 내부 진입
4. 문제 원인 분석
이 흐름이 익숙해지면 디버깅이 훨씬 빠르고 정확해진다.
정리
Step과 Over는 단순히 버튼 두 개가 아니라, 디버깅의 깊이를 조절하는 도구다.
Step은 “실행 흐름을 그대로 따라가는 것”이고,
Over는 “한 줄을 하나의 단위로 처리하는 것”이다.
Step은 실행 흐름 안으로 들어가는 것이고,
Over는 흐름을 유지한 채 필요한 부분만 건너뛰는 것이다.
'Trace32' 카테고리의 다른 글
| [Trace32] Call Stack 제대로 읽는 방법 (실제 흐름으로 이해하기) (0) | 2026.05.05 |
|---|---|
| [Trace32] 자주 사용하는 명령어 10개 (실무에서 바로 쓰는 것만) (0) | 2026.05.04 |
| [Trace32] 조건부 Breakpoint 제대로 쓰는 방법 (Change Breakpoint 창 실무 활용) (0) | 2026.05.04 |
| [Trace32] 코드 원하는 위치에서 정확히 멈추는 방법 (Breakpoint 실무 사용법) (1) | 2026.05.03 |
| [Trace32] 상단 아이콘을 '순서'로 이해하기 (CPU 제어 흐름으로 보는 UI) (0) | 2026.05.03 |