TIL31 ✨

YaR Lab·2023년 6월 4일
0

TIL✨

목록 보기
21/135
post-thumbnail

23.06.05

Static Dispatch

호출 대상이 고정된 경우에 사용
컴파일 타임에 메서드 호출의 실제 구현을 결정하는 디스패치 방식
컴파일러가 호출할 메서드를 컴파일 시점에 정확히 알고 있음
호출 대상의 타입이 정적으로 결정
컴파일러는 호출 대상의 타입을 통해 정적으로 해당 타입의 메서드를 호출하는 코드를 생성
성능 상 이점이 생김
대부분의 함수 호출은 정적 디스패치로 처리됨

Dynamic Dispatch

동적 디스패치는 호출 대상이 실행 시점에 결정되어야 하는 다형성(polymorphism)이 필요한 경우에 사용
런타임에 메서드 호출의 실제 구현을 결정하는 디스패치 방식
동적 디스패치는 호출 대상의 타입이 런타임에 동적으로 결정
호출될 메서드의 실제 구현은 호출 시점에서 검색
상속과 다형성을 지원
호출 대상의 타입이나 호출되는 메서드의 구체적인 구현을 동적으로 결정
가상 함수 테이블(virtual function table) 또는 가상 함수 포인터(virtual function pointer)를 통해 호출 대상의 타입에 따라 실제로 실행될 메서드를 찾음
런타임 오버헤드 가능성이 있음(주로 가상 함수를 사용하는 경우)

localizedError

Equatable

LLVM

Apple 에서 진행한 Compiler에 필요한 Toolchain 개발 프로젝트
각 컴포넌트들의 재사용성을 중시해서, 모듈화가 잘 돼있음

LLDB(Low-Level Debugger)

Xcode IDE에 기본으로 내장되어있는 Commad-Line Debug 환경
LLVM의 Debugger Component를 개발하는 서브 프로젝트
Breakpoint에서 멈추거나, pause 버튼을 통해 실행이 정지되면 Debug콘솔이 나타남

(lldb) command [subcommand] -option "this is argument"

Command, Subcommand

LLDB 내 Object의 이름
Command에 따라 사용가능한 Subcommand 종류가 다름

Option

Command 뒤 어느 곳에든 위치 가능
-(hyphen)로 시작

Argument

공백이 포함 되는 경우 "" 묶어줌

도움말

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

# 특정 Command의 Subcommand나, Option이 궁금하다면,
(lldb) help breakpoint
(lldb) help breakpoint set
# Apropos: 원하는 기능의 명령어가 있는지 관련 키워드를 통해 알아볼 수있는 명령어
(lldb) apropos "refernce count"

Execute Point

breakpoint line의 녹색 햄버거 버튼을 이용해 실행 지점을 변경 할 수 있음
멈춰있는 실행 지점 변경 가능

run, continue

# 현재 프로그램을 중단하고, 새로운 Build/Run을 진행
(lldb) run
# 다음 BreakPoint가 나타날때까지 프로그램 진행
(lldb) continue

Breakpoint 지정

  • Breakpoint setting
# Breakpoint를 만드는 명령어
(lldb) breakpoint set [option] "arguments"
# 대부분의 명령어와 옵션들은 command 맨 앞 1~2개 알파벳으로 줄여서 사용 가능
(lldb) br s [option] "arguments"
  • Function Name
# 함수 이름을 이용한 break
(lldb) breakpoint set --name viewDidLoad
(lldb) b -n viewDidLoad
# –func-regex (-r) option 정규표현식을 활용
(lldb) breakpoint set  --func-regex '^hello'
(lldb) br s -r '^hello'
# 'breakopint set --func-regex'는 줄여서 'rb'로 사용 가능
(lldb) rb '^hello'
  • File
# 파일 이름과 line 번호를 이용한 break
# –file (-f), –line (-l) option 이용
# 특정 파일의 20번째 line에서 break 
(lldb) br s --file ViewController.swift --line 20
(lldb) br s -f ViewController.swift -l 20
  • Condition
