JJANG-JOON
article thumbnail
Published 2023. 8. 8. 16:15
[C] gdb 를 이용한 디버깅 언어/C
반응형

 

디버깅

C 언어 코드를 디버깅하는 과정은 코드 내에 발생하는 오류나 버그를 찾아내고 수정하는 과정을 자세히 보여주며  디버깅은 프로그램이 원하는 대로 동작하지 않을 때 유용하며, 이를 통해 코드의 동작을 분석하고 수정할 수 있다.

아래는 C 언어 코드를 디버깅하는 과정과 예시를 설명한 것이다.

 

 

디버깅 과정:

  1. 버그 발견: 먼저 프로그램이 원하는 대로 동작하지 않는 부분을 발견한다. 이는 예상치 못한 동작, 오류 메시지, 크래시 등으로 나타날 수 있다.
  2. 버그 재현: 버그를 재현하기 위해 조건을 특정하거나 입력을 조작한다. 버그가 발생하는 조건을 명확히 이해하는 것이 중요하다.
  3. 디버깅 환경 설정: 코드를 실행하면서 디버깅을 도와주는 도구를 사용하기 위해 디버거를 활성화한다. 대표적인 C 언어 디버거로는 GDB가 있다.
  4. 중단점 설정: 중단점을 코드 내에 설정하여 프로그램 실행을 일시 정지시킨다. 중단점은 특정 라인이나 함수에 설정할 수 있으며, 해당 지점에서 변수의 값을 확인하거나 코드의 흐름을 추적할 수 있다.
  5. 변수 및 상태 확인: 중단점에서 프로그램 실행이 멈추면 변수의 값을 확인하고 예상치 못한 값이나 상태를 파악한다. 이를 통해 문제가 어디서 발생했는지 추적할 수 있다.
  6. 단계별 실행: 디버거를 사용하여 코드를 한 단계씩 실행하면서 프로그램의 흐름을 따라가고 변수의 값 변화를 관찰한다. 이를 통해 어떤 부분에서 버그가 발생하는지를 찾을 수 있다.
  7. 로그 및 출력 확인: 출력문이나 로그를 추가하여 코드의 실행 경로를 추적하고, 어떤 부분에서 문제가 발생하는지 파악한다.
  8. 원인 분석: 버그의 원인을 추론하고, 코드에서 논리적이거나 문법적인 오류를 찾는다.
  9. 버그 수정: 발견한 버그의 원인을 해결하기 위해 코드를 수정하고, 수정된 코드가 의도한대로 동작하는지 확인한다.
  10. 테스트: 수정한 코드로 프로그램을 다시 실행하고, 버그가 제대로 수정되었는지 확인하고 추가적인 테스트 케이스를 사용하여 코드의 안정성을 검증한다.

예시:

가령, 다음은 정수 배열에서 최대값을 찾는 함수에 버그가 있는 예시 코드이다.

 

#include <stdio.h>

