[Debug] GDB를 써보자!

윤동환·2023년 4월 14일
0

Tool

목록 보기
6/6

GDB란?

리처드 스톨만이 개발한 디버거로써 유닉스 계열과 윈도우에서 사용 가능합니다.

사용 방법들

  1. gdb
    gdb 명령 실행후 file이라는 명령으로 프로그램을 호출할 수 있습니다.

  2. gdb [프로그램]
    인자로 받은 실행파일을 디버깅 합니다.

  3. gdb [프로그램][core file]
    코어파일을 사용할 때 동시에 인자로 줍니다.

    코어파일 확인하기
    //list 생성시간을 역순으로 보여주여 제일 아래 있는 core파일이 최근 생성된 파일
    ls -lrt /var/coredumps/

  4. gdb [프로그램][PID]
    실행중인 프로세스를 디버깅하기위해 프로세스 ID를 두번째 인자로 주면, 1234라는 파일이 없다면 프로세스 1234에 접속시킵니다. (단, core파일을 먼저 찾습니다)

  5. 만약 컴파일 옵션에 -g 를 주지 않았다면 gdb 실행사 다음과 같은 에러를 만날 수 있다.

    No symbol table is loaded. Use the "file" command.

명령어

명령어설명
list현재 위치에서 소스 파일의 내용을 10줄 보여줌
run프로그램 시작 (break가 있다면 break까지 실행)run arg : 새로운 인수를 가지고 프로그램 시작
break특정 라인이나 함수에 중지점을 설정, break function : 현재 파일 안의 함수 function에 정지 설정, break file function : 파일 file안의 function에 중지 설정, watch : 감시점 설정, until : 실행 중 line까지 실행, clear 특정 라인이나 함수에 있던 중지점 삭제
delete몇몇 정지점이나 자동으로 출력되는 표현 삭제
next다음 행을 수행. 서브루틴을 호출하면서 계속 수행, next n : n번 수행
step한 줄씩 실행 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행
printprint expr : 수식의 값을 보여줌
display현재 display된 명령의 목록을 보여줌
bt프로그램 스택을 보을 보여줌(backtrace)
kill디버깅 중인 프로그램의 실행 취소
filefile program : 디버깅할 프로그램으로서 파일을 사용
contcontinue : 현재 위치에서 프로그램을 계속 실행
help명령에 관한 정보를 보여주거나 일반적인 정보를 보여줌
quitgdb에서 빠져나감

명령어 사용 법

1. 소스 찾아가기 (list)

//main 함수를 기점으로 소스의 내용이 출력됩니다.//5행부터 15행까지 출력됩니다. (10행 기준으로 10줄)
l 10

//func함수의 소스를 출력합니다.
l func

//a.c파일의 func 함수를 출력합니다.
l a.c:func

//a.c 파일의 10행을 기준으로 출력합니다.
l a.c:10

2. 옵션

//한번에 출력하는 라인 수를 20으로 바꿉니다.
set listsize 20

//마지막 실행 명령어를 한번 더 실행합니다.
ENTER 키 입력

3. 프로그램 실행, 종료

//프로그램 재시작
r

// a1, a2를 인자로 프로그램 실행
r a1 a2

// 프로그램 종료
k

4. 역 추적(back track)

//오류가 발생한 함수를 역으로 찾아감
bt
//같은 동작
where

5. 중단점 사용 (break point)

// func 함수에 브레이크 포인트 설정
b func

// 10행에 브레이크 포인트 설정
b 10

// a.c 파일의 func 함수에 브레이크 포인트 설정
b a.c:func

//a.c 파일의 10행에 브ㄹ이크 포인트 설정
b a.c:10

//현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정
b +2

//현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정
b -2

// 0x1234 주소에 브레이크 포인트 설정 (어셈블리 디버깅시 사용)
b 0x1234

// 10행에 브레이크 포인트를 성정하되 var == 10일 때 작동
b 10 if var = 0

//임시 중단점을 사용하는 것으로 한번만 설정되며 이후 삭제됨
tb

6. 중단점 설정하기(condition)

// 고유번호 2인 브레이크 포인트에 var == 0이면 동작하라고 설정
condition 2 var == 0

7. 중단점 삭제하기(clear, delete)

//func 함수의 시작부분의 브레이크 포인트 지움
cl func

// 10행의 브레이크 포인트 지움
cl 10

//고유번호 1인 브레이크 포인트 지움
delete 1

// a.c 파일의 func 함수의 브레이크 포인트 지움
cl

// a.c file의 func 함수의 브레이크 포인트 지움
cl a.c:func

//a.c 파일의 10행의 브레이크 포인트 지움
cl a.c:10

//모든 브레이크 포인트 지움
cl

8. 중단점 정보 보기 (information)

// 현제 설정된 브레이크 포인트 정보를 보여줌
info b

// 방향키 up/down에 따라 히스토리 기능 제공
방향키 up/down

//info br 로 시작하느 키워드가 히스토리에 있다면 보여줌
info br + TAB

//info 뒤에 올 수 있는 인자 리스트를 보여줌
info TAB TAB

