๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/WWDC

[WWDC19] LLDB: Beyond "po"

by Danna 2022. 7. 4.
728x90
728x90

LLDB ๋Š” ์•ฑ ๋Ÿฐํƒ€์ž„ ์ค‘์— ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋Š” ํˆด์ด๋‹ค.

"po"

๊ธฐ๋ณธ์ ์œผ๋กœ LLDB ์—์„œ po ~~ ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ํƒ€์ž…๊ณผ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ณด์—ฌ์ค€๋‹ค.

CustomDebugStringConvertible ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ , debugDescription ์„ ์ถ”๊ฐ€ํ•˜๋ฉด Object ์ด๋ฆ„์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ณณ์— ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Sub structure ์— ๋Œ€ํ•œ ์ปค์Šคํ…€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด CustomReflectable ์„ ์ฐพ์•„๋ณด์ž.

po ๋ช…๋ น์–ด๋Š” ๊ฐ์ฒด๋ฅผ ํ”„๋ฆฐํŒ…ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๋“ฑ์˜ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

po ๋Š” ์‚ฌ์‹ค ํŠน์ • ๋ช…๋ น์–ด๋ฅผ alias ๋กœ ๋‹จ์ถ•์‹œํ‚จ ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

  • expression --object-description ์„ ์ค„์ธ๊ฒƒ

"po" Under the Hood

(lldb) po view ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ๋ด…์‹œ๋‹ค

  • LLDB ๋Š” ์Šค์Šค๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • po ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ, ์‹คํ–‰ํ•œ๋‹ค.
  • ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„ LLDB ๋Š” ๊ฒฐ๊ณผ ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๊ณ , description ์„ ๊ฐ€์ ธ์™€ ์†Œ์Šค ์ฝ”๋“œ๋กœ ๋ž˜ํ•‘ํ•œ๋‹ค.
  • ์œ„์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋””๋ฒ„๊ทธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ปดํŒŒ์ผ ํ›„ ์‹คํ–‰๋œ๋‹ค.
  • ์œ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” LLDB ๊ฐ€ po ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œํ•  ๋ฌธ์ž์—ด์ด๋‹ค.

po ๋Š” LLDB ์—์„œ ๋ณ€์ˆ˜๋ฅผ ํ”„๋ฆฐํŒ…ํ•˜๋Š” ์„ธ๊ฐ€์ง€ ์ค‘ ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ด๋‹ค.

"p"

p ๋ช…๋ น์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์—†์ด ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

  • po ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ ์€ ๊ฐ™์ง€๋งŒ
  • ๊ฐ์ฒด ํƒ€์ž…๋ช… ๋Œ€์‹  $R0 ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

p cruise ์˜ ๊ฒฐ๊ณผ์ธ $R0 ์— ๋Œ€ํ•ด์„œ ๋˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด, ๋‹ค์Œ ๊ฒฐ๊ณผ๋Š” $R1, $R2 ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

  • ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋˜๋Š” ๊ฐ’์ด ์•„๋‹๊นŒ ๐Ÿค”

p ์—ฐ์‚ฐ์€ expression ์— ๋Œ€ํ•œ alias ๋กœ, po ๋ช…๋ น์—์„œ ์˜ต์…˜์ด ์—†๋Š” ๋ฒ„์ „์ด๋‹ค.

  • po == expression --object-description

"p" Under the Hood

(lldb) p cruise ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ปดํŒŒ์ผ ~ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ€๋ถ„๊นŒ์ง€๋Š” po ์™€ ๋™์ผํ•˜๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ์–ป์€ ํ›„์— Dynamic type resolution ๋‹จ๊ณ„์—์„œ ๋™์  ํƒ€์ž…์œผ๋กœ์˜ ์บ์ŠคํŒ…์„ ํ•œ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ์‹œ ์ •์  ํƒ€์ž…๊ณผ ๋Ÿฐํƒ€์ž„์‹œ ๋™์  ํƒ€์ž…์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ,

  • ์ •์  ํƒ€์ž…์ธ Activity ๋กœ ์ธ์‹ํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ
  • ๋™์  ํƒ€์ž…์ธ Trip ์œผ๋กœ ์ปจ๋ฒ„ํŒ… ํ•œ ์ดํ›„์— ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ

