Skip to content

Latest commit

ย 

History

History
155 lines (91 loc) ยท 6.97 KB

LLDB-Beyond-po.md

File metadata and controls

155 lines (91 loc) ยท 6.97 KB

LLDB: Beyond "po"

LLDB๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•œ ๋””๋ฒ„๊น… ํˆด๋กœ ์ฝ˜์†”์—์„œ ๋ฐ”๋กœ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

struct Trip {
  var name: String
  var destination: [City]
  ...
}

let cruise = Trip(...)
po cruise

ํ•˜๋ฉด cruise ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋‚˜์˜ค๋Š”๋ฐ, ์ด๋•Œ์˜ description์„ customize ํ•  ์ˆ˜ ์žˆ๋‹ค.

Customizing po description

CustomDebugStringConvertible protocol์„ ์ฑ„ํƒํ•˜๋ฉด debug description์„ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ด๊ฑด ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ์šฉ๋œ๋‹ค. (๋„๋‹ˆ๊นŒ destination์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ ํ•˜์œ„ struct์— ๋Œ€ํ•ด์„œ๋„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค๋ฉด CustomReflectable protocol ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์ž.

po๋Š” ๋‹จ์ˆœํžˆ ํ”„๋ฆฐํŒ…๋งŒ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Create expression with command alias

์ž…๋ ฅ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์‹์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. po๋Š” ์‚ฌ์‹ค ์˜ค๋ธŒ์ ํŠธ ์„ค๋ช…์„ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•œ expression์ด๋ผ๋Š” ๋ช…๋ น์˜ ๋ณ„๋ช…์ผ ๋ฟ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ณ ์œ ํ•œ ๋ช…๋ น ์ด๋ฆ„์„ ์ง€์ •ํ•œ ๋‹ค์Œ ๋ณ„์นญ์„ ์ง€์ •ํ•  ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์ž. ๋ณ„์นญ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ command alias + ๋ณ„์นญ + expression + ๊ณ ์œ ๋ช…๋ น์ด๋ฆ„

expression โ€”object-description โ€” cruise
command alias my_po expression โ€”object-description
my_po cruise

Po Under the Hood

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 ์€ ์‹คํŒจํ•˜์ง€ ์•Š๋Š”๋‹ค.

Displaying Variables

๏ฟผ

Customizing Data Formatters

์–ด๋–ป๊ฒŒ ๋””๋ฒ„๊ฑฐ์— ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ์•Œ๋ ค์ค€๋‹ค.

๊ธฐ๋ณธ ํฌ๋ฉง์€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์Šค์Šค๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•ด์•ผํ•  ์ผ์ด ์žˆ์„ ๊ฒƒ ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด 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 ์ถ”๊ฐ€ํ•˜๊ธฐ

summary

  • LLDB์—๋Š” ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ’์„ ํ‘œ์‹œํ•ด์•ผํ•˜๋Š”์ง€, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”์ง€ ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์„ค๋ช…์„ ๊ฐ€์ ธ์•ผํ•˜๋Š”์ง€์— ๋”ฐ๋ผ v, p ๋˜๋Š” po๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.
  • ํ•„ํ„ฐ, ๋ฌธ์ž์—ด ์š”์•ฝ ๋ฐ ํ•ฉ์„ฑ ์ž์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ  ํ•œ ๋ฐ์ดํ„ฐ ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ Python 2๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์œผ๋ฉด Python 3๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.