변수와 레지스터값 검사

MySprtlty·2022년 7월 12일
0

gdb

목록 보기
7/12
post-thumbnail

🏷️변수와 레지스터값 검사

  • 사실 디버거의 가장 주된 사용 목적은 특정한 시점에서의 메모리값과 레지스터값을 확인하기 위함이다.

📌info

  • info 명령어는 정보를 출력할 때 사용하는 명령어다.

1. info locals

  • 현재 스택 프레임에서 지역 변수들의 값을 출력한다.

2. info variables

  • 전역변수 리스트를 확인할 수 있다.

3. info registers

  • 레지스터 값(architectural registers)을 출력한다.
  • 주로 축약형으로 i r로 쓰인다.

4. info all-registers

  • MMX 레지스터를 포함하여 모든 레지스터 값을 출력한다.
    • cf) MMX는 single Instruction으로 여러 데이터를 처리하는 Instruction Set이다.

📌p

  • 🖇️cf) p stands for print
  • 주 목적은 출력이지만 그 외 여러가지 기능이 있다.

1. p {변수명}

  • 변수값을 출력한다.
  • 🔍ex) i변수값 출력
(gdb) p i

2. p {함수명}

  • 함수의 주소값을 출력한다.
  • 🔍ex)
(gdb) p func

3. p *{포인터}

  • 포인터가 가리키는 주소의 값을 출력해준다.
  • C언어 문법의 간접 참조 연산자(*)와 동일하게 사용하면 된다.
  • 만약 이중포인터라면 간접 참조 연산자를 두 번 붙이면 된다. (**)
  • 🔍ex)
(gdb) p *ptr
(gdb) p **pptr

4. p ${레지스터명}

  • 레지스터 값을 출력한다.
  • 🔍ex) x86_64의 instruction pointer register (program counter)의 값을 출력
(gdb) p $rip

5. p *{배열 포인터}@배열 크기

  • 포인터가 가리키는 것이 배열의 원소라면, p *{포인터}로는 첫 번째 원소밖에 출력되지 않는다.
    • 🔍ex) pointer to array of int 타입
  • gdb에게 포인터가 가리키는 것이 배열의 원소라는 것을 알리는 것이다.

6. p '{파일명}'::{변수명} p {함수명}::{변수명}

  • static storage duration obejct를 지정하여 출력한다.
    • 🖇️cf. 당연히 auto object는 지정하지 못한다.
  • 🔍ex) test.c의 전역 변수와 func의 static 지역 변수의 값을 출력한다.
(gdb) p 'test.c'::i
(gdb) p func::i

7. p/{출력 형식} {변수명}

  • 출력 형식을 지정할 수 있다.

  • 사용 가능한 출력 형식은 다음과 같다.

    출력 형식설명
    t2진수 (two)
    o8진수 (ocat-)
    d10진수 (deci-)
    u무부호 10진수 (unsigned)
    x16진수 (hexa)
    c최초 1바이트 값을 문자형으로 출력 (char)
    f부동 소수점 값 형식 (float)
    a가장 가까운 심볼의 offset을 출력
  • 16진법 출력을 가장 많이 사용한다.

  • ex) 변수 i의 값을 16진법으로 출력

(gdb) p/x i

8. p {cast operator} {변수명}

  • gdb에게 변수에 대한 타입 정보를 줘야 할 때 사용한다.
  • C언어 cast operator와 같은 문법이다.
  • 🔍ex) i를 pointer to char type으로 해석해서 출력
(gdb) p (char *)i

9. p ({포인터}+{정수})

  • 포인터 + 정수연산이 가능하다.
  • 🔍ex)
(gdb) p (array[3]+2)

10. p {변수명} = {값}

  • 변수의 값을 설정한다.
  • 🔍ex)
(gdb) p i = 123

0개의 댓글