Xcode์—์„œ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

Xcode Compiler

์• ํ”Œ์˜ macOS, iOS, watchOS, tvOS ๊ฐœ๋ฐœ IDE

  • ์ปดํŒŒ์ผ๋Ÿฌ
    • ํ”„๋ก ํŠธ์—”๋“œ
      • ์–ดํœ˜ ๋ฐ ๊ตฌ๋ฌธ ๋ถ„์„
      • tokenizer, syntax
      • Clang
        • C, C++, Objective C๋ฅผ ๋ถ„์„ํ•จ
      • Swift Compiler
        • Swift ์ปดํŒŒ์ผ ์šฉ๋„
    • ๋ฏธ๋“ค์—”๋“œ
      • ํ”„๋กœ๊ทธ๋žจ์˜ ์›๋ž˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ, ์ตœ์ ํ™” ์ž‘์—… ์ง„ํ–‰
      • c์˜ ๊ฒฝ์šฐ obj ํŒŒ์ผ์— ํ•ด๋‹น
      • java์˜ ๊ฒฝ์šฐ jvm์œ„์—์„œ ๋„๋Š” bytecode
      • LLVM
        • ์ด์ „์—๋Š” gcc
        • Intermdediate Reperesntation ์ƒ์„ฑ
    • ๋ฐฑ์—”๋“œ
      • ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๊ฐ€ ํƒ€๊ฒŸ ์•„ํ‚คํ…์ณ์—์„œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
      • LLVM
        • ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ ์ƒ์„ฑ
    • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ง€์› ์–ธ์–ด์™€ ์ง€์› ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ๋ฌด๊ฑฐ์›Œ์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • ์ง€์› ์–ธ์–ด๋กœ๋Š” C, C++, Objective-C, Swift, AppleScript, Java, Python, Ruby ๋“ฑ์ด ์žˆ๋‹ค.

LLDB

LLVM ํ”„๋กœ์ ํŠธ ์ผํ™˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๋””๋ฒ„๊ฑฐ

LLVM์˜ Clang ํ‘œํ˜„, parser, LLVM Deassembler ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ œ์ž‘๋˜์—ˆ๋‹ค. C, C++, Objective-C, Swift ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.

  • Thread
    • ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ๋‚˜ ํ๋ฆ„์„ ์ œ์–ด
  • Frame
    • ์Šค๋ ˆ๋“œ์—์„œ stack ๋ณ„๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋‹จ์œ„
    • ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ๋””๋ฒ„๊น…ํ•  ๋•Œ ์™ผ์ชฝ์— ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ์ฝœ์Šคํƒ์„ ๋ˆŒ๋Ÿฌ์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋‹จ์œ„๋ฅผ frame์ด๋ผ ํ•จ
  • Disassemble
    • ์•„ํ‚คํ…์ณ์— ๋งž๊ฒŒ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋ฅผ ๊ทธ๋‚˜๋งˆ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ(์–ด์…ˆ๋ธ”๋ฆฌ์–ด)๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋…€์„
  • Backtrace
    • ์‹คํ–‰์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์ฝœ์Šคํƒ์ด๋‚˜ ๋กœ์ปฌ์— ์Œ“์ด๋Š”๋ฐ ์ด๋ฅผ ์—ญ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • Expression
    • LLDB ์ƒ์—์„œ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ํ™•์ธ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹
  • Break point
    • ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ
  • Watch point
    • ์–ด๋–ค ๋ณ€์ˆ˜๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณ€ํ•  ๋•Œ ๋ฉˆ์ถ”๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ

Commands

  • C
    • continue
    • ์ •์ง€๋œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์žฌ๊ฐœ
  • n
    • next
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ์†Œ์Šค ์ˆ˜์ค€ ํ•œ๋‹จ๊ณ„ ์ง„ํ–‰ (์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ๋ผ์ธ ์˜๋ฏธ)
  • s
    • step
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ์†Œ์Šค ์ˆ˜์ค€ ํ•œ๋‹จ๊ณ„ ๋‚ด๋ถ€ ์ง„ํ–‰
  • finish
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ๋ฒ—์–ด๋‚จ
  • ni
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ๋ช…๋ น์–ด ์ˆ˜์ค€ ํ•œ๋‹จ๊ณ„ ์ง„ํ–‰ (์‹ค์ œ ๋ฐ”์ด๋Ÿฌ๋‹ˆ ๋ช…๋ น์–ด ์˜๋ฏธ)
  • si
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ๋ช…๋ น์–ด ์ˆ˜์ค€ ํ•œ๋‹จ๊ณ„ ๋‚ด๋ถ€ ์ง„ํ–‰

Variables

  • fr v
    • fr: frame์˜ ์•ฝ์ž
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜ ์ถœ๋ ฅ
  • fr v -a (automatic)
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ ์ถœ๋ ฅ
  • fr v [๋ณ€์ˆ˜ ์ด๋ฆ„]
    • ์ง€์—ญ ๋ณ€์ˆ˜์ค‘ ํ•ด๋‹น ๋ณ€์ˆ˜๋งŒ ์ถœ๋ ฅ
  • fr v -f x [๋ณ€์ˆ˜ ์ด๋ฆ„]
    • ํ•ด๋‹น ๋ณ€์ˆ˜๋งŒ hex๋กœ ์ถœ๋ ฅ
  • fr variable -O self
    • object์˜ description ์ถœ๋ ฅ
  • ta v
    • ํ˜„์žฌ ์†Œ์ŠคํŒŒ์ผ์— ์ •์˜๋œ ์ „์—ญ/์ •์  ๋ณ€์ˆ˜ ์ถœ๋ ฅ
  • ta v [๋ณ€์ˆ˜ ์ด๋ฆ„]
    • ์ „์—ญ ๋ณ€์ˆ˜์ค‘, ํ•ด๋‹น ๋ณ€์ˆ˜๋งŒ ์ถœ๋ ฅ

