Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LLDB の世界からみた Swift

LLDB の世界からみた Swift

AKIBA.swift×Swift愛好会

Toshihiro Morimoto

August 29, 2016
Tweet

More Decks by Toshihiro Morimoto

Other Decks in Technology

Transcript

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

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. Works

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. ͸ʔʔʔ͍

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. LLDB ͷੈք͔ΒΈͨ Swift

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. ΊΜͲ͍͘͞Ͱ͢Ͷ

    View Slide

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

    View Slide

  22. ͕

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. ؔ਺ʹ͢Δ - 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)

    View Slide

  27. ؔ਺ʹ͢Δ - 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”))

    View Slide

  28. ؔ਺ʹ͢Δ
    // վߦ͢ΔͱΤϥʔʹͳΔͷͰҰߦͰॻ͘͜ͱ
    (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”))

    View Slide

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

    View Slide

  30. ຖճఆٛͯ͠࢖͏ͱ͔…

    View Slide

  31. 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

    View Slide

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

    View Slide

  33. 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

    View Slide

  34. 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

    View Slide

  35. 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

    View Slide

  36. 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

    View Slide

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

    View Slide

  38. 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

    View Slide

  39. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. ͍͔͕Ͱ͔ͨ͠ʁʁ

    View Slide

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

    View Slide

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

    View Slide