반응형
1. 개요
- linux c 개발에서 디버깅을 위한 gdb 명령어 정리 및 실습을 진행합니다.
2. gdb 사용 조건
- gdb를 사용하기 위해선 컴파일 옵션에 "-g" 옵션을 사용해야 합니다.
- 또한 최적화 옵션을 사용하지 않는 것이 디버깅 시 좋습니다.
3. 예제 소스
- gdb 명령어 테스트를 위한 소스 예제입니다.
- 예제는 다음과 그림과 같이 구성하였습니다.
- 소스 파일
- main.c
#include <stdio.h> #include <stdlib.h> #include <main.h> #include <cal.h> int main(int argc, char **argv) { int i = 0; int nData1 = 0; int nData2 = 0; int nResult = 0; int narResult[5] = {0, }; double dResult = 0; if(1 < argc) { printf("명령 인수 = [%s]\n", argv[1]); } nData1 = 100; nData2 = 10; nResult = Add(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 11; nData2 = 22; nResult = Add(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 50; nData2 = 5; nResult = Minus(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 10; nData2 = 99; nResult = Minus(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 12; nData2 = 11; nResult = Mul(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 50; nData2 = 20; nResult = Mul(nData1, nData2); printf("Result = [%d]\n", nResult); nData1 = 10; nData2 = 10; dResult = Div(nData1, nData2); printf("Result = [%lf]\n", dResult); nData1 = 100; nData2 = 0; dResult = Div(nData1, nData2); printf("Result = [%lf]\n", dResult); for (i = 0; i < 5; i++) { narResult[i] = test_func(i); printf("Result = [%d]\n", narResult[i]); } printf("Finish!!\n"); return 0; }
- main.h
#ifndef _MAIN_H_ #define _MAIN_H_ 1 #endif /* _MAIN_H_ */
- cal.c
#include <stdio.h> #include "cal.h" int g_nData = 10; int Add(int n1, int n2) { int nResult = 0; nResult = n1 + n2; return nResult; } int Minus(int n1, int n2) { int nResult = 0; nResult = n1 - n2; return nResult; } int Mul(int n1, int n2) { int nResult = 0; nResult = n1 * n2; return nResult; } double Div(int n1, int n2) { double dResult = 0; if (0 == n2) { return -1; } dResult = (double)(n1 / n2); return dResult; } int test_func(int nData) { static int nValue = 0; int nResult = 0; nResult = g_nData * nData + nValue; nValue++; return nResult; }
- cal.h
#ifndef _CAL_H_ #define _CAL_H_ 1 int Add(int n1, int n2); int Minus(int n1, int n2); int Mul(int n1, int n2); double Div(int n1, int n2); #endif /* _CAL_H_ */
- Makefile
GCC = gcc CFLAGS = -Wall -g -O0 .c.o: $(GCC) $(CFLAGS) $(INCS) -c -o $@ $< TOPDIR = . BIN_PATH = $(TOPDIR)/bin TARGET_NAME = test_main TARGET = $(BIN_PATH)/$(TARGET_NAME) SRCS = src/main.c src/cal.c OBJS = $(SRCS:.c=.o) INCS = -I./src all : $(TARGET) $(TARGET): $(OBJS) $(GCC) $(CFLAGS) -o $@ $^ clean: $(RM) -f $(OBJS) $(TARGET)
- main.c
4. gdb 명령어 및 실습
- gdb 사용에 필요한 명령어와 실습 내용입니다.
4.1. gdb 실행
- 디버깅을 위해 gdb를 사용하여 프로그램을 로드합니다.
명령어 설명 gdb [프로그램 이름 <명령 인수>] gdb를 실행합니다. gdb [프로그램 이름] [core 파일] gdb [프로그램 이름] [실행 중인 PID] - 예제
4.2. gdb 종료
- gdb를 종료합니다.
명령어 설명 quit gdb를 실행합니다. ctrl + d - 예제
4.3. gdb 중단점
- 프로그램 수행 시 특정 지점 또는 특정 조건에서 중단점을 설정합니다.
- break [함수 이름]
- 함수의 시작 부분 중단점 설정합니다.
- ex) break Add
- 예제)
- break [라인 번호]
- 라인 번호에 중단점을 설정합니다.
- ex) break 14
- 예제)
- break [파일 이름:라인 번호]
- 특정 파일의 라인 번호에 중단점을 설정합니다.
- ex) break cal.c:17
- 예제)
- 특정 파일의 라인 번호에 중단점을 설정합니다.
- break [파일 이름 : 함수 이름]
- 특정 파일의 함수 시작 부분에 중단점을 설정합니다.
- ex) break cal.c:Mul
- 예제)
- 특정 파일의 함수 시작 부분에 중단점을 설정합니다.
- break [+<offset>]
- 현재 라인에서 offset 이후 지점에 중단점을 설정합니다.
- ex) break +10
- 예제)
- 현재 라인에서 offset 이후 지점에 중단점을 설정합니다.
- break [+<offset>]
- 현재 라인에서 offset 이전 지점에 중단점을 설정합니다.
- ex) break -5
- 예제)
- break [*address]
- 특정 주소에 중단점을 설정합니다.(어셈블리 디버깅 시 사용)
- ex) break *0x00000080
- break [<...> if <조건>]
- 조건에 부합하는 경우 중단점을 설정합니다.
- ex) break 10 if var ==10 : 10번 라인에서 var 값이 10인 경우 중단점 발생
- 예제)
- break [함수 이름]
- 설정된 중단점을 확인합니다.
- info break
- 설정된 중단점을 확인합니다.
- 예제)
- info break
- 설정된 중단점을 삭제합니다.
- clear [함수 이름]
- 설정된 중단점을 삭제합니다.
- 예제)
- clear [라인 번호]
- 설정된 중단점을 삭제합니다.
- 예제)
- clear [파일 이름 : 라인 번호]
- 설정된 중단점을 삭제합니다.
- 예제)
- clear [파일 이름 : 함수 이름]
- 설정된 중단점을 삭제합니다.
- 예제)
- delete
- 설정된 모든 중단점을 삭제합니다.
- 예제)
- delete [breakpoint 번호...]
- 중단점 번호에 해당하는 중단점 삭제합니다.
- 예제)
- clear [함수 이름]
- 중단점을 활성화/비활성화합니다.
- enable
- 모든 중단점을 활성화합니다.
- 예제)
- enable [breakpoint 번호...]
- 중단점 번호에 해당하는 중단점을 활성화합니다.
- 예제)
- disable
- 모든 중단점을 비활성화합니다.
- 예제)
- disable [breakpoint 번호...]
- 중단점 번호에 해당하는 중단점을 비활성화합니다.
- 예제)
- enable
4.4. gdb 프로세스 실행
- gdb를 이용해 프로그램을 로드한 상태에서 프로그램을 실행시킵니다.
- run
- gdb를 이용하여 프로그램을 로드한 상태에서 실행시킵니다.
- 명령 인수는 run 명령어 뒤에 준다.
- 예제 1) run
- 예제 2) run [명령 인수]
- continue [n]
- 다음 break point까지 프로그램을 실행합니다.
- 다음 n 번의 break point는 건너뛰고 프로그램을 실행합니다.
- 예제)
- next [n]
- 프로그램을 한 줄 실행, 함수 내부로 진입하지 않는다.
- 프로그램을 n 줄 실행, 함수 내부로 진입하지 않는다.
- 예제)
- step [n]
- 프로그램을 한 줄 실행, 함수 내부로 진입한다.
- 프로그램을 n 줄 실행, 함수 내부로 진입한다.
- 예제)
- return [return value]
- 현재 함수를 수행하지 않고 빠져나간다.
- 현재 함수를 수행하지 않고 빠져나가면서 return 값을 설정한다.
- 예제 1) return
- 예제 2) return [return value]
- finish
- 현재 함수를 수행하고 빠져나간 후 리턴 값을 출력한다.
- 예제)
- kill
- 실행 중인 프로그램을 종료한다.
- 예제)
- run
4.5. gdb 변수 및 주소 값 출력
- gdb로 프로그램을 실행시킨 뒤 변수 및 주소값을 확인합니다.
- info locals
- 현재 지점에서 모든 지역 변수의 값들을 확인합니다.
- ex) info locals
- 예제)
- info variables
- 모든 전역변수의 값들을 확인합니다.
- ex) info variables
- 예제)
- print [var]
- var 변수의 값을 출력합니다.
- ex) print nValue
- 예제)
- print [*ptr]
- ptr 포인터의 값을 출력합니다.
- ex) print *narResult
- 예제)
- print ['파일'::전역변수]
- 특정 파일의 전역 변수 값을 확인합니다.
- 파일 명은 ''(작은따옴표)로 감싸야합니다.
- ex) print 'cal.c'::g_nData
- 예제)
- print [함수::static 변수]
- 특정 함수의 static 변수 값을 확인합니다.
- ex) print Add::nValue
- 예제)
- print [배열[n]]
- 배열의 n 번째 값을 출력합니다.
- 예제)
- print [*array@len]
- array 배열의 값을 len 수만큼 출력합니다.
- ex) print *array@2
- 예제)
- print [/출력 옵션 var]
- var 변수의 값을 출력 옵션에 맞게 출력합니다.
- t : 2 진수 출력
- o : 8 진수 출력
- d : 부호 있는 10 진수 출력
- u : 부호 없는 10 진수 출력
- x : 16 진수 출력
- c : 최소 1바이트 값을 문자형으로 출력
- f : 부동 소수점 형식으로 출력
- 예제)
- var 변수의 값을 출력 옵션에 맞게 출력합니다.
- display [/출력 옵션 var]
- var 변수의 값을 매번 출력합니다.
- 출력 옵션은 print 명령어의 출력 옵션과 동일합니다.
- 예제)
- info display
- 설정된 display 옵션을 보여줍니다.
- 예제)
- undisplay
- display 옵션을 제거합니다.
- 예제)
- enable display
- display 옵션을 활성화합니다.
- 예제)
- enable display [display 번호]
- 특정 display 옵션을 활성화합니다.
- 예제)
- disable display
- display 옵션을 비활성화합니다.
- 예제)
- disable display [display 번호]
- 특정 display 옵션을 비활성화합니다.
- 예제)
- info locals
4.6. gdb 소스 파일 출력
- gdb로 프로그램을 실행시킨 뒤 소스 파일을 출력합니다.
- list
- 현재 위치의 주변 소스를 출력합니다.
- 예제)
- list [라인 번호]
- 특정 라인 주변 소스를 출력합니다.
- 예제)
- list [함수]
- 함수 주변 소스를 출력합니다.
- 예제)
- list
반응형
'Linux' 카테고리의 다른 글
[Linux] gdb 멀티 프로세스 환경에서 사용하기 (0) | 2023.12.19 |
---|---|
[Linux] vmware 가상머신인 Linux에서 네트워크 설정 사라짐 (0) | 2023.11.16 |
[Linux] find 명령어를 사용한 파일 또는 문자열 검색 (0) | 2023.11.14 |
[Linux] vim 설치 및 설정 (0) | 2023.11.14 |