LLDB๋ ๋งค์ฐ ํ๋ฅญํ ๋๋ฒ๊น ํด๋ก ์ฝ์์์ ๋ฐ๋ก ๋๋ฒ๊น ์ ํ ์ ์๋ค.
struct Trip {
var name: String
var destination: [City]
...
}
let cruise = Trip(...)
po cruise
ํ๋ฉด cruise ๋ณ์์ ๋ํ ์ค๋ช
์ด ๋์ค๋๋ฐ, ์ด๋์ description
์ customize ํ ์ ์๋ค.
CustomDebugStringConvertible
protocol
์ ์ฑํํ๋ฉด debug description์ ๋ฐ๊ฟ์ค๋ค. ์ด๊ฑด ์ด ํ๋กํ ์ฝ์ ์ฑํํ ํด๋์ค์์๋ง ์ ์ฉ๋๋ค. (๋๋๊น destination
์๋ ์ ์ฉ๋์ง ์๋๋ค.
๋ง์ฝ ํ์ struct์ ๋ํด์๋ ์ปค์คํฐ๋ง์ด์ง์ด ํ์ํ๋ค๋ฉด CustomReflectable
protocol
๋ฌธ์๋ฅผ ํ์ธํ์.
po๋ ๋จ์ํ ํ๋ฆฐํ ๋ง์ ํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ฒด์ ๋ด๋ถ ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ํจ์๋ฅผ ํธ์ถํ๋๋ฐ ์ฌ์ฉํ ์๋ ์๋ค.
์ ๋ ฅ ๊ฐ๋ฅํ ํํ์์ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค. po๋ ์ฌ์ค ์ค๋ธ์ ํธ ์ค๋ช ์ ์ธ์ํ๊ธฐ ์ํ expression์ด๋ผ๋ ๋ช ๋ น์ ๋ณ๋ช ์ผ ๋ฟ์ด๋ค.
์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๊ณ ์ ํ ๋ช ๋ น ์ด๋ฆ์ ์ง์ ํ ๋ค์ ๋ณ์นญ์ ์ง์ ํ ์ปค๋งจ๋๋ฅผ ์ ๋ ฅํ์. ๋ณ์นญ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ command alias + ๋ณ์นญ + expression + ๊ณ ์ ๋ช ๋ น์ด๋ฆ
expression โobject-description โ cruise
command alias my_po expression โobject-description
my_po cruise
LLDB๋ฅผ ์ค์ ์ ๋ ฅ๋ ํํ์์ ๋ถ์ํ๊ฑฐ๋ ํ๊ฐํ์ง๋ ์๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ํํ์์ ์ปดํ์ผ ํ ์ ์๋ ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ค.
๋ด์ฅ๋ Swift์ claim compiler๋ฅผ ์ฌ์ฉํด์ ๋๋ฒ๊ทธ๋ ํ๋ก๊ทธ๋จ์ ์ปจํ ์คํธ์์ ์คํ๋๋ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ค.
์คํ์ด ์๋ฃ๋๋ฉด LLDB๋ ๊ฒฐ๊ณผ ๊ฐ์ ์์ธ์ค ํ ์ ์๋ค.. ์ด๋ฅผ ์ํด์๋ LLDB๊ฐ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ์์ค ์ฝ๋์กฐ๊ฐ์ผ๋ก ๊ฐ์ธ์ผํ๋ค. ์ด ใ ํ ์ปดํ์ผ๋๊ณ ๋๋ฒ๊ทธ ํ๋ก์ธ์ค ์ปจํ ์คํธ์์ ์ํ๋๋ค. ์ํ ๊ฒฐ๊ณผ์ ๋ํ ๋ฌธ์์ด์ LLDB์์ ๋ณด์ฌ์ค๋ค.
$R0
> ์ดํ LLDB์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
P $R0.destinations
P ๋ํ po์ ๋ง์ฐฌ๊ฐ์ง๋ก ํํ์์ ์ปดํ์ผ ํด์ ์ํํ ๊ฒฐ๊ณผ์ ์ ๊ทผ ํ ์ ์๋ค. ์ดํ LLDB๋ Dynamic type resolution ๋ผ๋ ์คํ ์ ์ํํ๋ค. ์ข ๋ ์์ธํ ์ดํด๋ณด์.
Trip์ด Activity๋ผ๋ ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ๋ณ์ cruise๋ฅผ ์ ์ธํ ๋ Static Type์ผ๋ก๋ Activity๋ฅผ ์ ์ธํ๊ณ Trip ์ธ์คํด์ค๋ฅผ ํ ๋นํด์ฃผ์.
Let cruise: Activity = Trip(..)
๊ทธ๋ฌ๋ฉด ์ปดํ์ผ ํ์์์ cruise๋ Activity Type์ด์ง๋ง Runtime์์ cruise๋ Trip Type์ ๊ฐ์ง๋ค.
Cruise ๊ฐ์ ์ธ์ํ๋ฉด Trip Type์ผ๋ก ์ถ๋ ฅํ๋ค. ์๋ํ๋ฉด LLDB๊ฐ ๊ฒฐ๊ณผ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ์กํ์ฌ ์ฃผ์ด์ง ํ๋ก๊ทธ๋จ์์ ์ด ๋ณ์์ ๋ํด ๊ฐ์ฅ ์ ํํ ์ ํ์ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ๋์ ์ ํ ํ์ธ(Dynamic type resolution) ์ด๋ผ๊ณ ํ๋ค. P ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ๋์ ๊ฒฐ๊ณผ ๋ถ์์ ํํ์์ ๊ฒฐ๊ณผ์ ๋ํด์๋ง ์ํํ๋ค.
๊ทธ๋๊น cruise๋ฅผ ์ถ๋ ฅํ ๋๋ Trip์ผ๋ก ๋ณด์ฌ์ฃผ๋๋ฐ, cruise์ name์ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ฉด Activity์๋ ๊ทธ๋ฐ ํ๋๊ฐ ์๋ค๊ณ ์ค๋ฅ๋ฅผ ๋ณด์ฌ์ค
์๋๋ฉด LLDB๋ p๊ฐ ์คํ๋ ๋ ์์ค์ฝ๋์์ ์์ฑ๋ ์ ์ ์ธ ํ์ ์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ค ์ฝ๋์์ ์ค์ ๋ก cruise.name์ ์์ฑํ๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์ค๋ฅ์์ด ์์ ํ๊ฐํ๋ ค๋ฉด ๋จผ์ ๊ฐ์ฒด๋ฅผ Dynamic type์ผ๋ก ๋ช ์์ ์ธ ์บ์คํ ์ ํ ๋ค์ ๊ฒฐ๊ณผ์ ์ก์ธ์คํด์ผํ๋ค.
P (Cruise as! Trip).name
LLDB๋ ์ฌ์ฉ์๊ฐ ์ฝ์ ์ ์๋๋ก Fomatter๋ฅผ ์ฌ์ฉํ๋ค. ํฌ๋ฉํฐ๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋๋
Expression โraw โ cruise.name
์ด๋ ๊ฒ ์ฐ๋ฉด ๋์ด
๏ฟผ ํฌ๋ฉํฐ๋ฅผ ์ฐ๋ฉด ๊ทธ๋ฅ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ์ ์๋ ๋ฌธ์์ด ํํ๋ก ๋์จ๋ค. ๏ฟผ
ํฌ๋ฉํฐ๋ ์ปค์คํ ํ ์ ์๋ค.
v ๋ p๋ ๊ฐ์ด ํฌ๋งคํฐ์ ์์กดํ๋ค. ๋ค๋ฅธ ๋ ๋ช ๋ น๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก v ๋ ํ๋ ์ ๋ณ์์ ๋ํ ๋ช ๋ น์ ์ํด Xcode 10.2์์ ๋์ ๋ ๋ณ์นญ์ด๋ค.
๋ค๋ฅธ ๋ ๋ฉ์ปค๋์ฆ๊ณผ๋ ๋ฌ๋ฆฌ v ๋ช ๋ น์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ฑฐ๋ ์คํํ์ง ์๊ธฐ์ ๋งค์ฐ ๋น ๋ฅด๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ปดํ์ผ๋ง ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ ์ฌ์ฉํ๋ ์ธ์ด์ ๊ฐ์ ํ์๋ ์๋ ๊ณ ์ ํ ์ ํ ์ค๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด์, .๊ณผ subscript ์ฐ์ฐ์๋ฅผ ํ๋์ ์์ธ์ค ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ํํด์ผํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, resolution ์ overload ํ์ง ์์ผ๋ฉฐ, ๊ณ์ฐ ์์ฑ์ ์ํํ ์ ์๋ค.
ํ์ํ ๊ฒฝ์ฐ์๋ p ์ po๋ฅผ ์ฐ์.
v ์ปค๋ฉ๋์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ์ฐธ์กฐํด์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ์๋ฅผ ์ฐพ๋๋ค. ๊ทธ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ์ ๊ฐ์ ์ฝ๊ณ , ๋์ ์ ํ ํ์ธ์ ใ ํํ๋ค. ์ฌ์ฉ์๊ฐ ์๋ธ ํ๋์ ์์ธ์ค ํ๋๋ก ์์ฒญํ ๊ฒฝ์ฐ, ๊ฐ ๋ผ์ด๋์์ ๋์ ์ ํ ๋ถ์์ ์ํํ๋ ๊ฐ ์๋ธ ํ๋์ ๋ํ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ค.
์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํฐ ํฌ๋งทํฐ ์๋ธ ์์คํ ์ผ๋ก ์ ๋ฌํ๋ค.
v๋ ๋์ ์ ํ ํ์ธ์ ์ฌ๋ฌ๋ฒ ์ํํ๋ฉฐ, ํฌ๋งทํฐ๋ ๋์ ์ ํ ํ์ธ์ ํ ๋ฒ๋ง ์ํํ๋ค.
P cruise.name ์ ์คํจํ์ง๋ง v cruise.name ์ ์คํจํ์ง ์๋๋ค.
๏ฟผ
์ด๋ป๊ฒ ๋๋ฒ๊ฑฐ์ ๋ณด์ฌ์ค ๊ฒ์ธ์ง์ ๋ํด ์๋ ค์ค๋ค.
๊ธฐ๋ณธ ํฌ๋ฉง์ ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง ์ค์ค๋ก ์ปค์คํฐ๋ง์ด์ง ํด์ผํ ์ผ์ด ์์ ๊ฒ ์ด๋ค.
์ด๋ฅผ ์ํด LLDB๋ ๋ค์ ์ธ๊ฐ์ง๋ฅผ ์ง์ํ๋ค. Filters /. Tring summaries /synthetic children
${var.name} ๋ฐฉ์์ผ๋ก ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ description์ ์ฌ์ฉํ ์ ์๋ค.
SBTarget, SBProcess, SBThread, SBFrame, SBValue
Xcope 11๋ถํฐ Python 3 ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํ๋ค. LLDB API
script๋ฅผ ์ฐ๋ฉด python shell๋ก ์ด๋ํจ lldb.frame.FindValues(โcruiseโ) > ๋ณ์ ์ฐพ๊ธฐ
cruise.GetChildMemberWithName(โdestinationโ) > ๋ณ์์์ ํ์ ํ๋ ์ฐพ๊ธฐ
GetNumChildren() GetChildAtIndex(0) ์ผ๋ก ๋ฐฐ์ด ์ ๊ทผ ๊ฐ๋ฅ
GetSummary() ๋ก ํ์ ์๋ ๋ฉํธ๋ค์ ๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
Custom Formatter๋ฅผ python ํ์ผ๋ก ์์ฑํด์ ๋ง๋ค์ด๋ณด์ฅ.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ lldb์์ command script import Trip.py
๋ก ์ํฌํธํ ์ ์๋ค.
type summary add Travel.Trip โpython-function TripSummaryProvider
๋ก formatter ์ถ๊ฐํ๊ธฐ
- LLDB์๋ ๋๋ฒ๊น ํ๋ ๋์ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ํ์ธํ ์์๋ ๋ค์ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- ๊ฐ์ ํ์ํด์ผํ๋์ง, ์ฝ๋๋ฅผ ์คํํด์ผํ๋์ง ๋๋ ์ค๋ธ์ ํธ ์ค๋ช ์ ๊ฐ์ ธ์ผํ๋์ง์ ๋ฐ๋ผ v, p ๋๋ po๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ผ.
- ํํฐ, ๋ฌธ์์ด ์์ฝ ๋ฐ ํฉ์ฑ ์์์ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ๋ฐ์ดํฐ ํฌ๋งทํฐ๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ฑฐ๋ ์ ์ํ์ญ์์ค.
- ๋ง์ง๋ง์ผ๋ก Python 2๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉด Python 3๊ณผ ํธํ๋๋๋ก ์ ๋ฐ์ดํธํ์ญ์์ค.