Slide 1

Slide 1 text

2016/08/29 AKIBA.swift×SwiftѪ޷ձ @dealforest Toshihiro Morimoto LLDB ͷੈք͔ΒΈͨ Swift

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

Works

Slide 4

Slide 4 text

ࠓ೔͸ iOSDC Ͱ͓࿩ͨ͠͠ ಺༰ͷҰ෦ΛਂງΓ͍͖ͯ͠·͢

Slide 5

Slide 5 text

ͦͷલʹେࣄͳ͓ئ͍͕͋Γ·͢

Slide 6

Slide 6 text

LLDB ͷ࿩͸ϙΧʔʔϯͱͳͬͯ ൓Ԡ͕ͳ͘൵͘͠ͳΔͷͰ 3ׂΓ૿͠Ͱ͓ئ͍͠·͢!

Slide 7

Slide 7 text

Έͳ͞Μ Swift ͸޷͖Ͱ͔͢ʁʁ

Slide 8

Slide 8 text

͸ʔʔʔ͍

Slide 9

Slide 9 text

Ͳ͜Ͱ࢖͏ Swift ͕޷͖Ͱ͔͢ʁʁ

Slide 10

Slide 10 text

• iOS Application, Playground, etc.. • Server Side Swift • Swift Compiler • Swift Interpliter Language (SIL) • LLDB

Slide 11

Slide 11 text

• iOS Application, Playground, etc.. • Server Side Swift • Swift Compiler • Swift Interpliter Language (SIL) • LLDB

Slide 12

Slide 12 text

LLDB ͷੈք͔ΒΈͨ Swift

Slide 13

Slide 13 text

࣮ߦ͢Δ (lldb) p “AKIBA.swift×SwiftѪ޷ձ” (String) $R1 = “AKIBA.swift×SwiftѪ޷ձ" (lldb) po “AKIBA.swift×SwiftѪ޷ձ” “AKIBA.swift×SwiftѪ޷ձ” (lldb) po $R1 “AKIBA.swift×SwiftѪ޷ձ”

Slide 14

Slide 14 text

ม਺Λఆٛ͢Δ (lldb) po let $text = “AKIBA.swift×SwiftѪ޷ձ" (lldb) po $text “AKIBA.swift×SwiftѪ޷ձ”

Slide 15

Slide 15 text

ؔ਺Λఆٛ͢Δ // վߦ͢ΔͱΤϥʔʹͳΔͷͰҰߦͰॻ͘͜ͱ (lldb) po func $getText() -> String { return “AKIBA.swift×SwiftѪ޷ձ” ɹ} (lldb) po $getText() “AKIBA.swift×SwiftѪ޷ձ”

Slide 16

Slide 16 text

UIImage ΛϑΝΠϧʹग़ྗ͢Δ (lldb) po let $path = “/Users/dealforest/lldb.png” (lldb) po let $image = UIImage(named: “sample”) (lldb) po let $data = UIImagePNGRepresentation($image)! (lldb) po $data.writeToFile($path, atomically: true)

Slide 17

Slide 17 text

LLDB ͷੈք͔ΒݟΔͱ Կ͕ҧ͏ͷ͔

Slide 18

Slide 18 text

ҧ͏఺ • 1໋ྩ1ߦ • ຖճ po Λ͚ͭΔඞཁ͕͋Δ • ࣗ෼Ͱఆٛͨ͠ม਺Λఆٛɺࢀর͢Δͱ͖ʹ $ Λɹɹɹ ͚ͭΔඞཁ͕͋Δ

Slide 19

Slide 19 text

طଘͷ Swift ίʔυΛ ͦͷ··ͩͱಈ͖·ͤΜ

Slide 20

Slide 20 text

ΊΜͲ͍͘͞Ͱ͢Ͷ

Slide 21

Slide 21 text

repl Ͱ࣮ߦͯ͠΍Ε͹ ͜ͷ͋ͨΓͷ໰୊͸େମղܾ͠·͢

Slide 22

Slide 22 text

͕

Slide 23

Slide 23 text

LLDB ͷੈքʹ Swift ͷੈքΛ ࡞Γ্͛ΔͷͰগ͠ҧ͏ؾ΋͠·͢

Slide 24

Slide 24 text

ͦΕʹ͜ͷ··Ͱ͸ Έͳ͞Μ࢖͏ؾ΋ى͖ͳ͍Ͱ͢ΑͶ

Slide 25

Slide 25 text

Ͳ͏ʹ͔͍͖ͯ͠·͠ΐ͏

Slide 26

Slide 26 text

ؔ਺ʹ͢Δ - before (lldb) po let $path = “/Users/dealforest/lldb.png” (lldb) po let $image = UIImage(named: “sample”) (lldb) po let $data = UIImagePNGRepresentation($image)! (lldb) po $data.writeToFile($path, atomically: true)

Slide 27

Slide 27 text

ؔ਺ʹ͢Δ - after // վߦ͢ΔͱΤϥʔʹͳΔͷͰҰߦͰॻ͘͜ͱ (lldb) po func $saveImage(image: UImage) { let path = “/Users/dealforest/lldb.png”; let data = UIImagePNGRepresentation(image)!; data.writeToFile(path, atomically: true); } (lldb) po $saveImage(UIImage(named: “sample”))

Slide 28

Slide 28 text

ؔ਺ʹ͢Δ // վߦ͢ΔͱΤϥʔʹͳΔͷͰҰߦͰॻ͘͜ͱ (lldb) po func $saveImage(image: UImage) { let path = “/Users/dealforest/lldb.png”; let data = UIImagePNGRepresentation(image)!; data.writeToFile(path, atomically: true); } (lldb) po $saveImage(UIImage(named: “sample”))

Slide 29

