: 디버거
- GDB를 사용하는 이유는 크로스 컴파일하는 경우에 필요하기 때문이다.
- 임베디드 환경에서 주로 크로스 컴파일을 사용해서 임베디드 리눅스 환경에 크로스 gdb만 지원되는 경우가 제법 많다.
CPU - 어셈블러 - C컴파일러 -> 리눅스 운영체제 - GCC 컴파일러 -> main() 함수 - printf, ..
A CPU (컴퓨터)
B CPU (임베디드/ARM) : 컴파일러 X
A CPU - 리눅스 운영체제 - A GCC(A CPU에서 동작하는 프로그램을 만듦) - program1, program2, program3 생성
- B GCC(크로스 컴파일러) - C언어 - 기계언어 - B CPU에서 동작
크로스컴파일에서는 GDB가 제공됨
$ gcc 소스파일 //컴파일
$ gcc -g 소스파일 //디버깅을 하기위해서 마킹을 해줘야함 -g 옵션으로
$ gdb -q 실행파일
(gdb) run //실행
(gdb) l //코드확인(10줄) -> enter 하면 다음 코드 이어서 나옴
(gdb) l 30 //코드 30줄 확인
(gdb) b 5 //브레이크 포인트 5번째 줄로 잡기
(gdb) run //브레이크 포인트 확인
(gdb) p i //변수에 들어있는 값 확인
(gdb) disas main // 어셈블리단 확인가능
(gdb) quit //gdb 종료
* gdb 를 통해 디버깅도 가능하고 어셈블리 소스도 볼 수 있다
컴파일러가 변수를 랜덤으로 메모리주소에 저장한다.
메모리주소와 변수명이 1:1 매칭된다.