Thread

  • thread list
    • ํ˜„์žฌ ์Šค๋ ˆ๋“œ ๋ชฉ๋ก ์ถœ๋ ฅ
  • thread select [thread number]
    • ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋กœ ์ด๋™
  • thread until [code line]
    • ํ•ด๋‹น ๋ผ์ธ๊นŒ์ง€ ์Šค๋ ˆ๋“œ ์‹คํ–‰
  • thread jump -line [code line]
    • ํ•ด๋‹น ๋ผ์ธ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ด๋™
  • thread jump -by +/- [code line]
    • ํ•ด๋‹น ๋ผ์ธ ์ˆ˜๋งŒํผ ์Šค๋ ˆ๋“œ ์ด๋™
  • thread return [return value]
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ํŠน์ • ๊ฐ’ ๋ฐ˜ํ™˜

Disassemble

  • di -f
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ํ•จ์ˆ˜๋ฅผ ๋””์–ด์…ˆ๋ธ”
  • di -n
    • ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋””์–ด์…ˆ๋ธ”
  • di -f -m
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ถœ๋ ฅ
  • di -l
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ํ˜„์žฌ ์†Œ์Šค ์ฝ”๋“œ ๋ผ์ธ์„ ๋””์–ด์…ˆ๋ธ”

Backtrace

  • bt
    • ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ stack trace ์ถœ๋ ฅ
  • bt all
    • ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ stack trace ์ถœ๋ ฅ
  • bt [count]
    • ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ stack trace๋ฅผ ๊ฐœ์ˆ˜๋งŒํผ ์ถœ๋ ฅ
  • up
    • ํ˜„์žฌ ์„ ํƒ๋œ ํ”„๋ ˆ์ž„์—์„œ ์œ„๋กœ ์ด๋™
  • down
    • ํ˜„์žฌ ์„ ํƒ๋œ ํ”„๋ ˆ์ž„์—์„œ ์•„๋ž˜๋กœ ์ด๋™

Expression

  • e
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ํ‘œํ˜„์‹ ๊ณ„์‚ฐ
  • p
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ํ‘œํ˜„์‹ ๊ณ„์‚ฐ
  • expr [expression]
    • LLDB์ƒ ๋ณ€์ˆ˜ ์„ ์–ธ
  • po [object, variable]
    • ๊ฐ์ฒด, ๋ณ€์ˆ˜์˜ description ์ถœ๋ ฅ
  • po [memory address]
    • ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๊ฐ’ ์ถœ๋ ฅ

Breakpoint

  • b [function name]
    • ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ชจ๋“  ํ•จ์ˆ˜์— Breakpoint ์„ค์ • (swift)
  • breakpoint set -name [class name]
    • ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ชจ๋“  ํ•จ์ˆ˜์— breakpoint ์„ค์ • (objective-c)
  • b [line count]
    • ํ˜„์žฌ ํŒŒ์ผ์˜ ํŠน์ • ๋ผ์ธ์— breakpoint ์„ค์ •
  • breackpoint modify -c [condition]
    • ํ•ด๋‹น ์กฐ๊ฑด์— ๋Œ€ํ•ด breakpoint ์„ค์ •
  • b l
    • breakpoint ๋ชฉ๋ก ์ถœ๋ ฅ

ETC

  • wa s v global_var
    • ์ „์—ญ ๋ณ€์ˆ˜์— watchpoint ์„ค์ •
  • wa s e -[memory address]
    • ํ•ด๋‹น ์ฃผ์†Œ์— watchpoint ์„ค์ •
  • script [python]
    • python์„ LLDB script๋กœ ์‚ฌ์šฉ

Visual Debugging

View Debugging

  • View hierachy
  • View Layout
  • View Constraints

Memory Debugging

  • ์‹œ๊ฐ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฒดํฌ
  • ๊ฐ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๊ด€๊ณ„ ํ‘œ์‹œ
  • Referenbce cycle๋“ฑ์˜ ํ™•์ธ์ด ํŽธ๋ฆฌํ•˜๋‹ค.

Profiler

์„ฑ๋Šฅ ๊ฐœ์„ , ์ตœ์ ํ™” ์œ„ํ•ด ๋งŽ์ด ์‚ฌ์šฉ

Memory Profiler

  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ™•์ธ ๊ฐ€๋Šฅ
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋“ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ํŽธ๋ฆฌ

Timer Profiler

  • ๋ณ‘๋ชฉ ๋ฐœ์ƒ ๋ถ€๋ถ„ ํ™•์ธ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜๋ณ„ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํ”„๋กœํŒŒ์ผ๋ง
  • ์–ด๋–ค ๋ฉ”์†Œ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅ

ETC

  • breakpoint์— ์ด๋ฆ„, ์กฐ๊ฑด, ๋ฌด์‹œ ๋“ฑ์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.
  • breakpoint์—์„œ ์™ผ์ชฝ ํด๋ฆญํ•˜๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅ

Reference