실패한 줄보다 값이 바뀌는 경계 찾기
프로그램이 잘못된 값을 출력했다고 해서 출력 함수에만 중단점을 두면 원인이 이미 지나간 뒤일 수 있습니다. 예를 들어 합계가 예상보다 크다면 합계를 출력하는 지점과 값을 더하는 지점을 나눠 봅니다. 먼저 출력 직전에서 실제 결과를 확인한 다음, 계산을 시작하는 함수의 입구에 중단점을 둡니다. 이 위치에서 이미 입력이 틀렸다면 호출한 쪽으로 올라가고, 입력은 맞는데 반환값이 틀리면 함수 내부로 들어갑니다. 중단점은 코드를 많이 보는 수단이 아니라 잘못된 값이 처음 나타나는 구간을 좁히는 기준선으로 쓰는 편이 좋습니다.
위치를 지정하는 세 가지 방법
함수명 중단점은 main이나 accumulate처럼 읽기 쉽고 빌드를 다시 해도 의미를 유지하기 좋습니다. 소스 줄 중단점은 counter.c:10처럼 원하는 계산 근처를 지정할 때 편합니다. 다만 실제 명령어가 없는 빈 줄이나 선언 줄에 걸면 GDB가 가까운 실행 위치로 조정할 수 있습니다. 주소 중단점은 *0x140001000처럼 별표와 주소를 함께 적습니다. 심볼이 없을 때 유용하지만 프로세스를 다시 실행하거나 빌드를 바꾸면 같은 숫자가 같은 명령어를 가리킨다고 보장할 수 없습니다. 주소를 적기 전에 현재 세션의 모듈과 명령어를 확인해야 합니다.
많이 멈추는 지점은 질문을 바꾸기
반복문의 내부에 중단점을 두면 수천 번 멈출 수 있습니다. 이때 매번 계속 실행 버튼만 누르기보다 무엇을 확인하려는지 다시 정하는 것이 빠릅니다. 처음부터 잘못되는지, 특정 입력에서만 틀리는지, 함수가 호출되는 횟수 자체가 이상한지를 구분하세요. DBG Desk의 현재 화면은 기본 중단점 추가와 삭제를 지원하며 조건식과 적중 횟수를 편집하는 UI는 없습니다. 조건부 중단점이 필요한 상황은 별도 GDB 세션에서 확인하거나 재현 입력을 작게 만드는 방법으로 접근할 수 있습니다. 화면에 없는 기능을 찾느라 시간을 쓰기보다 현재 가능한 관찰 범위를 알고 시작하세요.
정지 결과로 다음 위치 결정하기
중단점에 도달했다면 단순히 멈췄다는 사실뿐 아니라 현재 함수, 호출 스택, 인수와 관련된 레지스터를 함께 확인합니다. 같은 함수라도 호출한 경로가 다르면 입력과 전제가 달라질 수 있습니다. 첫 관찰이 끝나면 필요 없는 중단점을 지워 다음 정지의 의미를 분명하게 만드세요. 중단점이 여러 개 남아 있으면 실행이 어디에서 멈출지 헷갈리고 이전 가설을 계속 따라가기 쉽습니다. 정상 입력과 실패 입력을 각각 같은 지점에서 비교하면 차이가 처음 나타나는 단계가 보입니다. 그 차이가 확인된 구간 안쪽으로 다음 중단점을 옮기면 됩니다.
합계 오류를 좁히는 예
counter 예제의 합계가 35가 아니라면 accumulate에 들어갈 때와 나온 뒤를 나눠 봅니다. 첫 입력이 0인데 반환 결과가 1이면 첫 계산은 예상과 같습니다. 다음 호출의 입력이 1인지, 반환한 4가 합계에 한 번만 더해지는지 확인하면 계산 함수와 반복문의 책임을 구분할 수 있습니다. 함수가 한 번 더 호출된다면 함수 내부의 곱셈보다 반복 조건을 먼저 조사합니다. 반대로 호출 횟수와 입력은 맞는데 반환값만 다르면 계산 명령어로 들어갑니다. 이처럼 중단점 하나마다 확인할 기대값을 적어 두면 숫자가 달라졌다는 막연한 느낌 대신 어느 경계에서 전제가 깨졌는지 설명할 수 있습니다.