GDB (GNU Debugger)

Seongcheol Jeon·2024년 9월 25일

GDB

목록 보기
1/1
post-thumbnail

GDB란?

GDB(GNU Debugger)GNU 소프트웨어 시스템을 위한 기본 디버거이다. GDB는 다양한 유닉스 기반의 시스템에서 동작하며, C, C++, Go, Rust 등의 여러 프로그래밍 언어를 지원한다.

GDB 명령 요약

시작 및 종료

  • gdb [프로그램명][core 파일명][PID]
    • gdb 실행
    • ex)
      • gdb [프로그램명 <명령 인수>]
      • gdb [프로그램명] [core 파일명]
      • gdb [프로그램명] [실행 중인 PID]
  • q or Ctrl+d
    • gdb 종료

소스 보기 (list)

  • l
    • main 함수 기점으로 소스 출력
  • l 5
    • 5행을 기준으로 출력
  • l func
    • func 함수의 소스를 출력
    • C++ 클래스 멤버의 경우, 클래스 이름도 입력해야 함
  • l -
    • 출력된 행의 이전 행을 출력
  • l file.cpp:func
    • file.cppfunc 함수 부분을 출력
  • l file.cpp:5
    • file.cpp5행을 기준으로 출력

브레이크 포인트 (break)

  • b func
    • func 함수의 시작 부분부터 브레이크 포인트 설정
  • b 5
    • 5행에 브레이크 포인트 설정
  • b file.cpp:func
    • file.cpp 파일의 func 함수에 브레이크 포인트 설정
  • b file.cpp:5
    • file.cpp 파일의 5행에 브레이크 포인트 설정
  • b +2
    • 현재 행에서 2개 행 이후, 브레이크 포인트 설정
  • b -2
    • 현재 행에서 2개 행 이전, 브레이크 포인트 설정
  • b *0x12340000
    • 특정 주소에 브레이크 포인트 설정
  • b 5 if var == 0
    • 5행에 브레이크포 포인트를 설정하는데, var 값이 0일 때 작동
  • tb
    • b 명령과 같으나 1회용 브레이크 포인트이며, 문법은 b와 동일
  • info b
    • 현재 브레이크 포인트 정보
  • cl
    • 브레이크 포인트 제거 (옵션은 b와 유사)
  • d
    • 모든 브레이크 포인트 제거

진행 명령어

  • r (run)
    • 프로그램 실행 (디버거 모드에서 해당 프로그램을 실행)
  • k (kill)
    • 프로그램 수행 종료
  • s (step)
    • 현재 행 수행 후 정지, 함수 호출 시 함수 안으로 진입
    • ex) s5
      • s 다섯번 수행과 동일
  • n (next)
    • 현재 행 수행 후 정지, 함수 호출 시 함수 수행 다음 행으로 이동 (함수 내부로 진입하지 않음)
    • ex) n5
      • n 다섯번 수행과 동일
  • c (continue) [n]
    • 다음 브레이크 포인트까지 진행
    • 다음 n번의 브레이크 포인트는 건너뛰고 진행
  • u
    • 현재 루프를 빠져나감
  • finish
    • 현재 함수를 수행하고 빠져 나감
  • return
    • 현재 함수를 수행하지 않고 빠져 나감
  • return 123
    • return과 같은나 리턴값을 지정
  • si
    • 어셈블리 명령어 단위의 수행 (진행은 step과 동일)
  • ni
    • 어셈블리 명령어 단위의 수행 (진행은 next와 동일)

와치 포인트 (watch point)

watch 변수명

특정 변수watch point를 설정하고, 특정 변수변경 될때마다 break가 걸리면서 이전/현재 값을 출력한다.

