🏷️변수와 레지스터값 검사
- 사실 디버거의 가장 주된 사용 목적은 특정한 시점에서의 메모리값과 레지스터값을 확인하기 위함이다.
📌info
- info 명령어는 정보를 출력할 때 사용하는 명령어다.
1. info locals
- 현재 스택 프레임에서 지역 변수들의 값을 출력한다.
2. info variables
- 레지스터 값(architectural registers)을 출력한다.
- 주로 축약형으로
i r
로 쓰인다.
- MMX 레지스터를 포함하여 모든 레지스터 값을 출력한다.
- cf) MMX는 single Instruction으로 여러 데이터를 처리하는 Instruction Set이다.
📌p
- 🖇️cf) p stands for print
- 주 목적은 출력이지만 그 외 여러가지 기능이 있다.
1. p {변수명}
(gdb) p i
2. p {함수명}
(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/{출력 형식} {변수명}
-
출력 형식을 지정할 수 있다.
-
사용 가능한 출력 형식은 다음과 같다.
출력 형식 | 설명 |
---|
t | 2진수 (two) |
o | 8진수 (ocat-) |
d | 10진수 (deci-) |
u | 무부호 10진수 (unsigned) |
x | 16진수 (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 ({포인터}+{정수})
(gdb) p (array[3]+2)
10. p {변수명} = {값}
(gdb) p i = 123