[TIP] GDB debugging 하기
[GDB]
1. gdb를 위한 컴파일 옵션 : -g (ex) gcc -g -o bugprg bugprg.c
: -g옵션을 주고 컴파일 할 때는 -O(최적화 옵션) 옵션을 사용하지 않는 것이 좋다.
→ 최적화 옵션을 준 경우 어셈블리 코드 자체에 많은 변경이 가해지기 때문...
2. gdb 시작: gdb [프로그램명] or gdb [프로그램명] [core 파일명]
or gdb [프로그램명] [실행 중인 프로세스 PID]
gdb 종료: q or Ctrl + d
3. gdb 소스보기 : l(list) - main 함수를 기점으로 소스 출력
l 함수명 - 함수의 소스를 출력
l 라인넘버 - 라인넘버를 기준으로 소스 출력
l 파일명:func - 해당 파일의 func 함수 부분을 출력
l 파일명:라인넘버 - 해당 파일의 라인넘버를 기준으로 출력
set listsize 행수 : 출력되는 행 수를 변경한다.
4. gdb 프로그램 실행 : r
r arg1 arg2 - arg1과 arg2를 인자로 프로그램 수행
5. gdb 수행 Step : s [숫자] (현재 행을 수행하고 멈춘다 - 내부로 들어감)
si (현재의 인스트럭션을 수행. 함수 호출 시 함수 내부로 들어감)
n [숫자] (현재 행을 수행하고 멈춘다 - 내부로는 들어가지 않음)
ni (현재의 인스트럭션을 수행. 함수 호출 시 함수 내부로 들어감)
c (브레이크 포인트를 만날 때까지 멈추지 않고 계속 수행한다.)
u (현재 루프를 빠져 나감)
finish (현재 함수를 수행하고 빠져 나감)
return [숫자] (현재 함수를 수행하지 않고 빠져 나감. 숫자=리턴값 강제 부여)
6. gdb 프로그램 수행 종료 : k
7. gdb 브레이크 포인트 설정 : b [브레이크 포인트로 설정할 부분]
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주소에 브레이크 포인트 설정(어셈블리 디버깅시 사용)
b 10 if var == 0 - 10행에 브레이크 포인트를 설정하는데 var변수값이 0일 때 작동
8. gdb 브레이크 포인트 해제 : cl [해제할 브레이크 포인트]
cl func - func 함수의 시작 부분에 브레이크 포인트 지움
cl 10 - 10행의 브레이크 포인트 지움
cl file.c:func - file.c 파일의 func 함수에 브레이크 포인트를 지움
cl file.c:10 - file.c 파일의 10행의 브레이크 포인트 지움
d - 모든 브레이크 포인트를 지움
9. 현재 설정된 브레이크 포인트 보기 : info breakpoints
10. 변수 관련 부분
ⓐ Watch 포인트 설정 : 변수값이 어떻게 바뀌는지 그리고 어떤 코드가 바꾸는지에 대하여 확인할 때 사용한다.
* watch [변수명]
- 변수가 바뀔 때마다 브레이크가 걸리면서 변수의 이전 값과 현재 값을 출력하는 모습을 보여준다.
ⓑ 전체 변수의 출력 : info locals - 현재 상태에서 어떤 지역변수들이 있으며 각각의 값들은 무엇인지 보인다.
ⓒ 개별 변수의 출력 : p [변수명] - 해당 변수 주소와 값 출력 (포인터 변수 보는 법은 C언어 코딩과 같다.)
p [함수명] - 함수의 주소값 출력
p $[레지스트리 명] - 레지스트리 값을 출력
※ info registers - 레지스트 값 전체를 한번에 보는 명령어
info all-registers - MMX 레지스트를 포함한 거의 대부분의 레지스트 값을 출력
p *pt@4 - (pt=포인터변수) @은 배열의 크기를 gdb에 알리는 경우 사용한다.
p '[파일명]'::[변수명] : 특정한 파일의 전역변수를 지정하고자 할 때 사용.
p [함수명]::[변수명] : 특정 함수의 static 변수 값을 확인하고자 할 때 사용.
ⓓ 출력 형식 지정 : p /[출력형식] [변수]
[출력 형식]
t : 2진수로 출력
o : 8진수로 출력
d : 부호가 있는 10진수로 출력(int)
u : 부호가 없는 10진수로 출력(unsigned int)
x : 16진수로 출력
c : 최초의 1바이트 값을 문자형으로 출력
f : 부동 소수점 값 형식으로 출력
a : 가장 가까운 심볼의 오프셋을 출력
ⓔ 타입 변환 출력 : p (캐스팅 연산자) 변수명
- C언어의 캐스팅과 같다.
ⓕ 변수값 설정 : p [변수명] = 값
ⓖ 변하는 변수값 자동으로 디스플레이 하기
: display [변수명] : 변수값을 자동으로 디스플레이
display /[출력형식] [변수명] : 변수값을 출력 형식으로 자동으로 디스플레이
undisplay [디스플레이 번호] : 디스플레이 종료
disable display [디스플레이 번호] : 디스플레이를 일시 중단한다.
enable display [디스플레이 번호] : 디스플레이를 다시 활성화한다.
11. 스택프레임에 있는 정보를 이용하여 디버깅 하기
: info frame - 스택 프레임 정보를 출력
info args - 함수가 호출될 때 인자를 출력
info locals - 함수의 지역변수를 출력
info catch - 함수의 예외 핸들러를 출력
bt - 전체 스택 프레임 출력 (간략하게)
frame [N] - n번 스택 프레임으로 변경
up - 상위 스택 프레임으로 이동
up [N] - n번 상위 스택 프레임으로 이동
down - 하위 스택 프레임으로 이동
down [N] - n번 하위 스택 프레임으로 이동
12. 메모리 상태 검사
: x/[범위][출력형식][범위의 단위]
<출력 형식>
t : 2진수로 출력
o : 8진수로 출력
d : 부호가 있는 10진수로 출력(int)
u : 부호가 없는 10진수로 출력(unsigned int)
x : 16진수로 출력
c : 최초의 1바이트 값을 문자형으로 출력
f : 부동 소수점 값 형식으로 출력
a : 가장 가까운 심볼의 오프셋을 출력
s : 문자열로 출력
i : 어셈블리 형식으로 출력
<범위 단위>
b : 1바이트 단위
h : 2바이트 단위
w : 4바이트 단위
g : 8바이트 단위
13. 기타
ⓐ 어셈블리 코드 보기
* disas [함수명] : 함수의 어셈블리 코드를 출력한다.
* disas [주소1] [주소2] : 주소1 ~ 주소2 범위 사이의 어셈블리 코드를 출력
ⓑ call 명령을 사용해서 함수별 모듈 테스트
* call [함수] : 함수를 임의로 호출할 수 있다.
* junp [함수 or *주소 or 행수] : 임의의 행, 주소 또는 함수로 무조건 분기하는 명령
ⓒ 디버깅하는 프로세스에 시그널을 보냄
* signal [인터럽트 시그널] : 디버깅 대상의 프로세스에게 시그널을 보낼 수 있다.
* info signals : 시그널의 종류 출력
ⓓ 메모리 특정영역에 값을 설정
* set {타입}[주소] = [값] : 메모리 특정 주소에 값을 저장
ⓔ gdb 환경 설정 관련 명령 및 정보 출력 명령
* set prompt woos: - "(gdb) → woos: 로 바꾼다."
* set print array on - "주소, 값 " 쌍으로 출력. 여러 행에 출력된다.
* info set - 변경 가능한 환경 설정 출력
* info functions - 함수들의 리스트를 출력
* info types - 선언된 타입에 대해서 볼 수 있다.
* info 입력 후 Tab키 두 번 누름 - info 명령으로 확인 가능한 정보들 출력.
'tip' 카테고리의 다른 글
[TIP] vi에서 BufExplorer사용하기... (0) | 2009.09.16 |
---|---|
[TIP] VI 에디터에서 ctags 사용하기... (0) | 2009.09.15 |
[TIP] CapsLock to Control key change (0) | 2009.09.07 |
[ipod touch] tap defense 가 업데이트 되었군요... (0) | 2009.05.11 |
[ipod touch] tap defense - easy (0) | 2009.04.29 |