목적:
1. 실행파일을 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 [프로그램명][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파일이 있다면..
※ 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를 설정한다.
(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
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
'IT 생활 > 리눅스&우분투' 카테고리의 다른 글
[리눅스/Linux] 패킷 생성 및 전송 툴 - tomahawk, tcpreplay, bittwist (0) | 2011.04.26 |
---|---|
[리눅스/Linux] 크론탭(crontab) 설정 및 사용방법 (1) | 2011.04.12 |
[리눅스/Linux] 빔(vim) 에디터 명령어, 단축키 및 활용 팁 (0) | 2011.03.24 |
[리눅스/Linux] addr2line - 주소값으로 소스 코드 위치를 찾아주는 디버깅 툴 (0) | 2011.03.24 |
[리눅스/Linux] top(탑) 명령어 단축키 및 활용 팁 (0) | 2011.03.24 |