목적:

1. 실행파일을 gdb로 실행하면서 디버깅

# gdb [프로그램명]



2. 현재 실행중인 프로그램이 문제가 있는데.. 종료시키지 않고 디버깅 하고 싶다면..

attach 명령어를 사용해서 디버깅

먼저 디버깅할 프로세스의 PID를 구한다. 


#ps aux | grep [프로그램명]
root      4037  1.6  9.7 1909612 388600 ?      Ssl  Sep23 123:31 ./test_program

# gdb 

..중략..

(gdb) attach 4037


3. core파일을 디버깅

core파일을 생성하는 방법은 여러가지가 있는데요. 



3.1. gcore를 활용해서 core dump파일을 생성한 후 디버깅

#gdb -c [core파일명] [프로그램명] ,또는
#gdb [프로그램명][core파일명]

※ core dump 파일 만드는 방법은 단순히 gcore뒤에 core 파일을 만들 pid만 넣어주면 된다.

#gcore [-o filename] <pid>


3.2. gdb로 core파일을 생성하고 싶은 프로세스를 attach한 후 core dump파일 생성


(gdb) attach <pid>

(gdb) generate-core-file

Saved corefile core.<pid>


3.3. 실행중 segfault를 발생시키고 종료된 프로그램이 생성한 core파일이 있다면.. 


#gdb [프로그램명] [실행중인프로세스pid]


※ segfault 발생했을 때 core dump파일을 생성하도록 설정 하는 방법은 다음 포스트를 참조
http://kthan.tistory.com/45


 절차:

※ 컴파일시 -g 옵션을 사용해야 합니다. 


현재 위치에서 수행 가능한 명령어는 <tab>키를 누르면 조회됩니다. 

#gdb <binary>  

gdb를 실행하면 아래와 같은 프롬프트 화면이 나온다
(gdb)

"run"을 입력하면 프로그램이 실행된다.
만약 프로그램을 실행하는데 특정 옵션이 필요하다면 이곳에서 지정해줄 수 있다.
(gdb) run "--read /home/kthan/test.txt"
 

1. 프로그램이 비정상적으로 종료 되었다면..
스택을 보기 위해 bt(backtrace) 명령어를 사용한다. 현재 활성화된 서브루틴의 스택 프레임을 출력해준다.

 (gdb) bt

#0 Check (p=0x7fff9ffe3d10, lwssn=0x11b6bc20,
sPolicy=<value optimized out>, skey=<value optimized out>,    isnew=<value optimized out>) at stream.c:6858#1  Process (p=0x7fff9ffe3d10, lwssn=0x11b6bc20,

이런식으로 볼 수 있다. 
여기 나온 위치 값을 가지고 문제가 되는 소스의 위치를 알 수 있다. 


2. breaking point를 설정해서 원하는 만큼씩 실행하고 싶다면..실행하기 전에 먼저 breaking point를 설정한다. 

- func 함수의 시작위치에 설정
(gdb) b func 

-123번째 줄에 설정
(gdb) b 123   

-main.c 파일의 func 함수의 시작 위치에 설정
(gdb) b main.c:func 




설정한 breaking point는 "info b" 명령어로 조회 가능하다.

Num     Type      Disp Enb Address                                                         What

1       breakpoint     keep  y   0x0000000000444390 in SetupCompare at spo_check.c:178     breakpoint already hit 1 time
2       breakpoint     keep   y   0x0000000000441f80 in Setup    at spo_fast.c:116
3       breakpoint      keep  y   0x00000000004427c0 in Setup  at spo_full.c:99

Num: breakpoint의 고유번호
Type: breakpoint/watchpoint/catchpoint 정보
Disp: breakpoint의 특징
Enb: 현재 해당 breakpoint의 활성화 여부, 활성화/비활성화는 'enable br [Num]' 또는 'disable br [Num]'으로 변경가능


3. 원하는 원하는 만큼 위치를 옮겨가며 디버깅을 수행한다.

s(step) <반복횟수>  : 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행된다
 n(next)  : 현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어간다
 c(continue)  : 다음 브레이크 포인트를 만날때 까지 계속 수행한다
 u(until)  : for 문에서 빠져나와서 다음 브레이크 포인트까지 수행한다.
 finish : 현재 함수를 수행하고 빠져나감
 return : 현재 함수를 수행하지 않고 빠져나감
 return 123 : 현재 함수를 수행하지 않고 빠져나감, 단, 리턴값은 123
 si(step instruction)  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어간다.
 ni(next instruction)  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어가지 않는다.


4. 확인 해보고자 하는 값을 출력해가며 디버깅 수행

p(print) 변수 명 : 설정한 변수가 현재 가지고 있는 값을 출력
p *구조체 : 구조체의 값 출력

5. 종료
(gdb) quit


※gdb에 관한 고급 명령어는 다음 포스팅을 참고하세요.

 http://kthan.tistory.com/57

Posted by KT한
,