Low Level Debuger
Command-Line Debug 환경
- 실행중인 프로세스의 값을 변경하거나 흐름을 제어
- 다양한 디버깅 작업 가능
Apple이 진행한 컴파일러에 필요한 Toolchain 개발 프로젝트
이렇게 잘 모듈화 되어있는 컴포넌트들을 이용해 진행된 주요 서브츠로젝트들
- LLVM Core
- Clang
- libc++
- LLDB
LLVM의 디버거 컴포넌트를 개발하는 서브 프로젝트
실행중인 프로젝트의 프로세스가 Breakpoint에서 멈추거나, pause 버튼으로 일시정지되면 디버그 콘솔에 LLDB 콘솔이 나타남
( 터미널에서 lldb -n Finder
로도 사용 가능 - cstrutil status를 통해 System Integrity Protection을 disable한 후에)
(lldb) command [subcommand] -option "this is argument"
<예시>
(lldb) breakpoint set --file test.c --line 12
사용 가능한 Subcommand, Option 리스트나 사용법을 보여줌
<예시>
(lldb) belp
: LLDB에서 가능한 Command (lldb) help breakpoint
: breakpoint의 Subcommand나 Option원하는 명령어를 키워드로 검색
<예시>
(lldb) apropos "reference count"
: reference count와 관련된 명령어가 있나?프로그램에서 문제가 되는 지점에서 문제가 되는 지접을 찾아 멈추거나 여러 조건을 바꾸며 테스트하기 위한 지점
(lldb) breakpoint set [option] "argument"
br s [option] "argument
(lldb) breakpoint set --name viewDidLoad
(= b -n viewDidLoad)(lldb) breakpoint set --func-regex '^hello
(= rb '^hello) (lldb) br s --file ViewController.swift --line 20
br s -f ViewContoller.swift -l 20
(lldb) breakpoint set --name "viewWillAppear" --condition animated
br s -n "viewWillAppear" -c animated
(lldb) breakpoint set -n "viewDidLoad" --command "po $arg1" -G1
br s -n "viewDidLoad" -C "po $arg1" G!
(lldb) breakpoint list
(lldb) breakpoint delete (= br de)
: breakpoint 전체 삭제(lldb) breakpoint disable (= br di)
: 전체 비활성화프로세스를 단계별로 진행하는 기능
(lldb) next 커맨드
(= n) : 현재 브레이크 지접에서 다름 문장으로 이동(lldb) step 커맨드
(= s) : 다음 문장이 함수 호출인 경우 해당 함수의 시작 지점으로 이동(lldb) finish 커맨드
: 현재 함수가 return 될 때까지 진행 후 Brake를 걸어줌
run
- 현재 프로그램을 중단하고 새로운 Build/Run 실행continue
- 다음 Breakpoint가지 실행)
멈춰있는 동안 새로운 동작 실행
(lldb) expression
객체에 대한 다양한 정보를 콘솔에 출력
(lldb) po
=(lldb) expression -O --
-> 실무에서 가장 많이 사용되는 Command
(-O는 object의 description을 출력하는 옵션)
override var debugDescription: String {
return "이 객체의 debugDescription은 \(super.debugDescription) 입니다."
}
// (lldb) po slef -> 이 객체의 debugDescription은 <UpDownGame.MainViewController: 0x13be07bd0> 입니다.
<예시>
(lldb) expression self.view
= (e self.view
) : 현재 뷰의 정보 출력(lldb) e $R(숫자).backgroundColor = UIColor.Blue
로 배경색 변경 가능(lldb) continue
이어서 실행(배경색이 변경됨)사용하고자 하는 변수명 앞에 $를 붙임
<예시>
(llbd) expr let $someNumber = 10
(llbd) expr var $someString = "some string"
(llbd) expression
입력 후 엔터를 누르면 여러 줄 명령을 입력할 수 있음 (다시 엔터 키로 완료)
--ignore-breakpoints
: expression 실행 중 만나는 breakpoint를 무시할지 선택(기본은 true)(lldb) expression --ignore-breakpoints true --
=(ex -i 1 --
) : 그냥 진행(lldb) expression --ignore-breakpoints false --
=(ex -i 0 --
) : 멈춤unsafeBitCast(to:)
함수 이용<예시> 버튼의 레이블 주소를 알 때
expr -l swift -- var $myLable = unsafeBitCast(to: 레이블 주소)
Module에서 나타나는 Symbol에 대한 자세한 정보를 알아낼 수 있음
ex) 프레임퉈크에 대한 private한 정보들(private class, method 등)
- Modeule : 프로세스의 로드되어 실행되는 코드 (프레임워크, 라이브러리, 플러그인 등)
- Sumbol : 메서드, 변수, 클래스 등 사람의 눈으로 구별할 수 있는 소스 코드의 작은 단위의 Symbol
- Symbol Table : 컴파일된 Binary를 메서드, 변수, 클래스 등으로 상호 Mapping하는 역할
- Symbolicate : Binary가 Symbol로 변역되는 것
(lldb) image list
: 현재 프로세스에 Load된 모든 모듈의 정보를 출력(lldb) image dump
: 모듈의 세부적인 정보를 dumpling(기억장치의 내용을 기록)(lldb) image dump symtab UIKitCore -s address
(lldb) image lookup
: Module 정보를 필터링해서 출력(lldb) image lookup -F "함수이름"
-a "주소값"
-f "파일이름"
-f "파일이름" -l 15
-rn "정규식 표현"
(lldb) image lookup
: Symbolicate 되지 않은 Crash Log 출력
- Binary Image Name
- Stack Address : Symbol의 스택 메모리 주소값
- Load Address : Application이 Load된 주소값
- Offset : Stack Address와 Load Address 사이의 오프셋
문제가 생긴 지점을 찾았다면?
1. 터미널에 (lldb) target create "dSYM 경로"
: lldb를 통해 dYSM 파일에 접근
2. (lldb) image lookup --address 크래시 주소
: 문제의 Symbol 위치 검색
3. 어디서 Crash가 발생했는지 확인
반복해서 사용할 명령어에 별명 붙이기
(lldb) alias 별명 "줄이고 싶은 Command"
<예시>
(lldb) expression -l objc -O --
: Swift에서 Objective-C expression을 출력하는 명령어(lldb) command alias pojc expression -l objc -O --
: pojc로 별명 지정(lldb) pojc "[Objective-C Expression]
형태로 사용 가능