- LLDB 탄생배경
LLDB 탄생배경 이전에 LLVM 개념아래에서 나온개념이므로 LLVM에대해 먼저 알아보자.
1. LLVM 정의
정의: Apple에서 진행한 Compiler Tollchain 개발 프로젝트 라고 정의되있음.
(내용이 어려운데 "애플에서 컴파일에 필요한것들 만들려고 프로젝트를 진행했다." 라고 생각하자.)
특징:
- Low level virtual Machine의 줄임말이지만, 실제로 가상머신과 거리가있어서 현재는 프로젝트명으로만 쓰임.
- 재사용성 중시해서 모듈화가 잘되어있음
- LLVM Core,Clang, Compiler-rt, LLDB 등..
2.LLDB 란?
정의: LLVM의 디버거 컴포넌트를 개발하는 역할로 Xcode에 내장된 기본 Debugger 환경
- 쉽게말해 Xcode IDE에 기본으로 내장되어있는 명령어 기반 Debug 환경
- LLDB(low level debugger) 의 약자로 기계어에 가까운 영역까지 디버깅가능.
- LLDB 명령어를 이용하여 실행중인 프로세스의 값을 변경, 흐름을 제어 하는 등 다양한 디버깅작업을 가능하게해주는 Xcode IDE에 내장된 디버깅 환경 -> 그냥 한마디로 디버깅 할수있는 도구
- 디버깅 사용법
1. LLDB 기본문법
lldb) command [subcommand] -option "this is argument"
- command,subcommand: lldb내 object 이름( ex) p, po, breakpoint 등)
- option: command 뒤에 어느위치에서든 가능 (-(hyphen)로 시작)
- 참고) option의 경우 줄여서쓸경우 하이픈 하나(-) 이고 기본적으로는 두개(—)를 씀 (
- Argument: 공백이 포함될수있으므로 ""로 묶어줄수있음
2. Edit BreakPoint 사용법
Name: breakpoint에 네이밍을 지정
Condition: 특정조건일떄 break 가 걸림( swift로 작성)
Ignore: 특정횟수 이후 break 걸림
Action: break 걸리기전 특정동작을 수행(LLDB 명령어,script,Sound 등)
Options:(체크시) Edit breakPoint에 설정한 동작은 수행하지만 break 걸리지않음.
- 주요 명령어
1. Expression
정의: breakpoint 걸려있을때 새로운 동작을 실행 및 정보를 출력할수있는 명령어
특징
- lldb는 내부적으로 값이 출력시 local variable을 $R~ 형태로 만들어 저장
- 빌드하지 않고도 기존변수를 수정하거나 생성할수도있음.
- 단축어: expresssion, expr, ex , e
- ex) expresssion self.view,
- e self.view.backgroundColor = .red
2. Watchpoint
정의: 특정 변수값이 바뀔 때 break를 걸리게 할수있다.(특정 변수 모니터링 개념)
특징
- 어쩔떈, 변수값이 언제 어디서 바뀌는지 알고싶을떄가있는데 로직이 복잡하면 어디서 변화하는지 체크하기 어렵다. 예를들면 Realm tasks 같은것들..
- 변수값이 일일이 수정되는곳마다 breakpoint를 만들지않아도 변수값을 추적할수있다.
- 모니터링 하는데 많은 CPU자원을 소모된다.
- 모니터링 할수있는 변수 갯수는 intel 4개 , ARM 2개로 제한
3.run
정의: 현재 프로세스 끝내고 다시 새로 빌드하여 run 시키는 명령어
특징
- 빌드 속도가 command + R(빌드) 할때보다 빠르다.
- lldb) run
4. jump
정의: 현재 쓰레드에 대해 특정 소스라인까지 이동할떄 쓰는 명령어
특징
- lldb) thread jump —line : 현재 쓰레드의 몇번째 라인으로 이동
ex) thread jump —line 10 : 코드라인이 10번쨰 라인으로 이동
- lldb) thread jump — by : 현재 줄에서 몇번쨰 줄만큼 이동
ex) thread jump —by 3 : 현재 줄에서 +3번째 줄만큼 건너뜀
5.p,po,fr v
정의: p,po,fr v 모두 값을 출력하기위한 명령어
특징
명령어 | Alias | 데이터 표현 | 차이점 | 사용 예시 |
po | expression --object-description -- | debugDescription 정보 활용 | 1.p와 표현방식이다름 2. p처럼 $R0,$R1이름으로 저장 X |
po self.view |
p | expression -- | lldb 내장된 formatter 활용하여 데이터 표현 | 1.expression과 동일한결과 출력 2. 결과값이 $R0,$R1 이름으로 저장 |
p self.view |
fr v / v | frame variable | lldb 내장된 formatter 활용하여 데이터 표현 | p, po와 다르게 1.컴파일 X, 메모리 바로읽어서 속도빠름 2. 현재 프레임 변수만 읽음 |
v self |
- WWDC 에서 p,po,v 동작원리
po: compile 을 한번거쳐서 description 을 거쳐 compile을 한번더해서 보기좋은 String 타입으로 나옴.
p: compile을 한번거쳐서 formatter를 통해 출력
- Dynamic type resolution 이란, 변수의 static 타입과 dynamic 타입 중 가장 정확한 타입을 찾는 것이다.
fr v/v : 컴파일을 거치지않고 메모리를 읽고 formatter에 출력
컴파일 순서대로 po < p < fr v 순서로 빠르다
'𝐢𝐎𝗦' 카테고리의 다른 글
CI/CD 란? (0) | 2023.02.04 |
---|---|
fastlane으로 배포 자동화 (0) | 2023.02.03 |
Observable과 Observer, Observable Lifecycle (0) | 2022.10.19 |
마이그레이션(migration) (0) | 2022.10.13 |
Method Swizzling (0) | 2022.10.12 |