변수 출력 관련

  • info locals
    • 현재 스택의 로컬 변수 모두 출력
  • info variables
    • 전역 변수 모두 출력
  • p [변수명]
    • 변수명
      • 변수의 값 출력
    • pointer 변수
      • 주소 값 출력
    • *pointer 변수명
      • 해당 메모리의 값 출력
    • p $[레지스터명]
      • 레지스터 값 출력 (p $eax)
    • p *[포인터]@[숫자]
      • struct/class의 배열일 때, 배열의 크기를 알림 (p *pt@4)
    • p '[파일명]'::[변수명]
      • 변수명 중복 시, 특정 파일의 전역 변수 출력
    • p [함수명]::[변수명]
      • 변수명 중복 시, 특정 함수의 static 변수명 출력
      • 변수명이 중복될 때, 기본으로 local 변수가 출력
    • p /[출력형식][변수명]
      • 출력 형식에 맞춰 변수 값 출력
      • t
        • 2진수
      • o
        • 8진수
      • d
        • 부호없는 10진수
      • u
        • 부호없는 10진수
      • x
        • 16진수
      • c
        • 최초 1바이트 값을 문자형으로 출력
      • f
        • 부동 소수점
      • a
        • 가장 가까운 심볼의 오프셋을 출력
      • p (캐스팅)[변수명]
        • 변수를 캐스팅하여 출력 (p (char*)ptr)
      • p [포인터변수 or 배열]+[숫자]
        • 특정 주소 + 숫자 위치 출력 (p (array[1]+4))
      • p [변수명] = [value]
        • 특정 변수의 값을 설정
  • info registers
    • 레지스터 전체 출력
  • info all-registers
    • MMX 포함 레지스터 전체 출력
  • display [변수명]
    • 매번 p 명령을 입력하기가 힘드니 특정 변수 진행 중 계속 출력
    • p와 동일한 방식으로 출력 형식 지정 가능
    • disable display [번호]
      • 일시적으로 디스플레이 중단
    • enable display [번호]
      • 중단했던 번호 다시 출력
    • undisplay [번호]
      • 출력하던 diplay 변수 제거

스택 상태 검사

  • info f
    • 스택 프레임 내용 출력
  • info args
    • 함수 호출시 인자 출력
  • info locals
    • 함수의 지역 변수 출력
  • info catch
    • 함수의 예외 핸들러 출력
  • bt
    • 전체 스택 프레임 출력 (콜 스택)
  • frame [스택번호]
    • 스택 번호의 스택 프레임으로 이동
  • up
    • 상위 스택 프레임으로 이동
    • ex) up [숫자]
      • 숫자만큼 상위 스택 프레임으로 이동
  • down
    • 하위 스택 프레임으로 이동
    • ex) down [숫자]
      • 숫자만큼 하위 스택 프레임으로 이동

메모리 상태 검사

  • x/[범위][출력 형식][범위의 단위] [메모리 주소 or 함수명]
    • 범위는 기본 4byte 단위
    • [출력 형식]
      • t
        • 2진수
      • o
        • 8진수
      • d
        • 부호있는 10진수
      • u
        • 부호없는 10진수
      • x
        • 16진수
      • c
        • 최초 1byte 값을 문자형으로 출력
      • f
        • 부동 소수점
      • a
        • 가장 가까운 심볼의 오프셋 출력
      • s
        • 문자열 출력
      • i
        • 어셈블리 형식으로 출력
    • [범위의 단위]
      • b
        • 1byte 단위
      • h
        • 2byte 단위
      • w
        • 4byte 단위
      • g
        • 8byte 단위
    • ex)
      • x/10i main : main
        • 함수로부터 40byte를 어셈블리로 출력
      • x/10 main : main
        • 함수로부터 40byte를 출력
      • x/10b 0x12340000
        • 주소로부터 10byte를 출력

기타

  • disas [함수명]
    • 특정 함수의 어셈블리 코드 출력
  • disas [주소] [주소]
    • 주소 사이의 어셈블리 코드 출력
  • call [함수명(인자)]
    • 특정 함수를 인자값으로 호출
  • jump *[주소]
    • 주소로 강제적으로 분기
  • jump [행번호]
    • 특정 행으로 강제 분기
  • jump [함수명]
    • 특정 함수로 강제 분기
  • info signals
    • signal 종류 출력
  • signal [시그널명]
    • 디버깅중인 프로세스에 시그널 전달 (signal SIGKILL)
  • set {타입}[주소] = [값]
    • 특정 메모리에 값 지정 (set {int}0x12340000 = 100)
  • info 탭키
    • info로 확인 가능한 명령어 출력

환경 설정

  • info set
    • 설정 가능한 내용 출력
  • set prompt euclid
    • 프롬프트를 euclid로 변경

0개의 댓글