int findMax(int arr[], int size) {
    int max;
    for (int i = 0; i <= size; i++) {  // 버그: i <= size
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

int main() {
    int numbers[] = {3, 8, 2, 10, 5};
    int maxNum = findMax(numbers, 5);
    printf("Max: %d\n", maxNum);
    return 0;
}

 

 

이 코드에서는 findMax 함수에서 최대값을 찾아야 하지만, 버그로 인해 올바른 결과가 나오지 않을 수 있다.

디버깅을 수행하여 이 문제를 해결해보겠다.

  1. 버그 발견: findMax 함수가 항상 0을 반환하는 것을 발견한다.
  2. 버그 재현: findMax 함수에 전달되는 배열을 확인하고, 배열의 크기도 확인해본다.
  3. 디버거 설정: GDB 같은 디버거를 사용하여 코드를 실행할 수 있는 환경을 설정한다.
  4. 중단점 설정: findMax 함수 내부에 중단점을 설정하여 변수 값을 확인하고 코드를 단계별로 실행해본다.
  5. 변수 및 상태 확인: 중단점에서 arr 배열과 max 변수의 값을 확인합니다. 초기 max 값을 설정해주는 부분을 놓친 것을 발견한다.
  6. 단계별 실행: 코드를 한 단계씩 실행하면서 max 변수의 값이 어떻게 변하는지 확인한다.
  7. 로그 및 출력 확인: 필요한 경우 printf 문을 추가하여 코드의 실행 경로를 확인한다.
  8. 원인 분석: max 변수가 초기화되지 않아서 최대값을 비교하는 부분에서 문제가 발생했음을 파악한다.
  9. 버그 수정: findMax 함수 내부에서 max 변수를 초기값으로 설정하는 코드를 추가한다.
  10. 테스트: 수정된 코드로 다시 실행해보고, 올바른 최대값이 출력되는지 확인한다.

 

 

GDB 사용법

위에서 말한 GDB가 뭔지 와 사용법에 대해 알아보겠다.

 

GDB는 GNU Debugger의 약자로, 프로그램의 실행을 추적하고 디버깅하는 데 사용되는 강력한 명령줄 디버깅 도구이다.

아래에서 GDB를 사용하여 중단점을 설정하고 코드를 단계별로 실행하는 방법을 설명해보겠다.

 

중단점 설정과 단계별 코드 실행하기:

 

1. GDB 실행: 터미널에서 프로그램을 컴파일한 뒤, GDB로 실행한다.

gcc -g -o my_program my_program.c
gdb my_program

여기서 -g 플래그는 디버그 정보를 컴파일된 실행 파일에 포함시키는 역할을 한다.

 

2. 중단점 설정: 디버거에서 중단점을 설정합니다. 중단점은 특정 라인 번호나 함수 이름에 설정할 수 있다. 예를 들어, findMax 함수 내부의 첫 줄에 중단점을 설정하려면 다음과 같이 입력한다.

break findMax

만약 특정 라인 번호에 중단점을 설정하려면 다음과 같이 입력한다.

break 파일명:라인번호

 

3. 코드 실행: 중단점을 설정한 후 run 명령을 입력하여 프로그램을 실행한다.

run

4. 단계별 코드 실행: 프로그램이 중단점에 도달하면, 다음과 같은 명령으로 코드를 단계별로 실행한다.

  • step 또는 s: 한 단계씩 코드를 실행하고 함수 내부로 들어간다.
  • next 또는 n: 한 단계씩 코드를 실행하며, 함수 내부로 들어가지 않는다.
  • continue 또는 c: 중단점까지 코드를 실행하고, 다음 중단점까지 실행한다.

단계별 실행 중에 변수의 값을 확인하거나 상태를 파악할 수 있다.

 

5. 변수 확인: 실행 중에 변수의 값을 확인하려면 print 또는 p 명령을 사용한다.

 

print 변수명

 

예를 들어, 위에서 언급한 예시 코드에서 findMax 함수 내부에서 중단점을 설정하고 코드를 단계별로 실행하면 다음과 같이 GDB를 사용할 수 있다:

 

1.GDB 실행 후 중단점 설정:

break findMax

2. 프로그램 실행:

run

3. step 명령을 사용하여 함수 내부로 진입하고, 변수 값을 확인:

step
print arr
print max

4.나머지 단계별 실행 및 변수 확인:

step
print arr
print max
step
...

 

위의 과정을 따라가면서 코드의 흐름을 따라가고 변수 값을 확인하여 버그의 원인을 찾을 수 있다. 

 

 

반응형

'언어 > C' 카테고리의 다른 글

C언어 타입 캐스팅(type casting)  (1) 2023.10.30
[C] 전처리기 ? 알아볼게요 ( with. code )  (1) 2023.08.29
[C] 꼭 알아야 하는 포인터 개념  (0) 2023.08.08
profile

JJANG-JOON

@JJANG-JOON

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...