p cruise.name ์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๋™์  ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

  • ์ปดํŒŒ์ผ์ด ๋œ ์ดํ›„์— ๋™์  ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ์ ์—๋Š” ์ •์  ํƒ€์ž…๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค.
  • ์ด๋ถ€๋ถ„์€ ์†Œ์Šค์ฝ”๋“œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค. ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์บ์ŠคํŒ…์„ ์ž‘์„ฑํ•ด๋ผ.

์ดํ›„ LLDB ๋Š” ๊ฒฐ๊ณผ๋ฅผ Formatter ์—๊ฒŒ ์ „๋‹ฌํ•ด์„œ, ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

Formatter ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  raw ๋ฐ์ดํ„ฐ๋ฅผ ๋ณธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

"v"

v ๋ช…๋ น์˜ ์ถœ๋ ฅ์€ p ์™€ ๋™์ผํ•œ Formatter ๋ฅผ ๊ฑฐ์น˜๊ธฐ์— ๋™์ผํ•˜๋‹ค.
์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅด๋‹ค.

"v" Under the Hood

v ๋ช…๋ น์€ program state ๋ฅผ ์ฐธ์กฐํ•ด์„œ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฝ๊ณ , ๋™์  ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•œ๋‹ค.

๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ๊ณ  ๋™์  ํƒ€์ž… ๋ณ€ํ™˜์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
์ดํ›„ Formatter ์—๊ฒŒ ์ „๋‹ฌํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค.

p ๋ช…๋ น๊ณผ ๋‹ค๋ฅด๊ฒŒ v ๋ช…๋ น์€ ๋™์  ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Displaying Variables

 

Customizing Data Formatter

LLDB ์˜ Data Formatter ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค. ๐Ÿ˜ฎ

 

Trip ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ, filter ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ name ๋งŒ ์ถœ๋ ฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด์˜ summary ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ${var} ๋กœ ๋ฌถ์–ด์ค€๋‹ค.

  • Formatter ๋Š” ๋ฐฐ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์˜ ๋™์ž‘์€ destinations[0] ์ฒ˜๋Ÿผ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Python Formatter

Python Formatter ๋ฅผ ํ†ตํ•ด ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ณ , LLDB Scripting Bridge API ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋””๋ฒ„๊น…์ค‘์ธ ์„ธ์…˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(lldb) script ๋ฅผ ํ†ตํ•ด python 3 ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ํ˜•์‹์€ ๊ธฐ์กด Data formatter ์™€ ๋™์ผํ•˜๋‹ค.

์œ„์˜ ์˜ˆ์ œ์—์„œ LLDB API ์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ณ€๊ฒฝํ•ด์„œ, ์ธ๋ฑ์Šค ํ•˜๋“œ ์ฝ”๋”ฉ์„ ์ด๊ฒจ๋‚ผ ์ˆ˜ ์žˆ๋‹ค! ๐Ÿฅน

 

.py ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ž„ํฌํŠธํ•ด์„œ, type summary ๋กœ ์ง€์ •ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ์ฒด์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ๋Š” SB value ๋ฅผ ๊ฐ–๊ณ , ๊ฐ๊ฐ์— ๋Œ€ํ•œ summary ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • summary ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฑด ๋น„์Šทํ•˜์ง€๋งŒ, ํŠน์ • ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • child ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ปค์Šคํ…€ํ•  ๋•Œ์—๋Š” type synthetic ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

~/.lldbinit ํŒŒ์ผ์— ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•ด๋‘๋ฉด, ๋””๋ฒ„๊ทธ ์„ธ์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋œ๋‹ค.

Summary

  • v, p, po ๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์ž ๐Ÿ™†‍โ™€๏ธ
  • filter, summary, synthetic children ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํฌ๋งท์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์ž ๐Ÿ‘€
  • ์Šคํฌ๋ฆฝํŠธ์— Python 3 ๋ฅผ ์‚ฌ์šฉํ•˜์ž.... ๐Ÿ™„
728x90
728x90