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

Intrducing debug in WWDC2016

Intrducing debug in WWDC2016

WWDC.next

Toshihiro Morimoto

July 01, 2016
Tweet

More Decks by Toshihiro Morimoto

Other Decks in Technology

Transcript

  1. Intrducing debug in WWDC2016
    2016/07/01 WWDC.next
    @dealforest
    Toshihro Morimoto

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. View Slide

  4. WWDC2016 Debug Session
    1. #410 - Visual Debugging with Xcode
    2. #412 - Thread Sanitizer and Static Analysis
    3. #417 - Debugging Tips and Tricks

    View Slide

  5. WWDC2016 Debug Session
    1. #410 - Visual Debugging with Xcode (100P)
    2. #412 - Thread Sanitizer and Static Analysis (64P)
    3. #417 - Debugging Tips and Tricks (494P)

    View Slide

  6. WWDC2016 Debug Session
    1. #410 - Visual Debugging with Xcode (100P)
    2. #412 - Thread Sanitizer and Static Analysis (64P)
    3. #417 - Debugging Tips and Tricks (494P)

    View Slide

  7. ͜Μͳͷ 10 ෼Ͱ
    ঺հͰ͖ΔΘ͚ͳ͍Ͱ͢ΑͶwww

    View Slide

  8. ͱ͍͏Θ͚Ͱૣ଎͍͖·͢

    View Slide

  9. LLDB ͜ͱ͸͡Ί

    View Slide

  10. LLDB ͜ͱ͸͡Ί

    View Slide

  11. ม਺Λग़ྗ͢Δ
    • p
    • po
    • frame variable

    View Slide

  12. your app
    LLDB
    Swift Compiler
    inject

    View Slide

  13. your app
    LLDB
    Swift Compiler
    inject
    p, po ͸͜ͷλΠϓ

    View Slide

  14. your app
    LLDB
    Swift Compiler
    inject
    p: ΞϓϦଆͰ LLDB ͷ৘ใΛग़ྗ
    po: ΞϓϦଆͰఆٛͨ͠৘ใ(description)Λग़ྗ

    View Slide

  15. ͨͩ͠ʂʂʂʂ

    View Slide

  16. inject ʹࣦഊ͢Δέʔε͕
    Swift Ͱ͸ͨ·ʹൃੜ͠·͢

    View Slide

  17. LLDB ͷΤϥʔϝοηʔδͷΈ
    දࣔ͞Ε·͢

    View Slide

  18. ͭ·Γ͸࣮ߦ݁Ռ͕
    ಘΒΕͳ͍Θ͚Ͱ͢Ͷ

    View Slide

  19. ͦΜͳ࣌͸ frame variable Λ
    ࢖͍·͠ΐ͏

    View Slide

  20. LLDB
    Swift Compiler
    frame variable ͸ LLDB ͷதͰ׬݁͠·͢

    View Slide

  21. ͜ΕͰͲΜͳঢ়گͰ΋
    ม਺ͷग़ྗ͕ಘΒΕΔΑ͏ʹͳΓ·͢

    View Slide

  22. ͜Ε͚ͩ஌ͬͱ͍ͯ΋Β͑Ε͹
    ࠷௿ݶ࢖͑Δ͔ͳͱࢥ͍·͢

    View Slide

  23. Ͱ͸͜Ε͔Βۦ͚଍Ͱ
    ൃද͞Εͨ಺༰Λ
    ΩϟνΞοϓ͍͖ͯ͠·͠ΐ͏

    View Slide

  24. ม਺Λग़ྗ͢Δ
    • p
    • po
    • frame variable
    • parray
    • poarray

    View Slide

  25. ม਺Λग़ྗ͢Δ
    • p
    • po
    • frame variable
    • parray
    • poarray
    parray, poarray ͸ C ϙΠϯλ ͷ഑ྻΛදࣔ

    View Slide

  26. ม਺Λग़ྗ͢Δ
    int count = 5;
    int data[5] = { 1000, 2, 3, 17, 50 };
    int *dataset = data;
    (lldb) p dataset
    (int *) $1 = 0x00007fff5a5bedb0
    (lldb) po dataset
    0x00007fff5a5bedb0
    (lldb) parray 5 dataset
    (int *) $3 = 0x00007fff5a5bedb0 {
    (int) [0] = 1000
    (int) [1] = 2
    (int) [2] = 3
    (int) [3] = 17
    (int) [4] = 50
    }

    View Slide

  27. ม਺Λग़ྗ͢Δ
    int count = 5;
    int data[5] = { 1000, 2, 3, 17, 50 };
    int *dataset = data;

    View Slide

  28. ม਺Λग़ྗ͢Δ
    int count = 5;
    int data[5] = { 1000, 2, 3, 17, 50 };
    int *dataset = data;
    (lldb) poarray `count` dataset
    {
    1000
    2
    3
    17
    50
    }

    View Slide

  29. Objective-C ͷΠϯελϯεΛग़ྗ
    Objective-C Ͱ࡞ΒΕͨΠϯελϯε
    (lldb) po 0x1003183e0
    Enrico, 700 Swift Street, Mountain View, CA

    View Slide

  30. Objective-C ͷΠϯελϯεΛग़ྗ
    Objective-C Ͱ࡞ΒΕͨΠϯελϯε
    (lldb) po 0x1003183e0
    Enrico, 700 Swift Street, Mountain View, CA
    Swift ͷίʔυ
    (lldb) po 0x1003183e0
    4298212320

    View Slide

  31. Objective-C ͷΠϯελϯεΛग़ྗ
    Objective-C Ͱ࡞ΒΕͨΠϯελϯε
    (lldb) po 0x1003183e0
    Enrico, 700 Swift Street, Mountain View, CA
    Swift ͷίʔυ
    (lldb) po 0x1003183e0
    4298212320
    (lldb) expr -O --language objc -- 0x1003183e0
    Enrico, 700 Swift Street, Mountain View, CA
    po ͱ expr -O ͸ಉٛͰ͢

    View Slide

  32. import module
    (lldb) p [NSApplication sharedApplication].undoManager
    error: property ‘undoManager’ not found on object of type ‘id’

    View Slide

  33. import module
    (lldb) p [NSApplication sharedApplication].undoManager
    error: property ‘undoManager’ not found on object of type ‘id’
    (lldb) p @import AppKit
    (lldb) p [NSApplication sharedApplication].undoManager
    (NSUndoManager * __nullable) $1 = 0x00007fb399629cd0

    View Slide

  34. auto import module
    (lldb) p [NSApplication sharedApplication].undoManager
    (NSUndoManager * __nullable) $1 = 0x00007fb399629cd0

    View Slide

  35. auto import module
    (lldb) p [NSApplication sharedApplication].undoManager
    (NSUndoManager * __nullable) $1 = 0x00007fb399629cd0
    ͜ͷػೳΛແޮʹ͢Δ͜ͱ΋Ͱ͖·͢
    (lldb) settings show target.auto-import-clang-modules false

    View Slide

  36. ΧελϚΠζΛӬଓԽ
    • ~/.lldbinit or ~/.lldbinit-Xcode ʹίϚϯυΛॻ͍
    ͓͚ͯ͹ىಈ࣌ʹ࣮ߦ͞ΕΔ
    • Python ͷϥΠϒϥϦΛ import ͓͚ͯ͠͹
    LLDB ͕ attach ͞Εͨ࣌ʹ͙͢࢖͑Δ

    View Slide

  37. REPL
    $ swift
    Welcome to Apple Swift version 3.0. Type :help for assistance.
    1> po "Welcome to WWDC.next!!"
    error: repl.swift:2:3: error: consecutive statements on a line must be separated by ';'
    po "Welcome to WWDC.next!!"
    ^
    ;
    1> :po "Welcome to WWDC.next!!"
    "Welcome to WWDC.next!!"

    View Slide

  38. REPL
    $ swift
    Welcome to Apple Swift version 3.0. Type :help for assistance.
    1> :type lookup Comparable
    protocol Comparable : Equatable {
    @warn_unused_result func <(lhs: Self, rhs: Self) -> Swift.Bool
    @warn_unused_result func <=(lhs: Self, rhs: Self) -> Swift.Bool
    @warn_unused_result func >=(lhs: Self, rhs: Self) -> Swift.Bool
    @warn_unused_result func >(lhs: Self, rhs: Self) -> Swift.Bool
    }

    View Slide

  39. breakpoint ΋࢖͑·͢

    View Slide

  40. צͷ͍͍ਓ͸ؾ෇͍͔ͨ΋͠Ε·ͤΜ

    View Slide

  41. Playgroud Ͱ΋
    LLDB ͕ಈ͘ͷ͔ʂʂʂ

    View Slide

  42. ͱࢥͬͨਓ΋͍ΔͰ͠ΐ͏

    View Slide

  43. ࢒೦ͳ͕ΒμϝͰͨ͠

    View Slide

  44. ͨͩ͠࢖͑Δະདྷ͕
    ΍ͬͯ͘Δ͔΋͠Ε·ͤΜͶ

    View Slide

  45. REPL
    let value: Int? = 10
    value + 10
    ⚠Value of optional type 'Optional' not unwrapped; did you mean
    to use '!' or '?'?

    View Slide

  46. REPL
    let value: Int? = 10
    value + 10
    ⚠Value of optional type 'Optional' not unwrapped; did you mean
    to use '!' or '?'?
    (lldb) p Optional(10) + 10
    (Int) $R0 = 20
    Fixit applied, fixed expression was:
    Optional(10)! + 10

    View Slide

  47. Breakpoint
    • Symbolic Breakpoints
    • ಛఆͷ method, property ʹ step-in ͢Δ
    sif
    • ͲͷόΠφϦ͕ϩʔυ͞Ε͍ͯΔͷ͔
    image list
    • --queue-name (or -q) Ͱಛఆͷ queue ͕ dequeue ͞ΕΔλ
    ΠϛϯάͰ attach Ͱ͖Δ

    View Slide

  48. Breakpoint
    • ύλʔϯϚονϯάͰ attach ͢Δ͜ͱ͕Ͱ͖Δ
    function໊, ಛఆͷιʔείʔυͳͲ

    View Slide

  49. Breakpoint
    • ύλʔϯϚονϯάͰ attach ͢Δ͜ͱ͕Ͱ͖Δ
    function໊, ಛఆͷιʔείʔυͳͲ
    // Break here
    (lldb) break set --source-regexp "// Break here" -f main.swift

    View Slide

  50. Low-Level Debugging
    • Optimized code
    • Third-party code with no debug info

    View Slide

  51. Low-Level Debugging
    • Optimized code
    • Third-party code with no debug info
    ୭͠΋Ұ౓͸ܦݧ͋Δ͔ͱ͸ࢥ͍·͢

    View Slide

  52. Low-Level Debugging
    • Optimized code
    • Third-party code with no debug info
    ͭΒ͍Ͱ͢ΑͶ…

    View Slide

  53. ͜͜Ͱ͸;Ε·ͤΜ͕
    417 - Debugging Tips and Tricks
    ʹৄࡉ͕͋Γ·͢

    View Slide

  54. State Machine Quick Look

    View Slide

  55. View Slide

  56. Thread Sanitizer (TSan)

    View Slide

  57. only support
    • 64-bit macOS
    • 64-bit iOS and tvOS simulators

    View Slide

  58. View Slide

  59. Low-Level Debugging
    • Optimized code
    • Third-party code with no debug info
    FPS Performance Gauge

    View Slide

  60. Low-Level Debugging
    • Optimized code
    • Third-party code with no debug info
    Memory Graph Debugging

    View Slide

  61. iOSDC Ͱ͜ͷลΓͷࣄΛ࿩͔͢΋͠Ε·ͤΜ

    View Slide

  62. ·ͱΊ
    ػೳ௥Ճ΋͞Δ͜ͱͳ͕Β
    ࢿྉʹ͸طଘͷ؀ڥͰ΋
    ͙͢ʹ࢖͑Δϊ΢ϋ΢͕
    ͨ͘͞Μॻ͔Ε͍ͯ·͢

    View Slide

  63. ·ͱΊ
    ࠓ͙͢ʹͰ΋࢖͑ΔͷͰ
    ಡΉͱσόοάϥΠϑ͕
    ޾ͤʹͳΔ͔΋͠Ε·ͤΜͶ

    View Slide

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

    View Slide