관리 메뉴

스윞한 개발자

iOS - LLDB 본문

Swift 이론

iOS - LLDB

스윞남 2024. 4. 18. 14:07
728x90
반응형
SMALL

안녕하세요! 이번 포스팅에서는 LLDB에 대해 공부하고 정리해 보겠습니다.

 

## LLDB(Low Level Debugger)

먼저 공식 홈페이지부터 파해쳐 보겠습니다!


728x90

https://lldb.llvm.org

 

🐛 LLDB

Next Tutorial

lldb.llvm.org

 

LLDB란?

- LLVM의 디버거 컴포넌트를 개발하는 애플의 서브 프로젝트

- 디버거 - 디버깅 도구

- Xcode에 들어있는 도구

 

먼저 LLDB가 무엇인지 알기 위해서 LLVM에 대해 정리해 보겠습니다!

 

#LLVM

LLVM은 Apple에서 진행한 컴파일러에 필요한 Toolchain 개발 프로젝트입니다. 각 컴포넌트들의 재사용성을 중시하기 때문에 모듈화가 잘 되어있습니다. 

 

LLDB는 LLVM의 Debugger Component를 개발하는 서브 프로젝트입니다. LLDB를 사용한다면 실제 프로그램이 어떤 식으로 동작하는지 깊이 이해할 수 있습니다.

 

즉, LLDB란

애플에서 어떤 시스템을 개발할 때 필요한 프로그램 도구를 만들었는데 그 이름이 LLVM이고 이 툴체인 중 하나인 디버깅 툴이라고 정리해보겠습니다. (C, C++, Objective-C, Swift 등 많은 언어들을 지원합니다.)

 

#LLDB 시작하기

Xcode에서 실행 중인 프로젝트의 프로세스가 Breakpoint에서 멈추거나, 정지 버튼을 통해 일시정지 된다면 Xcode에서 LLDB Debug 콘솔이 나타나게 됩니다. 

 

LLDB에는 수많은 명령어와 해당하는 Subcommand, Option들이 존재합니다. 

 

* Help

해당 문법으로 사용가능한 Subcommand, Option 리스트나 사용법들을 보여주는 명령어입니다.

# LLDB에서 제공하는 Command가 궁금하다면,
(lldb) help

# 특정 Command의 Subcommand나, Option이 궁금하다면,
(lldb) help breakpoint
(lldb) help breakpoint set

 

* Apropos

원하는 기능의 명령어가 있는지 키워드를 통해 알아볼 수 있는 명령어입니다.

# reference count를 체크할 수 있는 명령어가 있을까? 궁금하다면,
(lldb) apropos "reference count"
# 결과
# The following commands may relate to 'reference count':
#    refcount -- Inspect the reference count data for a Swift object

 

LLDB의 여러 요소들이 있는데 그중 가장 중요하다는 Stepping에 대해 알아보겠습니다.

Stepping은 프로레스를 단계별로 진행하면서 상태 변화를 관찰하는 기능입니다.

 

*Stepping

- Stepping Over : (lldb) next Command를 사용하면, 현재 Break 걸려있는 지점에서 다음 Statement로 Step Over 할 수 있습니다. 

(줄여서 (lldb) n으로 사용 가능)

 

- Stepping In : 다음 Statement가 Function Call 인 경우 Debugger를 해당 함수 내부에 위치한 시작 지점으로 이동하게 해 줍니다. (lldb) step Command를 이용해 실행할 수 있습니다. (줄여서 (lldb) s로 사용 가능)

 

- Stepping Out : 현재 진행 중인 function이 반환될 때까지 프로그램을 진행한 후 프로그램 Break를 걸어주는 Stepping Action을 Stepping Out이라고 합니다. (lldb) finish Command로 실행할 수 있습니다. 

 

 

LLDB Console 상단에 위치한 버튼은 왼쪽부터 Step-Over, Step-In, Step-Out을 의미합니다.

 

* breakpoint

프로그램에서 디버깅할 때 정지될 지점을 설정하고 여러 가지 다른 시도를 해 봐야 합니다. 

(lldb) breakpoint set [option] "arguments"
(lldb) br s [option] "arguments"

위와 같이 breakpoint를 설정하고 이름을 넣어줄 수 있습니다.

 

// viewDidLoad 함수의 이름을 이용하여  break
(lldb) breakpoint set --name viewDidLoad
(lldb) b -n viewDidLoad

// ViewController.swift의 20번째 line에서 break!
(lldb) br s --file ViewController.swift --line 20
(lldb) br s -f ViewController.swift -l 20

// viewWillAppear 호출 시, animated가 true인 경우만 breakpoint!
(lldb) breakpoint set --name "viewWillAppear" --condition animated
(lldb) br s -n "niewWillAppear" -c animated

// ViewControler.swiftdml 17번째 라인에서 helloWorld가 "abc"인 경우 break
(lldb) ViewController.swift -l 17 -c 'helloWorld == "abc"'

이처럼, 다양하게 lldb를 이용해 breakpoint를 설정할 수 있습니다.

 

// breakpoint 리스트 확인
(lldb) breakpoint list
(lldb) br list

// 전체 breakpoint 삭제
(lldb) breakpoint delete
(lldb) br de

// 특정 breakpoint  삭제
(lldb) br de 1

// 전체 breakpoint 비활성화
(lldb) breakpoint desable
(lldb) br di

// 특정 breakpoint 비활성화
(lldb) br di 1.1

그리고 삭제, 비활성화, 리스트 확인 등 다양한 작업을 진행할 수 있습니다.

 

* po

lldb 명령어 중에 가장 많이 사용되는 것이 po입니다. 객체의 정보를 콘솔에 출력하는 명령어로 NSObject의 debugDescription 콘솔을 출력해 줍니다. 

 

* expression

(lldb) e를 사용하면 해당 정보를 콘솔에 출력합니다. (e = expression의 줄임 표현)

 

이번 포스팅에서는 lldb로 디버깅을 하는지 알아보고 정리해 보았습니다! 감사합니다!

 

 

 

위 글은 공식문서, 아래의 블로그 등을 참고해 작성하였습니다.


https://yagom.net/courses/start-lldb/

 

LLDB 정복 - 야곰닷넷

po 를 알고계신가요? 몰라도 상관없습니다. LLDB Debugging 배우러 갑시다! ?

yagom.net

https://zzoo789.tistory.com/entry/iOS-LLDBLow-Level-Debugger에-대하여

 

[iOS] LLDB(Low-Level-Debugger)에 대하여

✏️ Debugging이란? 디버깅(또는 디버그)이란 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업을 말한다. - 위키백

zzoo789.tistory.com

https://ch4njun.tistory.com/168

 

[IOS] lldb를 이용한 IOS Application 동적 디버깅 ( + Cheat Sheet)

lldb를 사용해 IOS의 Application 동적 디버깅을 진행하는 방법에는 두가지가 있다. 1) macOS의 xcode를 사용해 원격으로 디버깅을 진행하는 방법 2) lldb-10 tweak을 설치해 로컬에서 진행하는 방법 (별다른 S

ch4njun.tistory.com

728x90
반응형
LIST

'Swift 이론' 카테고리의 다른 글

Mac Catalyst 살펴보기  (2) 2024.12.29
Combine 알아보기  (0) 2024.08.05
iOS - 앱 생명주기(Lifecycle)  (0) 2024.04.17
Swift - ModernCollectionView  (0) 2024.04.14
Swift - CompositionalLayout  (2) 2024.04.13