- Published on
๐ Swift - LLDB
- Authors
- Name
- ์ด์ฐฝ์ค
- LLDB (Low-Level-Debugger)
- LLDB ์ฌ์ฉํ๊ธฐ
- help์ apropos
- Breakpoint
- Breakpoint ๋ง๋ค๊ธฐ
- Breakpoint ๋ฆฌ์คํธ ํ์ธํ๊ธฐ
- Breakpoint ์ญ์ /๋นํ์ฑํํ๊ธฐ
- Stepping
- Expression
- po
- variable ์ฌ์ฉํ๊ธฐ
LLDB (Low-Level-Debugger)
LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the largerย LLVM Project, such as the Clang expression parser and LLVM disassembler.
LLDB๋ LLVM(Low-Level-Virtual-Machine)์ ์๋ธ ํ๋ก์ ํธ๋ค ์ค ํ๋๋ก์, ๋ง ๊ทธ๋๋ก ๋๋ฒ๊ฑฐ์ ๋๋ค. LLVM ํ๋ก์ ํธ๋ ํฌ๋ฆฌ์ค ๋ํธ๋์ ์ํด ์์๋์๊ณ , ์ดํ ์ ํ์ ์์ ๋์ด ํ์ฌ๋ Xcode์ ๊ธฐ๋ณธ ๋๋ฒ๊ฑฐ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
LLDB ์ฌ์ฉํ๊ธฐ
LLDB๋ Xcode์ ํ๋จ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์ผ์ ์ ์ง๋๊ฑฐ๋ breakpoint์ ๊ฑธ๋ ธ์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฐ ํ๋ฉด ๋ง์ด ๋ณด์ จ์ฃ ?
์ ๋ LLDB๋ฅผ ๋ชจ๋ฅผ ๋ 11๋ฐ์๋ฒจ ๋ญ ์ด๋ฐ๊ฑด๊ฐ..? ํ๋๋ฐ lldb๋ผ๋ ๋๋ฒ๊ฑฐ๋ผ๋ ๋ป์ด์์ด์.. ๐
(lldb) <noun> <verb> [-options [option-value]] [argument [argument...]]
LLDB์ ๋ช ๋ น์ด๋ ์ด๋ฐ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
<noun>
๊ณผ <verb>
์๋ command์ subcommand๊ฐ ์ต๋๋ค. (breakpoint
, set
, list
๊ฐ์...)
option
์ ๋ค๋ฅธ cli ํด๊ณผ ๋น์ทํ๊ฒ -f
ํน์ --file
๊ฐ์ด -
๋ก ์์ํฉ๋๋ค.
๊ฐ๋จํ ์์๋ฅผ ํตํด ์ฝ๊ฒ ์ดํด๋ด ์๋ค.
(lldb) breakpoint set --file foo.c --line 12
(lldb) breakpoint set -f foo.c -l 12
breakpoint
๋ผ๋ ๋ช
๋ น์ด์ ํ์ ๋ช
๋ น์ด set
์ด ์คํ๋๊ณ ์๋ค์. --file
์ต์
์ ํตํด foo.c
ํ์ผ์ ์ง์ ํด์ฃผ๊ณ , --line
์ต์
์ ํตํด 12๋ฒ ๋ผ์ธ์ ์ง์ ํด์ฃผ๊ณ ์์ต๋๋ค.
help์ apropos
๋น์ฐํ๊ฒ๋ ๋ชจ๋ ์ปค๋งจ๋๋ฅผ ๋ค ์ธ์ธ์๋ ์๊ฒ ์ฃ ? man
๊ณผ ๊ฐ์ ๋์๋ง ์ปค๋งจ๋๊ฐ LLDB์๋ ๋น์ฐํ๊ฒ ์์ต๋๋ค.
์ด๋ ๊ฒ help
์ ์ปค๋งจ๋, ํน์ ์๋ธ์ปค๋งจ๋์ ๋์๋ง์ ๋ณผ ์ ์๊ตฌ์..
apropos
๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ฃผ์ด์ง ํค์๋๋ฅผ ์ฌ์ฉํด ๊ด๋ จ๋ ์ปค๋งจ๋๋ค์ ์๋ดํด์ค๋๋ค.
Breakpoint
์์์ ์ ๊น ๋ง๋ณธ ๊ฒ ์ฒ๋ผ LLDB๋ฅผ ์ฌ์ฉํด breakpoint๋ฅผ ์ค์ ํด์ค ์ ์๋๋ฐ์, ์ด ๋ถ๋ถ์ ์ฌ์ค Xcode์์ GUI ํ๊ฒฝ์ผ๋ก ์ ๊ณตํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๊ณ ๋์ด๊ฐ์๋ค.
Breakpoint ๋ง๋ค๊ธฐ
์ผ๋จ breakpoint๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ง๋ค์ด์ผ๊ฒ ์ฃ ?
- Function Name
(lldb) breakpoint set --name viewDidLoad
- File
(lldb) breakpoint set --file ViewController.swift --line 20
- Condition
(lldb) breakpoint set --name "viewWillAppear" --condition animated
ํจ์์ ์ด๋ฆ, ํ์ผ, ํน์ ์กฐ๊ฑด์ ์ฃผ์ด์ breakpoint๋ฅผ ๋ง๋ค ์ ์๋ต๋๋ค. Xcode์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ ๊ฐ๋ค๊ตฌ์? ๋ง์์.. Xcode์ breakpoint ๊ธฐ๋ฅ๋ LLDB๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์. ๊ทธ๋์ ์ฌ์ค ๊ทธ๊ฒ ๊ทธ๊ฑฐ๋๋๋ค ๐
Breakpoint ๋ฆฌ์คํธ ํ์ธํ๊ธฐ
(lldb) breakpoint list
์ด๋ ๊ฒ ํ์ฌ ์์ฑ๋์ด ์๋ breakpoint๋ค์ ๋ชฉ๋ก๋ ์ดํด๋ณผ ์ ์์ต๋๋ค.
Breakpoint ์ญ์ /๋นํ์ฑํํ๊ธฐ
(lldb) breakpoint delete (breakpoint id)
(lldb) breakpoint disable (breakpoint id)
๋นํ์ฑํํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ธฐ๋ฅ๋ ๋น์ฐํ ์์ด์ผ๊ฒ ์ฃ . ๋ช ๋ น์ด์ ๋ค์ breakpoint์ id๋ฅผ ์ฃผ๋ฉด ํน์ breakpoint์ ๋ํด์๋ง ์ํ๋ ๊ฐ๋ฅํฉ๋๋ค.
Stepping
breakpoint๋ฅผ ๊ฑธ์๋ค๋ฉด, ๋ค์์ผ๋ก ๋์ด๊ฐ๋ ๊ธฐ๋ฅ๋ ์์๊ฒ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๊ธฐ๋ฅ๋ ํฐ๋ฏธ๋์ ์๋จ์ ๋ฒํผ์ผ๋ก ์ฝ๊ฒ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ดํด๋ด ์๋ค.
- Stepping Overbreakpoint๊ฐ ๊ฑธ๋ฆฐ ์ง์ ์ ๋ฐ๋ก ๋ค์ statement๋ก ์งํํฉ๋๋ค.
(lldb) next
- Stepping Inbreakpoint๊ฐ ๊ฑธ๋ฆฐ ์ง์ ๋ค์์ด ํจ์๋ฅผ ํธ์ถํ๋ค๋ฉด, ํด๋น ํจ์์ ์์ ์ง์ ์ผ๋ก ์งํํฉ๋๋ค.
(lldb) step
- Stepping Outํ์ฌ ํจ์๋ฅผ ๋๋ด๊ณ ๊ทธ ์ดํ์ statement์ breakpoint๋ฅผ ๊ฑธ์ด์ค๋๋ค.
(lldb) finish
Expression
breakpoint๋ก ์ธํด ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถฐ ์์ ๋ LLDB๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์์ฃ ? ์ด ๋์ ์ํฉ์์ expression ๋ช ๋ น์ด๋ฅผ ํตํด์ ํน๋ณํ ๋์๋ค์ ์ํฌ ์ ์์ต๋๋ค.
์ฌ์ค ์ด ๋ถ๋ถ ๋๋ฌธ์ LLDB์ ๋ํด์ ์์๋ณผ ๋ง์์ด ์๊ฒผ๋ต๋๋ค ๐
po
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ๋ช
๋ น์ด (lldb) po
์
๋๋ค. ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ์์ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ด์ฃ !
์ฐธ๊ณ ๋ก po
๋ print -O --
์ alias์
๋๋ค.
์ด๋ ๊ฒ ์ธ์คํด์ค์ ์ ๋ณด๋ฅผ ์๋ ค์ค๋๋ค.
class Test: NSObject {
ย ย var a = 1
ย ย override var debugDescription: String {
ย ย ย ย return "Test Instance!!"
ย ย }
}
์ฐธ๊ณ ๋ก ์ด ๋ ์ถ๋ ฅ๋๋ ๊ฐ์ NSObject
์ debugDescription
๊ฐ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ override
ํด์ฃผ๋ฉด ์ปค์คํ
๋ ์ถ๋ ฅ๊ฐ์ ์ป์ ์๋ ์์ต๋๋ค.
variable ์ฌ์ฉํ๊ธฐ
(lldb) e (variable)
์ ์ฌ์ฉํ๋ฉด ํด๋น variable์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ ์๊ณ , ์ฃผ์ด์ง๋ $R0
์ ๊ฐ์ ๋ณ์๋ก ์ ๊ทผํ ์๋ ์๊ฒ ๋ฉ๋๋ค.
(lldb) e $R0.a = 2
๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น ๋ณ์์ a
๊ฐ์ 2๋ก ์
๋ฐ์ดํธ ํด์ฃผ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค. ์ค์ ๋ก ๋ค์ ํ ๋ฒ e test
๋ฅผ ํตํด์ ์ ๋ณด๋ฅผ ์กฐํํด๋ณด๋ a
์ ๊ฐ์ด 2๊ฐ ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ด๋ฏธ ์๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ ์๋ก์ด ๋ณ์๋ฅผ ์ ์ํด์ค ์๋ ์์ต๋๋ค!
(lldb) e let $someNumber = 10
(lldb) e var $someString = "Hello, World!"