# contidion (-c) option을 이용하여, breakpoint에 원하는 조건 걸기
# -c option 뒤의 expression이 true인 경우에만 breakpoint에서 멈춤
# viewWillAppear 호출시, animated가 true인 경우에만 break
(lldb) breakpoint set --name "viewWillAppear" --condition animated
(lldb) br s -n "viewWillAppear" -c animated
  • Command 실행 & AutoContinue
# command (-C) option을 이용하면 break시 원하는 lldb command를 실행
# auto-continue (-G) option의 기능은 auto continue
# auto continue: command 실행 후 break에 걸린채로 있지 않고 프로그램을 자동 진행
(lldb) breakpoint set -n "viewDidLoad" --command "po $arg1" -G1
(lldb) br s -n "viewDidLoad" -C "po $arg1" -G1
  • b(_regexp-break) Command
# _regexp-break는 간단하게 Breakpoint를 생성하는 Shorthand Command
# b로 줄일 수 있음
# 특정 이름을 가진 function에서 break
(lldb) _regexp-break viewDidLoad
(lldb) b viewDidLoad
# 현재 파일 20번째 line에서 break
(lldb) b 20
# 특정 파일 20번째 line에서 break
(lldb) b ViewController.swift:20
# 현재 파일 내 특정 text를 포함한 line에서 break
(lldb) b /stop here/
# 특정 주소값에서 break
(lldb) b 0x1234000

Breakpoint 목록

breakpoint list command를 통해 현재 프로그램에 생성되어있는 Breakpoint의 목록을 확인
Breakpoint의 id와 이름, hit-count 정보, enable 여부, source 상의 위치, 주소값 등등 유용한 정보가 포함돼 있음
hit-count: Breakpoint지점이 실행되면 Debugger는 hit count를 1씩 늘려가며 기록, disable상태이면 기록 하지 않음

# breakpoint 목록 전체 출력
(lldb) breakpoint list
(lldb) br list
# breakpoint 목록 간단하게 출력
# –brief (-b) option을 통해 간단한 내용을 확인
(lldb) br list -b
# 특정 id를 가진 breakpoint의 정보만 출력
(lldb) br list 1

Breakpoint 삭제, 비활성화

delete, disable Subcommand를 이용해 Breakpoint를 삭제하거나, 비활성화

# breakpoint 전체 삭제
(lldb) breakpoint delete
(lldb) br de
# 특정 breakpoint 삭제
(lldb) br de 1
# breakpoint 전체 비할성화
(lldb) breakpoint disable
(lldb) br di
# 특정 breakpoint 비활성화
(lldb) br di 1.1

Stepping

프로세스를 단계별로 진행하면서 상태 변화를 관찰해 볼 수 있는 기능

  • Stepping Over
# 현재 Break 걸려있는 지점에서 바로 다음 Statement로 Step Over
(lldb) next
(lldb) n
  • Stepping In
# Statement가 Function Call 인경우 Debugger를 해당 함수 내부에 위치한 시작 지점으로 이동
# Debug Symbol이 없는 함수에 대해 Stepping In을 무시하기 때문에
# Stepping Over와 비슷하게 동작하는 경우가 있음
(lldb) step
(lldb) s
  • Stepping Out
# 현재 진행중인 function이 return 될때까지 프로그램을 진행한 후 Break를 걸어줌
# Stack Memory 관점에서 Stack Frame을 Pop하는 것과 동일
(lldb) finish

Expression

(lldb) expression -O --
(lldb) help po

simbolic

https://developer.apple.com/documentation/xcode/setting-breakpoints-to-pause-your-running-app

이걸 활용해서 Objective-C expression을 사용 가능

이전 (lldb) expression -l objc -O -- Command

이후 (lldb) command alias pojc expression -l objc -O — : 별명 짓기

→ 빌드 시 Alias 초기화 방지 : LLDB 초기화를 위해 사용되는 ~/.lldbinit 파일에 원하는 Command Alias를 추가해두면, 별칭을 매번 정해주지 않고 계속 사용 가능

https://meetup.nhncloud.com/posts/315

자동 변수 할당명

캡쳐링
일시정지
run 한 상태에서 커멘드+컨트롤+y 누르면 브레이킹 포인트 직접 안 넣고 lldb가능하대요

0개의 댓글