๋ค์ด๊ฐ๋ฉฐ
LLDB๋?
Xcode์ ํจ๊ป ์ ๊ณต๋๋ ๊ธฐ๋ณธ ๋๋ฒ๊น
๊ธฐ์ ์
๋๋ค.
LLDB๋ฅผ ์ฌ์ฉํด์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ด๋ฌํ ์์
๋ค์ ์คํํ ์ ์์ต๋๋ค.
1.
breakpoint๋ฅผ ์ค์
2.
์คํ์ ์ผ์ ์ค์ง
3.
๋ณ์์ object์ ์ํ๋ฅผ ๊ฒ์ฌ
4.
์ฝ๋๋ฅผ ํ์
LLDB๋ ์ฝ๋๊ฐ ์ํํ๋ ์์
์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ผ๋ฉฐ ์ฝ๋์ ๋์์ด ์์๊ณผ ๋ค๋ฅธ ์ง์ ์ ์ฐพ์ ์ ์์ต๋๋ค.
>> ์ฝ๋๋ฅผ ์ดํดํ๊ณ ํ์ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ
์ด๋ฒ ์ธ์
์์๋ Swift์ฝ๋ ๋๋ฒ๊น
์ ๊ณ ์ ํ ์ํฅ์ ๋ฏธ์น๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ํฌ ํ๋ก์ฐ๋ฅผ ์์๋ด
๋๋ค.
Whatโs going on here
Example) Text Adventure
I only see disassembly.
Letโs start by figuring out why I couldnโt see any source code.
LLDB๊ฐ ์์ค ์ฝ๋๋ฅผ ํ์ํ๊ธฐ ์ํด์ ํ์ํ ๊ฑด ๋ฌด์์ผ๊น์?
์ปดํ์ผ๋ฌ๋ ํจ์๋ฅผ ์ปดํ์ผํ ๋ ๊ธฐ๊ณ์ด๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ debugger๋ฅผ ์ํ breadcrumbs๋ฅผ ๋จ๊ฒจ์ ์คํ ํ์ผ์ ์ฃผ์๋ฅผ ์์ค ํ์ผ๊ณผ line number๋ก ๋งคํํ ์ ์๊ณ ๊ทธ ๋ฐ๋๋ ๊ฐ๋ฅํฉ๋๋ค.
>> breadcrumbs : ๋๋ฒ๊ทธ ์ ๋ณด
Apple ํ๋ซํผ์์๋ ๋๋ฒ๊ทธ ์ ๋ณด๊ฐ ๊ฐ์ฒด ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค. ๋ณด๊ด ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํด ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ .dSYM bundle์ ์ฐ๊ฒฐํฉ๋๋ค.
>> dsymutil : ๋๋ฒ๊ทธ ์ ๋ณด linker
LLDB๋ Spotlight๋ฅผ ์ฌ์ฉํด์ dSYM ๋ฒ๋ค์ ์์น๋ฅผ ์ฐพ์ต๋๋ค. dSYM๋ disk ์์น ์ธก๋ฉด์์ ์๋นํ ์ ์ฐํฉ๋๋ค.
back to the example!
๋จผ์ , LLDB๊ฐ ์ค์ ๋ก ํ๋ ์์ํฌ์ ๋ํ dSYM์ ์ฐพ์๋์ง ํ์ธํฉ๋๋ค.
>> Why? ๋ณด๊ด ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํด ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ .dSYM bundle์ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์
ํด๋น ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฝ๋ก๋ฅผ ๋ฆฌ๋๋ ์
ํ ์ ์์ด์.
LLDB Setting
LLDB๋ settings set target.source-map์ ์ฌ์ฉํ์ฌ ์์ค ๊ฒฝ๋ก๋ฅผ ๋ค์ ๋งคํํ ์ ์์ต๋๋ค.
๊ฐ .dSYM ๋ฒ๋ค์๋ prefix remapping dictionary๋ฅผ ๋ฃ์ ์ ์๋ XML.plistํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์๋ฒ์์ ์ต์ ๋น๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ค์ด๋ก๋ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ์ฌ ๋ค์ด๋ก๋๋ ํ์ผ์ ์ ์ ํ ์ฌ๋งคํ ์ฌ์ ์ ์๋์ผ๋ก ์ฃผ์
ํ ์ ์์ต๋๋ค.
Source paths๋ ์ธ์ด์ ํนํ๋ ๊ฒ์ด ์๋๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ Swift, C++, Objective-C ํ๋ก์ ํธ์์ ๋์ผํ๊ฒ ์๋ํด์!
build server farm์์ ์์ค ์ฝ๋๊ฐ ์ปดํ์ผ๋๋ฉด ์์ค ํ์ผ์ ์๊ฒฉ ๊ฒฝ๋ก๊ฐ ์ปดํจํฐ๋ง๋ค ๋ค๋ฅผ ์ ์์ด์.
๋จธ์ ๋น ํ๋์ remap prefix๋ฅผ ์ ์ํ ํ์๊ฐ ์๋๋ก, ์ฐ๋ฆฌ๋ ์ปดํ์ผ๋ก๊ฐ ์์ค ๊ฒฝ๋ก๋ฅผ ๋๋ฒ๊ทธ ์ ๋ณด์ ๋ฃ๊ธฐ ์ ์ ์ ๊ทํํ๋๋ก ์ง์ํ ์ ์์ต๋๋ค.
-debug-prefix-map ์ต์
์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
์ด ๋ฐฉ์์ผ๋ก ์์คํ
๋ณ path prefix๋ LLDB์ ๋ก์ปฌ ๊ฒฝ๋ก์ remapped๋ ์ ์๋ Canonical placeholder name(๊ณ ์ ํ ํ์ค ์๋ฆฌ ํ์์)๋ก ๋์ฒด๋ ์ ์์ต๋๋ค.
back to example!
์ ๋ word์ ๋ํ ๊ฐ์ฒด ์ค๋ช
์ printํ๋ ค๊ณ ํ์ต๋๋ค.
์ ์ด๋ ๋ณ์ ๋ณด๊ธฐ์์ ๋ณ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
Xcode ๋ณ์ ๋ทฐ์ ๋๋ฑํ ์ฝ์์ frame variable ๋๋ v ๋ช
๋ น์
๋๋ค.
We need to learn more about LLDB
๊ทธ๋ ๋ค๋ฉด ํฌ๋ ๋ฌด์์ด๊ณ ์ ์ฌ์ ํ ์๋ํ์ง ์๋ ๊ฒ์ผ๊น์?
์ฐธ๊ณ ๋ก LLDB๋ ๋๋ฒ๊ฑฐ์
๋๋ค. ๊ทธ๋ฌ๋ LLDB๋ ๋จ์ํ ๋๋ฒ๊ฑฐ๊ฐ ์๋๋๋ค. ๊ทธ๊ฒ์ ์ปดํ์ผ๋ฌ์ด๊ธฐ๋ ํฉ๋๋ค!
LLDB๋ ๋๋ฒ๊ฑฐ ๊ธฐ๋ฅ ์ธ์๋ Swift, Clang compiler์ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์์ด์.
์ด๋ฌํ ์ปดํ์ผ๋ฌ๊ฐ p, po alias๋ฅผ ํตํด ์ ์ ์๋ LLDB expression evaluator๋ฅผ ๊ตฌ๋ํฉ๋๋ค.
โข
expression evaluator๋ ๋ณ์๋ฅผ ๋ณด๋ ๊ฒ์ ๋์ด ๊ณ์ฐ์ ์ํ
โข
ํจ์๋ฅผ ํธ์ถ
โข
ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ๋ณ๊ฒฝ
๋๋ฒ๊ฑฐ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ํฌ๋งทํ ๊น์?
์ปดํ์ผ๋ฌ๊ฐ ์ ๊ณตํ๋ ๋๋ฒ๊ทธ ์ ๋ณด๋ ๋๋ฒ๊ฑฐ์ ๋ณ์๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ์๋ ค์ค๋๋ค.
ํ์ง๋ง ์ด ์ ๋ณด๋ก๋ LLDB๋ ์์์ ์์ ๋ฐ์ดํธ ๋ชจ์๋ง ๋ณด์ฌ์ค ์ ์์๊ฑฐ์์.
The answer is types.
Type information๋ฅผ ํตํด LLDB๋ ์์ค ๋ณ์์ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ดํดํ ์ ์์ต๋๋ค.
Type information๋ฅผ ํตํด LLDB๋ type์ด ์ด๋ค ํ๋๋ฅผ ๊ฐ์ง๋ฉฐ type๋ฅผ ํตํด LLDB๊ฐ ์ ์ ํ data formatter๋ฅผ ์ฌ์ฉํ์ฌ pretty-print๋ฅผ ํ ์ ์๋์ง ์ ์ ์์ด์.
โข
frame variable ๋ฐ v ๋ช
๋ น์ด ์๋ Debugger side์์๋ LLDB๊ฐ ๋๋ฒ๊ทธ ์ ๋ณด์์ type information๋ฅผ ๊ฐ์ ธ์์.
โข
LLDB๋ Swift Reflection metadata์์ type๋ฅผ ๊ฐ์ ธ์์.
โข
expression evaluator, po๊ฐ ์๋ Compiler side์์๋ LLDB๋ type information๋ฅผ ๋ชจ๋๋ก๋ถํฐ ๊ฐ์ ธ์์.
์ด๋ฐ ๊น๋ํ ๋ถ๋ฆฌ๋ Xcode 14์ ์๋ก๋์จ ๊ฒ์ผ๋ก expression evaluator๊ฐ ์๋๋๋ผ๋ variable view๊ฐ ์์ ํ ๊ธฐ๋ฅํ ์ ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํด์ค๋๋ค.!
๋ชจ๋์ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ธ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด์์.
Swift-healthcheck
์ปดํ์ผ๋ฌ ์ธก์์ ๋ฐ์ํ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ง๋จํ๋์?
์ฌํด LLDB๋ swift-healthcheck ๋ช
๋ น์ ์ถ๊ฐํ์ด์. ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ์ ์คํจํ๋์ง ํ์ธํ๋ ์ฒซ ๋ฒ์งธ stop์
๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ swift-healthcheck๋ฅผ ์คํํ๋ฉด Swift expression evaluator configuration ๋ก๊ทธ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ก๊ทธ ๋์ LLDB๊ฐ TerminalUI๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ๋ฌธ์ ๊ฐ ์์์ ์ ์ ์์ด์.
์ด๋ฆ์ ๊ทผ๊ฑฐํด์ ์ ๋ TerminalInterface framework์ ๊ตฌํ์ฌํญ์ด๋ผ๋๊ฑธ ์ ์ถํ ์ ์์ด์.
์ด ๋๋ฝ๋ ๋ชจ๋์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
self ํ์
์ UI ๊ตฌํ์ ๋นํด Genericํ๊ณ ํด๋น type๋ฅผ ํฌํจํ๋ ๋ชจ๋์ด ์์ผ๋ฉด expression evaluator๊ฐ ๋์ type์ธ self๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ด์์.
1.
๋ด ์ฑ์๋ ์์ฒด ์ค์ํํธ ๋ชจ๋์ด ์์ต๋๋ค. ์ด ๋ชจ๋์ Foundation๊ณผ ๊ฐ์ ์์คํ
ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
>> ์์คํ
ํ๋ ์์ํฌ : SDK์ ์์ฃผํ๋ ์์ ์ ์ธ textual stable Swift Interface file
2.
๋ชจ๋ ์ค์ํํธ ๋ชจ๋์ module map file์ ๋์์ ๋ฐ์์ ๊ทธ๋ฃนํ๋ ํ๋ ์ด์์ Clang ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์์ด์. Clang ๋ชจ๋์ ๋ค๋ฅธ Clang ๋ชจ๋์ ์์กดํ ์ ์์ต๋๋ค.
>> Clang ๋ชจ๋ : ํค๋ ํ์ผ์ ๋ํ ๊ณ ๊ธ ์ด๋ฆ
3.
์ฑ์ ๋ก์ปฌ๋ก ๋น๋๋ ํ๋ ์์ํฌ์ ์ํ๋ Swift ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์๋ ์์ด์.
4.
SDK์ ์ผ๋ถ๊ฐ ์๋ textual Swift interface file๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
5.
์ฑ์ Swift ์ฝ๋๊ฐ ํฌํจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งํฌ๋ ์ ์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Swift ๋ชจ๋๊ณผ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
6.
Clang ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์๋ briding-header๋ ์์ต๋๋ค.
7.
LLDB๋ง์ ํน์ ๊ธฐ๋ฅ์ผ๋ก, ์ผ๋ถ ๋ชจ๋ ๋ด์ฉ์ ๋๋ฒ๊ทธ ์ ๋ณด์์๋ง ์ฌ๊ตฌ์ฑํ ์ ์์ด์.
LLDB๊ฐ ๋ชจ๋์ ์ฐพ์ ์ ์๋๋ก ๋ชจ๋์ ํจํค์งํ๋ ๊ฒ์ด ๋น๋ ์์คํ
์ ์ผ์ด์์.
โข
์์คํ
ํ๋ ์์ํฌ์ ๋ชจ๋์ SDK์ ๋จ์์.
โข
LLDB๋ ํ๋ก๊ทธ๋จ์ ์ฒจ๋ถํ ๋ SDK์ ์ผ์นํ๋ SDK๋ฅผ ์ฐพ์์.
โข
๊ฐ์ฒด ํ์ผ์์ ์ง์ ๋๋ฒ๊น
ํ ๋ LLDB๋ ๋น๋ ์ SDK๊ฐ ์๋ ๋ชจ๋ ๋ชจ๋์ ์ฐพ์์.
โข
Dsymutil์ ๋ชจ๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ ๋๋ dylib ๋ฐ ์คํ ํ์ผ์ ๋ํด DSYM ๋ฒ๋ค๋ก ๋ถ๋ฆฌ๋ ๋๋ฒ๊ทธ ์ ๋ณด ์์นด์ด๋ธ๋ฅผ ํจํค์งํ ์ ์๋ค.
โข
๊ฐ .dSYM ๋ฒ๋ค์ ๋ธ๋ฆฌ์ง ํค๋, ํ
์คํธ ์ค์ํํธ ์ธํฐํ์ด์ค ํ์ผ, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ์ค์ํํธ ๋ชจ๋์ ํฌํจํ ์ ์์ด์.
Register Swift modules with the Linker
Swift module์ dsymutil๋ก ํฝ์
ํ๋ ค๋ฉด linker์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์คํ ํ์ผ์ ๊ฒฝ์ฐ ๋น๋ ์์คํ
์ด ์๋์ผ๋ก ์ด ์์
์ ์ํํด์.
ํ์ง๋ง ์ ์ ์์นด์ด๋ธ๋ ๋ง์ปค์ ์ํด ์์ฑ๋์ง ์์ผ๋ฉฐ zip ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด ํ์ผ์ ๋ชจ์์ผ ๋ฟ์ด์์.
Swift module์ linker์ ๋ฑ๋กํ๋ ์ฑ
์์ static archive์ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ์คํ ํ์ผ ๋๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ต๋๋ค.
>> ๋ง์ ๊ฒฝ์ฐ Xcode ๋น๋ ์์คํ
์ด ์ด๋ฅผ ๋์ ํด์ค์.
>> ๊ณ ์ ํ ์ฌ์ฉ์ ์ง์ ๋น๋ ์์คํ
์ ์ ์ง ๊ด๋ฆฌํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๋น๋ ๊ท์น์ ์ ์ํ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค!
Apple Linker
โข
Apple ๋ง์ปค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Swift ๋ชจ๋์ -add-ast-path ์ต์
์ผ๋ก ๋ฑ๋กํด์ผ ํฉ๋๋ค.
โฆ
๋น๋ ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ํด๋น๋๋์ง ํ์ธํฉ๋๋ค.
โฆ
dsymutil์ ์ฌ์ฉํ์ฌ ์คํ ํ์ผ์ ๊ธฐํธ ํ
์ด๋ธ์ dumpํ๊ณ swift module์ ๋ํ grep์ ์ฌ์ฉํ์ฌ ์คํ ๊ฐ๋ฅํ์ง ํ์ธํ ์ ์์ต๋๋ค.
Linux
โข
Swift driver๋ ์ด์ง Swift ๋ชจ๋ ํ์ผ์ ๋๋จธ์ง ๋๋ฒ๊ทธ ์ ๋ณด์ ํจ๊ป binary๋ก ๋งํฌํ ์ ์๋ ๊ฐ์ฒด๋ก ๋ณํํ๋ -module wrap ๋์์ ์ง์ํฉ๋๋ค.
โข
LLDB๊ฐ ์์์ ๊ฑฐ๊ธฐ์ ์ฐพ์ ๊ฒ๋๋ค.
ํ๋ ์์ํฌ ๋น๋ ์์คํ
์ ์ผ๋ถ๋ก ์ ์ ์์นด์ด๋ธ๊ฐ ์ฌ์ฉ๋ผ์.
>> dSYM ๋ฒ๋ค์์ ๋น ์ง ๊ฒ์ Static Archive์ ์ํ Swift ๋ชจ๋์ด์์ต๋๋ค.
Swift Compiler๋ Clang header ๊ฒ์ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ๊ด๋ จ ์ต์
์ ๋ฐ์ด๋๋ฆฌ .swift ๋ชจ๋ ํ์ผ๋ก ์ง๋ ฌํํด์.
์ด๋ Clang ๋ชจ๋ ์ข
์์ฑ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋น๋ํ๋ ๋์๋ง ์๋ํ๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค.
๋ค๋ฅธ ๊ธฐ๊ณ์ ๊ตฌ์ถํ๋ฉด ์ด๋ฌํ ๋ก์ปฌ ๊ฒฝ๋ก๊ฐ ์์๋ ์ ์์ด์.
๋ฐ์ด๋๋ฆฌ .swift ๋ชจ๋์ ๋ค๋ฅธ ๋จธ์ ์ผ๋ก ์ ์กํ๊ธฐ ์ ์ -no-serialize-debugging-options ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
>> Xcode์์๋ SWIFT_SERIALIZE_DEBUGGGING_OPTIONS ์ค์ ์ ํตํด ์ ์ด๋ฉ๋๋ค.
๋ค์ ์ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ LLDB์ ์ด๋ฌํ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ๋์
ํ ์ ์์ต๋๋ค.
์ ๋ฆฌํ๋ฉฐ
1.
๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ ์ด์ง ํ๋ ์์ํฌ๋ฅผ ๋ณด๋์ ๋ ๋๋ฒ๊ฑฐ์ ์ฝ๋๋ก ๋ค์ด๊ฐ ๊ฒ์ผ๋ก ์์๋์ง ์๋๋ค๋ฉด ์ค์ํํธ ๋ชจ๋์ textual .swiftinterface ํ์ผ๋ก ๋ณด๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
2.
๋๋ฒ๊น
ํ ๊ฒ์ผ๋ก ์์๋๋ ๋น๋ ์๋ฒ ๋๋ CI๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ Swift ๋ชจ๋์ ๋น๋ํ๊ณ search path serialization๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
โข
-debug-prefix-map ์ต์
์ ์ฌ์ฉํ์ฌ ๋๋ฒ๊ทธ ์ ๋ณด์ ์๋ฒ์์ ์๋ณธ ๊ฒฝ๋ก๋ก ์ ๊ทํํ ์ ์์ด์.










































