한 단계가 소스 한 줄은 아니다
디버깅 화면에서 한 번 눌렀는데 같은 소스 줄에 머물러 있거나 주소만 조금 바뀌면 동작이 멈춘 것으로 오해하기 쉽습니다. DBG Desk의 F7과 F8은 소스 줄이 아니라 기계 명령어 단위로 실행합니다. total += value 같은 한 줄도 메모리에서 값을 읽고 레지스터에서 계산한 뒤 다시 저장하는 여러 단계가 필요할 수 있습니다. 반대로 컴파일러 최적화가 적용되면 여러 소스 표현이 하나의 명령어로 합쳐질 수 있습니다. 현재 위치를 판단할 때는 줄 번호만 보지 말고 프로그램 카운터 주소와 디스어셈블리의 현재 행을 기준으로 삼으세요.
함수 내부를 볼 때는 Step into
Step into는 다음 명령어를 실행합니다. 현재 명령어가 함수 호출이라면 호출된 함수의 첫 실행 위치로 들어갈 수 있습니다. 계산 함수의 입력이 맞는데 출력이 틀릴 때 그 안을 조사하는 데 적합합니다. 다만 프로그램을 처음부터 F7만 눌러 따라가면 시작 코드와 표준 라이브러리 내부를 오래 보게 됩니다. 이때 함수 이름을 모른다는 이유만으로 문제가 있는 것은 아닙니다. 먼저 관심 있는 사용자 함수에 중단점을 두고 그 지점까지 실행한 다음, 확인할 계산만 단계 실행하는 편이 좋습니다. 심볼이 없으면 주소와 명령어를 중심으로 이동을 해석해야 합니다.
호출 결과만 필요할 때는 Step over
Step over는 현재 위치의 함수 호출을 내부까지 따라가지 않고 호출 이후로 진행하도록 요청합니다. 함수가 즉시 끝난다는 뜻은 아니며, 실제로는 그 함수가 정상적으로 반환해야 다음 위치에 도착합니다. 호출된 함수가 입력을 기다리거나 무한 반복에 빠지면 Step over도 오래 끝나지 않을 수 있습니다. 또한 다른 중단점이나 신호가 발생하면 예상한 다음 명령어보다 먼저 멈출 수 있습니다. 외부 라이브러리를 일단 정상으로 가정하고 자신의 코드 흐름을 보려는 때에 유용하지만, 반환값이 틀리다는 단서가 나오면 해당 호출 내부를 다시 조사해야 합니다.
함수에서 나올 때는 Step out
Step out은 현재 함수를 마치고 호출한 곳으로 돌아가도록 실행합니다. 실수로 깊은 함수에 들어갔거나 현재 함수의 반환 이후를 보고 싶을 때 사용합니다. 이 기능도 단순히 화면만 위로 이동하는 것이 아니라 프로그램을 실제로 실행하므로 파일 쓰기나 네트워크 요청 같은 부수 효과가 발생할 수 있습니다. 호출 스택에서 상위 프레임을 눈으로 확인하는 것과 구분해야 합니다. 디버깅을 연습할 때는 작은 함수 하나에 들어가 입력을 확인하고, F8로 계산을 지나간 다음 Step out으로 반환 위치를 보는 순서를 반복해 보세요. 실행 제어와 스택의 관계를 익히기 좋습니다.
단계 실행을 비교하는 연습
같은 함수 호출 직전에서 두 세션을 비교해 보세요. 첫 세션은 F7로 들어가 호출 스택에 함수가 추가되는지 보고, 두 번째 세션은 F8로 호출을 넘긴 뒤 돌아온 주소를 확인합니다. 어느 쪽도 코드를 건너뛰어 실행하지 않는 것은 아닙니다. 내부 관찰의 범위가 달라질 뿐 실제 계산은 수행됩니다. 반환 후 합계가 같다면 두 경로의 관찰 결과가 일치한 것입니다. 출력이나 파일 기록처럼 되돌리기 어려운 동작이 포함된 프로그램에서는 이 연습을 작은 복사본으로 하는 편이 좋습니다. 한 번 실행한 작업을 단순히 이전 화면으로 돌아가 취소할 수 있다고 생각하지 마세요.
stepi # Step into
nexti # Step over
finish # Step out