TIL(Today I Learned)
12월 24일(목)
학습내용
- Debugging : 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적인 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업 과정.
- Build: 소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 일련의 과정. 전처리 → 컴파일 → 링크 과정을 거친다.
- Compile : 소스 코드를 목적 코드로 바꾸는 과정.
- Link : 목적 코드를 연결하는 과정. 목적 코드가 실행되기 위해 필요한 라이브러리 등을 연결한다.
- GCC(GNU Compiler Collection): GNU(자유소프트웨어 진영)에서 만든 컴파일러.
- LLVM : GCC을 사용하면 소스코드를 공개해야하기 때문에 대안으로 만든 컴파일러. Chris Lattner가 개발하였다. Front End, Middle End, Back End로 구분 된다. 바이트 코드 언어 처럼 중간 언어를 통해서 아키텍쳐에 맞게 기계어로 번역한다. 이로써 ‘언어-아키텍처’의 조합의 수를 획기적으로 줄였다.
- Clang : Objective-C 등을 위한 컴파일러 프론트엔드이다.
- LLDB : LLVM front-end debugger
- 프로그래밍 언어의 분류
- 컴파일 언어 : 소스코드를 기계어로 미리 번역하는 언어, Swift, C, C++, GO …
- 바이트 코드 언어 : 소스코드를 중간언어로 미리 번역하는 언어, Java, C# …
- 인터프리터 언어 : 실행할때 소스코드를 기계어로 번역하는 언어, BASIC, JavaScript, Python, Ruby …
- 메모리 그래프 확인하는 방법
- Debug Navigator에서 우측 상단의 버튼을 View Memory Graph Hierarchy로 변경한다.
문제점/고민한점
- Option의 -가 한개일때랑 두개일때의 차이는?
- 두번째 문제에서 심볼에 Break Point를 설정한다고 하는데 심볼이 무엇일까?
- LLDB의 v 명령어 설명에서 나오는 call stack frame이 뭐지?
- LLDB 을 사용하려면 어떻게 실행시키는 것일까? breakpoint에 걸릴때만 사용할 수 있는건가?
- LLDB 문서에 GDB와 LLDB 명령어 두개가 나오는데, GDB와 LLDB 차이는?
- p, po, v 차이에 대해서 이야기 하다가, Debug Description에 대해서 나왔는데 Debug Description이 뭘까?
해결방법
- Option의 -가 한개일때랑 두개일때의 차이는?
- 한개는 축약형, 두개는 완전형.
- 두번째 문제에서 심볼에 Break Point를 설정한다고 하는데 심볼이 무엇일까?
- 변수명, 함수명 같은 identifier를 symbol이라고 한다.
- LLDB의 v 명령어 설명에서 나오는 call stack frame이 뭐지?
- v 명령어는 현재 stack frame의 변수들을 보여준다고 설명에 나와있다.
- 여기서 나오는 stack의 의미는 메모리 stack 영역을 의미할거라고 추측하는데, 왜 stack이라고 안하고 stack frame이라고 할까?
- stack영역은 여러 개의 stack frame으로 구성되어있다.
- stack frame은 하나의 subroutine(함수)가 호출되면 stack영역에 subroutine과 관련된 모든 것이 저장되는 frame이다.
- stack frame에는 subroutine의 parameter, 반환 주소, 로컬 영역의 데이터 등을 포함하고 있다.
- LLDB 문서에 GDB와 LLDB 명령어 두개가 나오는데, GDB와 LLDB 차이는?
- LLDB는 LLVM 프로젝트를 위한 디버거 이고, GDB는 GNU 프로젝트를 위한 디버거이다.
- LLDB 을 사용하려면 어떻게 실행시키는 것일까? breakpoint에 걸릴때만 사용할 수 있는건가?
- Xcode IDE에서 LLDB 콘솔은 실행중인 프로젝트의 프로세스가 Breakpoint에서 멈추거나, pause 버튼을 통해 실행이 일시정지되면 Xcode 화면 하단 Debug 콘솔에 나타납니다.
- p, po, v 차이에 대해서 이야기 하다가, Debug Description에 대해서 나왔는데 Debug Description이 뭘까?
- 구현하는 타입에 CustomDebugStringConvertible을 채택하고, debugDescription이라는 연산 프로퍼티를 구현한다. 이렇게 하면 디버깅할때 해당 개체를 출력하면 debugDescription에서 반환하는 내용을 출력하게 된다.
참고