//현재 사용가능한 모든 명령어 리스트 보여줌
TAB + TAB

9. 중단점 활성화, 비활성화

//고유번호 2번인 브레이크 포인트 활성화
enable 2

//고우번호 2번인 브레이크 포인트 비활성화
disable2

10 디버깅 하기(step, next, continue, finish, return, step instruction, next instruction)

// 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행
s

// s를 5번 입력한 것과 동일
s5

//현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어감
n

// n을 5번 입력한 것과 동일
n5

//다음 브레이크 포인트를 만날때 까지 계속 수행
c

//for문에서 빠져나와서 다음 브레이크 포인트 까지 수행(for문에 braek point가 있을 때 쓰면 될 듯!)
u 

// 현재 함수를 수행하고 빠져나감
finish

// 현재 함수를 수행하지 않고 빠져나감
return

//현재 함수를 수행하지 않고 빠져나가는데 리턴값은 123 (원하는 리턴값을 받았을 때 이후 동작을 확인하기 위해 사용하면 될 듯!)
reutrn 123

// 현재의 인스트럭션을 수행, 함수 호출시 내부로 들어감
si

// 현재의 인스트럭션을 수행, 함수 호출하더라도 내부로 들어가지 않는다.
ni

인스트럭션(instruction)은 컴퓨터에게 일을 시키는 단위로서, 컴퓨터가 알아들을 수 있는 기계어로 이루어져 있는 명령이다. 지시 또는 명령이라고 한다.

11. 감시점 설정 (watch)

// i라는 변수에 watch 포인트를 설정하고 i 변수가 바뀔 때 마다 브레이크가 걸리며 이전 값과 현재 값을 비교함
watch i

12. 변수 정보 보기 (info, print)

// 현재 상태에서 어떤 지역 변수들이 있은지 ,값은 어떤지 알 수 있음
info locals

// 현재 상태에서의 전역 변수 리스트를 확인할 수 있음
info variables

// lval 값 확인
p lval

// func 함수의 주소 값 확인
p func

// pt가 구조체라면 구조체 주소 확인
p pt

// pt가 구조체라면 구조체 값 확인
p *pt

// *pt가 구조체라면 구조체 값 확인
p **pt

// 레지스트 값 전체를 한 번에 확인
info registers 

12-0. 출력 명령 요약 (print)

p [변수명] : 변수 값을 출력
p [함수명] : 함수의 주소를 출력
p/[출력형식][변수명] : 변수 값을 출력 형식으로 출력
p '[파일명]'::[변수명] : 파일명에 있는 전역변수 값을 출력
p [함수명]::[변수명] : 함수에 있는 변수 값을 출력
p [변수명]@[배열크기] : 변수의 내용을 변수 배열의 크기 형태로 출력

12-1. 레지스트 값 및 포인터가 가리키는 구조체 배열을 출력 (info, print)

// MMX 레지스트를 포함하여 거의 대부분의 레지스트 값 확인
info all-registers

// eax 레지스트의 값을 확인
p $eax

// 4 크기의 배열로 gdb가 알 수 있으므로 4개의 크기만큼 가져와서 확인
p *pt@4

12-2. 중복된 변수명이 있는 경우 특정 변수를 지정해서 출력 (print)

// main.c 파일에 있는 전역 변수인 var 변수의 값 출력
p 'main.c'::var

// hello 함수에 포함된 static 변수인 var 변수의 값 출력
p hello::var

더 자세한 출력 기능은 reference 글을 확인해보자

13. 디스플레이 명령 (display, undisplay)

//변수 값을 매번 화면에 표시
display [변수명] 

//변수 값을 출력형식으로 디스플레이
display/[출력형식] [변수명]

//해당 디스플레이 설정 제거
undisplay [디스플레이 번호]


// 디스플레이 일시 중단
disable display [디스플레이 번호]

// 디스플레이 재개
enable display [디스플레이 번호]

undisplay 예시😊

14. 스택 프레임 관련 명령 (frame, up, down, info)

// 현재 스택 프레임의 함수 내의 지역변수 출력
info locals

// 현재 스택 프레임의 함수내의 예외 핸들러 출력
info catch

더 자세한 출력 기능은 reference 글을 확인해보자

15. 함수 호출 (call)

// 특정 함수 func를 arg1, arg2 파라미터를 포함하여 호출하고, 반환 값은 출력
call func(arg1, arg2)

16. 시그널 전송 (signal)

// 보낼 수 있는 시그널의 종류를 확인
info signals

// 디버깅 대상의 프로세스에게 KILL 시그널을 보냄
signal SIGKILL

17. gdb 환경설정 (set)

// 변경 가능한 환경설정 정보를 출력
info set

// 함수들의 리스트를 출력
info functions

// 선언된 타입에 대한 리스트를 출력
info types

// 프롬프트를 psyoblade: 로 변경할 수 있음
set prompt psyoblade: 

// 배열을 출력할 때 여러 행에 출력한다.
set print array on 

Reference

https://mk28.tistory.com/134

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글