본문 바로가기
독서

gdb 사용방법

by _><- 2021. 8. 14.
반응형

1. test.c 프로그램 코딩

> 소스코드
#include <stdio.h>
int main (int argc, char* argv[] ) {
 char buffer[512];
 strcpy ( buffer, argv[1] );
 printf ( "%s\n", buffer );

 return 0;
}

 

#! 실행파일 컴파일과 어셈블리코드 생성

$gcc -o test test.c   => test라는 실행파일 생성

$gcc -S test.c    => test.s 라는 어셈블리코드 생성

 

 

$gdb -q [실행파일]

 

(gdb)disassemble             (현재 실행하고 있는 함수 어셈)

 

(gdb)disassemble main       (main함수 어셈코드보기)

(gdb)disas main                (동일한 명령어)

 

 

#! 설정

%, $표시가 붙은것들은 AT&T 방식

인텔방식으로 바꾸려면 

(gdb)set disassembly-flavor intel (disas까지 치고 tab키를 눌러보셔요!)

(gdb)disassemble         : 현재 실행하고 있는 함수 어셈​

(gdb)disassemble main : main함수 어셈코드보기

#! 실행

run: 프로그램 시작. run뒤에 추가로 argv와 같이 인자를 적어줄 수도 있다.

(gdb)run  (만약 인자를 던져 줘야한다면 (gdb)r [인자])

(gdb)r     (동일한 명령어)


continue: 다음 breakpoint까지 계속 실행
          여러개의 breakpoint를 설정하고 각 breakpoint에서 디버깅시 next, step등을 이용하여
          디버깅하고, 각 breakpoint간의 이동을 continue를 사용하면 유용 

(gdb)continue    (다음 브레이크문까지 진행)

(gdb)c               (동일한 명령어)

         
next: 다음 라인 실행(subrutine calls의 처리과정 보여주지 않음)

(gdb)n   (다음라인 진행)


step: next와 동일하나 subrutine calls을 만났을때 해당 subrutine으로 분기하여
      subrutine처리과정을 보여줌

(gdb)stepi    (n과 같은 기능인데 다른점은 함수가 있으면 내부로 들어간다는 점입니다)

(gdb)s         (동일한 명령어)

#! 브레이크포인트

(gdb)break *main    (브레이크 포인트 설정, 브레이크 포인트는 함수명, 주소값에 대해 설정 가능)

(gdb)b * main        (동일한 명령어)

(gdb)break *0x00000000 : 0x00000000 에 bp걸기

(gdb) info breakpoint    (브레이크포인트 목록)

(gdb) delete <breakpoint num>   : 해당 breakpoint 삭제

(gdb) clear     : breakpoint 모두 삭제

 

 

#! value 확인

(gdb)info break

 

 

 

(gdb) set $eax = 0x4141      : eax 레지스터 값을 0x4141로 할당

 

 

(gdb)info register (현재 레지스터 정보를 보여줌)

(gdb)info reg      (동일한 명령어)

(gdb)i r             (동일한 명령어)

 

(gdb) x/[옵션] $[레지스터] 또는 주소

(gdb) x/x 0x00000000   (0x0000000 메모리보기 (hex))

(gdb) x/x $eip               : 다음에 실행할 명령어 주소값

(gdb) x/x $eax              : eax 명령어 보기

(gdb) x/u 0x08080808   (10진수로 출력)

(gdb) x/i  0x08080808   (2 진수로 출력)

(gdb) x/s 0x08080808   (문자열 출력)

(gcb) x/c $esp+20       (문자 출력)

[갯수]b : 바이트 단위로 갯수 만큼 출력

 

(gdb)x/3wu $ebp-12  : ebp-12만큼 떨어진 지점부터 4바이트 크기만큼 3개(높은주소쪽으로) 10진수로 출력

[갯수]h : 2바이트 단위로 갯수 만큼 출력

[갯수]w : 4바이트 단위로 갯수 만큼 출력

(b,h,w 중에 마지막으로 선택한 옵션이 기본으로 바뀐다. 처음에는 w가 기본이다.)

(출력은 그 지점에서부터 높은주소쪽으로 갯수만큼 한다.)

#! 변경/설정

print: 지정한 변수값 출력
display: 지정한 변수값을 지속적으로 출력
undisplay: display로 지정한 변수값을 더이상 출력하고 싶지 않을때

set args: set args argument1, argument1,... 처럼 실행인자를 지정하고, show args로 지정된 인자를 볼 수 있다.
(gdb) set args air 
(gdb) show args    
Argument list to give program being debugged when it is started is "air".

#! 종료

(gdb)k              (디버깅모드 종료)

 

(gdb)quit          (디버깅 종료)

(gdb)q             (동일한 명령어)

 

 

 

<출처 :http://blog.naver.com/PostView.nhn?blogId=shw20319&logNo=20129448145&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView>

#! 참고 : http://blog.naver.com/PostList.nhn?blogId=shw20319&from=postList&categoryNo=80

                http://coffeenix.net/data_repository/html/gdb.html 

 

반응형

'독서' 카테고리의 다른 글

[yaml] YAML Ain't Markup Language  (0) 2021.08.20
[Cloud-Native]  (0) 2021.08.20
[스크랩] 기술사 총인원 확대  (0) 2016.10.22
[스크랩] 기술사 배출 확대   (0) 2016.10.22
천안버스터미널 근처 학화호도과자  (0) 2016.09.30