티스토리 뷰

Swift

LLDB(Low-Level Debugger)

강경 2021. 4. 15. 17:05
728x90
반응형

프로그래밍 과정에서 가장 오래⏰걸리는건
디버깅하는 부분이라고 생각합니다!
그만큼 중요하다는 것이죠👍🏻


그래서 이번에는, 제가 공부중인 Swift 디버깅에 찰떡인 LLDB에 대해 정리해 보았어요📝
(Xcode의 기본 디버거로 내장되어 있기 때문이죠😲)



LLVM

위키피디아에서는,

프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성된 컴파일러 기반구조

라고 표현합니다.


어렵고 복잡하다면,
그냥 한번에 여러가지 언어를 잘 알아먹는 컴파일러라고 생각하면 돼요!
(본래는, 언어당 하나씩 컴파일러를 매칭시켰다고 하더군요😲)
그리고, 각 컴포넌트들의 재사용성♻️을 중시해서,모듈화🧱가 잘 되어있다는 특징이 있습니다.

LLDB

위키피디아에서는,

클랭 식(expression) 파서와 LLVM 디스어셈블러와 같은 더 커다란 LLVM 프로젝트로부터 기존 라이브러리들을 광범위하게 사용하는 재사용 가능한 구성 요소들의 집합으로 구성된 소프트웨어 디버거

라고 말하는데...


이역시 간단하게,
LLVM이 컴파일한 애플리케이션을 디버깅할 때 쓰는 툴이라고 생각하면 돼요!
(LLVM front-end debugger🕵🏻‍♂️🪲)


그렇기 때문에 Low-Level 컨트롤이 가능한 모듈들로 이루어져 있고,
기계어🤖에 가까운 영역까지 디버깅 가능하다는 장점이 있습니다.
(현재 C, C++, Objective-C, Swift를 지원한다고 합니다!)

명령어 구성

LLDB는 다음과 같은 명령어 구조를 가집니다.

(lldb) [A] [B] [C] [D]

첫 번째로 A부분은 Command,
두 번째로 B에는 Subcommand,
세 번째로 C에는 Option,
네 번째로 D에는 Argument가 들어갑니다.

🤨?

예를 들어,

(lldb) breakpoint set --file "test.swift" --line "10"

이런 명령어가 있다면,
첫 번째의 breakpointCommand,
두 번째의 setSubcommand,
세 번째의 --file, --lineOption,
네 번째의 "test.swift", "10"Argument를 나타내는 것이죠!😲


근데! 위의 예시를 그냥 쭉 읽어보면,
"test.swift파일의 10번째 줄에 중단점을 세팅하시오!"
같은 명령같지 않나요..?
(와우 멋져라🤩)
점점 더 배우고 싶어지는 마력(?)이 느껴지는군요🧙🏻‍♂️


여튼..

  • CommandSubcommand: LLDB 내 Object의 이름을 나타냅니다.
  • Option: Command 뒤 어느 곳에든 위치 가능하며, -(hyphen)으로 시작합니다.
  • Argument: Option에 대한 값으로 그냥 써줘도 되지만, 공백이 포함 되는 경우 때문에, ""로 묶어주는게 좋습니다.

필수 명령어

꼭!! 필수로 알아야 하는! 매우 중요한 두 가지 명령어가 있습니다⚠️


  1. Help
    우리가 구글링을 위해 웹브라우저를 여는 수고를 덜어주는 명령어에요😅
    해당 문법을 이용하면 사용가능한 Subcommand, Option 리스트나 사용법을 알 수 있어요!

    # LLDB에서 제공하는 Command를 나타냅니다.
    (lldb) help
    # 특정 Command의 Subcommand나, Option을 나타냅니다.
    (lldb) help breakpoint
    (lldb) help breakpoint set
  2. Apropos
    "혹시 ~~한 명령어가 있나?" 싶을때 쓰는 명령어 입니다.

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

    이런 식으로 사용하면 됩니다👍🏻




이렇게, LLVMLLDB에 대해 정리해봤어요!
앞으로는 눈대중으로 의심가는 함수 앞뒤로 print()를 찍는 등의 이상한 짓😅 을 하지 않는,
고급스럽고 세련된 디버깅을 할 수 있을거 같아요🤓


이해가 안되는 부분이나, 틀린 부분이 있으면 코멘트를 남겨주세요!
피드백은 정말정말 환영입니다🎉🎉


Reference

위키피디아
야곰닷넷 LLDB정복

728x90
반응형

'Swift' 카테고리의 다른 글

URLSession  (0) 2021.05.20
고차함수 (Higher Order Functions, 고계함수)  (0) 2021.04.12
값 캡쳐 (Capturing Values)  (0) 2021.03.25
후위 클로저 (Trailing Closures)  (0) 2021.03.25
클로저 표현 (Closure Expressions)  (0) 2021.03.23