티스토리 뷰
목차
GDB 사용법과 명령어 정리, GNU debugger 디버깅 (메모리 덤프 해결)
GNU debugger GDB 소개, GDB 사용법
GNU debugger이며, 줄여서 GDB라고 불리는 이 소프트웨어는 GNU 소프트웨어 시스템을 위한 표준 GNU debugger이다. GNU debugger GDB는 다양한 유닉스 계열 시스템에서 동작하며, C, C++, 포트란을 비롯한 수많은 프로그래밍 언어를 디버깅하도록 도와주는 이식성 높은 GNU debugger이다.
단순하고 직관적인 디버거인 GNU debugger GDB
GNU debugger GDB는 CLI(명령 라인 인터페이스)를 통해 각종 정보를 제공하는데, 메모리 정보, 스택 정보, 레지스터 정보 등 매우 다양한 정보를 제공한다.
GDB 사용법 = 기본적으로 프로세스 단위로 정보를 제공한다
GDB의 디버깅 방법
C소스 각각 한 행은 한 묶음의 어셈블리 코드와 대응. (C++도 동일하다) GNU debugger GDB는 컴파일이 끝난 후 생성되는 각 어셈블리 코드 묶음을 C 소스의 각 행과 비교할 수 있게 소스 파일과 해당 인스트럭션이 어떤 C 소스행에 해당하는지 등의 정보가 추가된다.
[GNU debugger GDB] 메모리 덤프 해결
이런 정보를 이용하면 GNU debugger GDB에서 C 소스를 보면서 디버깅하는 것이 가능하다. -g 옵션을 붙이지 않으면 C 소스의 행 정보가 포함되지 않아 어셈블리 코드만 보면서 디버깅하는 수밖에 없다. (즉, 코드와 어셈블리가 매칭되지 않았다는 것)
GNU debugger GDB의 코어 파일(Core file)
버그나 기타 운영체제나 하드웨어 보호 메커니즘을 위반하여 비정상적으로 프로그램이 종료할 때 만들어진다. 운영체제는 문제가 발생한 응용 프로그램을 강제 종료시키며(죽이며), GNU debugger GDB는 코어 파일을 만들어 프로그래머가 무엇이 잘못되었는지를 판단하도록 도와준다. (GDB 사용법 핵심)
코어 파일은 프로그램이 죽었을 시점에서 프로그램 상태가 어떤지를 세부적으로 기술하는 정보를 포함한다. 어떤 프로그램이 코어 파일을 만들었는지 알고 싶다면 file 명령어를 사용한다.
[GNU debugger GDB] 메모리 덤프 해결
코어 덤프를 일으킨 명령어를 알아내면, 해당 프로그래머를 관리하는 사람에게 core를 제출하는 방법으로 문제점을 알려줄 수 있다. 코어 파일은 GNU debugger GDB와 같은 디버거에서 인식하기 때문에 응용 프로그램이 비정상적인 상황으로 종료됐을 때 디버깅 정보가 붙어있는 실행 파일인 경우 GNU debugger GDB에서 코어 파일을 읽기만 하면 문제가 발생한 정확한 지점과 스택 역 추적 정보를 바로 확인할 수 있다.
GDB 사용 예
예외 상황에 부닥치면 운영체제는 시그널을 해당 프로세스에 보내고, 시그널을 받은 프로세스는 커널에 있는 기본 시그널 핸들러를 수행한다. 이때 기본 시그널 핸들러에서 코어 파일로 저장하는 부분이 있다면 현재 수행 중인 프로세스의 이미지를 GNU debugger GDB는 코어 파일로 저장한다.
즉, 코어 파일이란 문제가 발생해 프로세스가 종료되는 순간의 프로세스 이미지 파일로, 여기에는 종료 순간의 CPU context와 프로세스의 코드 및 데이터, 스택 등의 정보가 들어있는 파일을 GNU debugger GDB에서 디버깅할 때 유용하게 사용할 수 있다.
GDB 사용법 - 기본 사용 방법
커맨드 창에서 gdb [프로그램명]
종료할 땐 Ctrl + d
[GNU debugger GDB] 메모리 덤프 해결
GNU debugger GDB 소스 보기 인자
| |
main 함수를 기점으로 소스 출력 |
| 10 |
10행을 기준으로 출력 |
| func |
func 함수의 소스를 출력 |
| - |
출력된 이전 행을 출력 |
| file.c:func |
file.c 파일의 func 함수를 출력 |
| file.c:10 file.c |
파일의 10행을 기준으로 출력 (GDB 실행 시 소스 폴더에서 구동해야 | 로 소스 보기가 가능함) |
GDB 사용법 브레이크 포인트
Bt(back trace)로 포인트 추가
r로 다음 Bt로 이동
GNU debugger GDB의 백트레이스는 프로그램의 스택 프레임을 순차적으로 따라가면서 해석한다. 현재 수행 코드까지 어떤 함수들의 호출이 있었으며, 각 함수를 호출할 때 인자는 무엇인지 확인할 수 있다.
b |
func func 심볼의 시작 부분에 브레이크 포인트 설정 |
b 10 |
10행에 브레이크 포인트 설정 |
b file.c:func |
file.c 파일의 func 심볼에 브레이크 포인트 설정 |
b file.c:10 file.c |
파일의 10행에 브레이크 포인트 설정 |
b +2 |
현재 행에서 2개행 이후 지점에 브레이크 포인트 설정 |
b -2 |
현재 행에서 2개행 이전 지점에 브레이크 포인트 설정 |
b *0x8049000 |
0x8049000 주소에 브레이크 포인트 설정(어셈블리로 GNU debugger GDB 사용 시 설정) |
b 10 if var == 0 |
10행에 조건부 브레이크 포인트 설정 |
rb fun* |
*fun*에 해당하는 모든 심볼에 브레이크 포인트 설정 |
rb ^fun |
fun으로 시작하는 모든 심볼에 브레이크 포인트 설정 |
rb TestClass:: |
TestClass에 해당하는 모든 심볼에 브레이크 포인트 설정 |
GDB 사용법 - 브레이크 포인트 설정 변경 관련
cl func |
func 함수 시작 부분의 브레이크 포인트 지움 |
cl 10 |
10행의 브레이크 포인트 지움 |
cl file.c:func |
file.c 파일의 func 심볼에 브레이크 포인트 지움 |
cl file.c:10 |
file.c 파일의 10행에 브레이크 포인트 지움 |
d |
모든 브레이크 포인트 지움 |
disable br |
모든 브레이크 포인트 비활성화 |
disable br 1 |
1번 브레이크 포인트 비활성화 |
enable br |
모든 브레이크 포인트 활성화 |
enable br 1 |
1번 브레이크 포인트 활성화 |
info breakpoints |
bt와 관련된 모든 정보 보기 |
[GNU debugger GDB] 메모리 덤프 해결
GNU debugger GDB 프로그램 실행 관련
r |
프로그램 실행 |
r arg1 arg2 |
arg1과 arg2를 인자로 프로그램 실행 |
k |
프로그램 종료 |
s |
현재 행 수행 후 멈춤, 함수 호출 시 내부로 들어감 |
n |
현재 행 수행 후 멈춤, 함수 호출 시 다음 행으로 감 |
c |
다음 브레이크 포인트까지 계속 진행 |
u |
현재 loop를 빠져나감 |
finish |
현재 함수를 수행하고 빠져나감 |
return |
현재 함수를 수행하지 않고 빠져나감 |
watch [변수명] |
실행 도중 개별 변수 정보 출력 |
GDB 사용법과 명령어 정리, GNU debugger 디버깅 (메모리 덤프 해결)