LLDB 내용정리

핫사니
|2022. 10. 31. 23:11

- 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 사용법

30

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

 

po, p fr v 순서

 

- 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