Slide 29 text

ͦΕʹɺ͜ͷ··Ͱ͸ ͜ͷؔ਺͸ӬଓԽ͞Ε·ͤΜ

Slide 30

Slide 30 text

ຖճఆٛͯ͠࢖͏ͱ͔…

Slide 31

Slide 31 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): frame = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame() result = frame.EvaluateExpression(command) target = result.GetLocation() expr = "expr -l objc++ -- (NSData *)UIImagePNGRepresentation((id)" + target + ")" frame.EvaluateExpression(expr) imagePath = '/Users/dealforest/lldb.png' saveImageTemplate = 'expr -l objc++ -- (void) [(NSData *){} writeToFile:@"{}" atomically:YES];' saveImageExpr = createImageFormatStr.format(result.GetName(), imagePath) lldb.debugger.HandleCommand(saveImageExpr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." save_image.py

Slide 32

Slide 32 text

LLDB Plugin ʹ͢Δ command script import /save_image.py // ͜ΕͰىಈ࣌ʹಡΈࠐ·ΕΔͨΊӬଓԽ͞ΕΔ ~/.lldbinit

Slide 33

Slide 33 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): frame = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame() result = frame.EvaluateExpression(command) target = result.GetLocation() expr = "expr -l objc++ -- (NSData *)UIImagePNGRepresentation((id)" + target + ")" frame.EvaluateExpression(expr) imagePath = '/Users/dealforest/lldb.png' saveImageTemplate = 'expr -l objc++ -- (void) [(NSData *){} writeToFile:@"{}" atomically:YES];' saveImageExpr = createImageFormatStr.format(result.GetName(), imagePath) lldb.debugger.HandleCommand(saveImageExpr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." ίϚϯυͷఆٛ save_image.py

Slide 34

Slide 34 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): frame = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame() result = frame.EvaluateExpression(command) target = result.GetLocation() expr = "expr -l objc++ -- (NSData *)UIImagePNGRepresentation((id)" + target + ")" frame.EvaluateExpression(expr) imagePath = '/Users/dealforest/lldb.png' saveImageTemplate = 'expr -l objc++ -- (void) [(NSData *){} writeToFile:@"{}" atomically:YES];' saveImageExpr = createImageFormatStr.format(result.GetName(), imagePath) lldb.debugger.HandleCommand(saveImageExpr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." UIImage ͷ pointer Λऔಘ save_image.py

Slide 35

Slide 35 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): frame = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame() result = frame.EvaluateExpression(command) target = result.GetLocation() expr = "expr -l objc++ -- (NSData *)UIImagePNGRepresentation((id)" + target + ")" frame.EvaluateExpression(expr) imagePath = '/Users/dealforest/lldb.png' saveImageTemplate = 'expr -l objc++ -- (void) [(NSData *){} writeToFile:@"{}" atomically:YES];' saveImageExpr = createImageFormatStr.format(result.GetName(), imagePath) lldb.debugger.HandleCommand(saveImageExpr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." UIImage Λ NSData ʹม׵ save_image.py

Slide 36

Slide 36 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): frame = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame() result = frame.EvaluateExpression(command) target = result.GetLocation() expr = "expr -l objc++ -- (NSData *)UIImagePNGRepresentation((id)" + target + ")" frame.EvaluateExpression(expr) imagePath = '/Users/dealforest/lldb.png' saveImageTemplate = 'expr -l objc++ -- (void) [(NSData *){} writeToFile:@"{}" atomically:YES];' saveImageExpr = createImageFormatStr.format(result.GetName(), imagePath) lldb.debugger.HandleCommand(saveImageExpr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." NSData ΛϑΝΠϧʹอଘ save_image.py

Slide 37

Slide 37 text

͡Ό͊͜ΕΛؔ਺Ͱॻ͘ͱ ͜͏ͳΓ·͢

Slide 38

Slide 38 text

LLDB Plugin ʹ͢Δ #!/usr/bin/env python import lldb def save_image(debugger, command, result, internal_dict): lldb.debugger.HandleCommand(""" expr -l swift -- func $saveImage(image: UIImage) { let $data = UIImagePNGRepresentation($image)! $data.writeToFile("/Users/dealforest/lldb.png", atomically: true) } """.strip()) expr = 'expr -l swift -- $saveImage(' + command + ')' lldb.debugger.HandleCommand(expr) def __lldb_init_module(debugger,internal_dict): debugger.HandleCommand("command script add -f save_image.save_image save_image") print"save_image command enabled." save_image.py

Slide 39

Slide 39 text

LLDB Plugin ʹ͢Δ lldb.debugger.HandleCommand(""" expr -l swift -- func $saveImage(image: UIImage) { ɹɹɹɹɹɹɹɹɹ ɹ let $path = “/Users/dealforest/lldb.png” let $data = UIImagePNGRepresentation($image)! $data.writeToFile(path, atomically: true) } """.strip()) save_image.py

Slide 40

Slide 40 text

͜ͷؔ਺ͷதͰ͸ ݟ׳Εͨ Swift Ͱ͢Ͷ

Slide 41

Slide 41 text

޻෉࣍ୈͰී௨ʹ Swift ͕ ॻ͚ΔΑ͏ʹͳΓ·͢

Slide 42

Slide 42 text

؆୯ʹσόοά༻ͷίϚϯυΛ ࡞Δ͜ͱ΋Ͱ͖ΔͷͰΦεεϝͰ͢Α

Slide 43

Slide 43 text

͍͔͕Ͱ͔ͨ͠ʁʁ

Slide 44

Slide 44 text

Swift ͰΘ͍Θ͍͢Δωλʹ ͳΕΕ͹޾͍Ͱ͢

Slide 45

Slide 45 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