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

DTrace: 最強な魔法使いのprintfのようなデバッガ

Shawn Moore
October 23, 2011

DTrace: 最強な魔法使いのprintfのようなデバッガ

DTraceは、コンピューターが何を動作していることを調べるために、とても強力なツールです。プロダクションでも使えますよ。ネットワーク監視という神様が怒らず!

これは、Perlのやさしい世界の厳しい外部でも、デバッグや最適化や監視をするツールです。アプリケーションのコードを汚染していないままで、再起動が必要でなくて、トレースを示す可能があります!しかも、他の使っているモジューでも、カーネルプロセスでも、他のアプリケーションル(例えば:MySQL、Apache)でも、トレースで動作を検査できます。printfのようなデバッグすることが好きの方にとって、DTraceも好きになると思います。

このトークでは、「DTraceはすごすぎるよ!」と聞いたが使ったことがない方のためにDTrace入門です。それ以外で、PerlのDTraceのサポートと、Perlに追加したプローブを説明します。

Shawn Moore

October 23, 2011
Tweet

More Decks by Shawn Moore

Other Decks in Programming

Transcript

  1. @sartak
    DTRACE
    printf debugging for seventh-level wizards
    ࠷ڧͳຐ๏࢖͍ͷprintfͷΑ͏ͳσόοΨ
    11೥10݄15೔౔༵೔

    View Slide

  2. ࣗݾ঺հ
    ɹShawn M Mooreɹ
    ˏsartak
    Mooseʹ͍͔͞͞ߩݙ͠Α͏ͱ͢Δ
    ϘετϯʹॅΜͰ͍Δ
    ձࣾ: Infinity Interactive
    11೥10݄15೔౔༵೔

    View Slide

  3. ॻ͍ͨϞʔδϡϧ
    MooseX::Role::Parameterized
    Any::Moose
    cpandoc
    Carp::REPL
    Path::Dispatcher
    App::Nopaste
    (CPAN: SARTAK)
    ଞʹɺ࢖Θͳ͍ͷํ͕͍͍ͬͯଟ͘ͷϞʔδϡϧ
    11೥10݄15೔౔༵೔

    View Slide

  4. DTRACE
    11೥10݄15೔౔༵೔

    View Slide

  5. ࠓɺίϯϐϡʔλ͕ԿΛͯ͠Δͷʁ
    ࣭໰:
    ౴͑: DTraceͰ஌Δ͜ͱʹͳΕΔ
    ਖ਼௚ͳ౴͑:
    ͍͍ͨͯɺχίχίͰಲೣΛ؍ͯΔ
    11೥10݄15೔౔༵೔

    View Slide

  6. iotop
    ΋͔ͯ͠͠ɺ஌Βͣʹ͢ͰʹDTraceΛ࢖͍ͬͯͨʂ
    $ iotop
    dtrace: failed to initialize dtrace:
    DTrace requires additional privileges
    11೥10݄15೔౔༵೔

    View Slide

  7. OS X & Solaris(શ෦). Linux(͔΋͠Εͳ͍)
    ϓϩϑΝΠϥʔ
    (NYTProfΑΓਂ͘)
    σόοΨʔ
    ΧʔωϧϞʔδϡϧ
    (DTraceΛOSʹϙʔτ͠ͳͯ͘ɺ
    OSΛDTraceʹϙʔτ͢Δͬͯ)
    DTRACE
    11೥10݄15೔౔༵೔

    View Slide

  8. XCodeͷϓϩϑΝΠϥ͸DTraceΛ࢖͏
    11೥10݄15೔౔༵೔

    View Slide

  9. 
    dtruss
    iotop
    opensnoop
    iosnoop
    pidpersec
    man -k dtrace
    11೥10݄15೔౔༵೔

    View Slide

  10. DTraceͱ઀৮఺
    ɾΧʔωϧ (syscallؚΜͩ) ͷؔ਺Λݺͼɺฦ͠
    ɾPerlͷؔ਺Λݺͼɺ໭Γ
    ɾSQL࣮ߦ
    ɾthreads
    ɾsignals
    ɾଞͷΠϕϯτ͕ଟ͍
    ϓϩʔϒ
    11೥10݄15೔౔༵೔

    View Slide

  11. ϓϩάϥϜ΋Մೳ
    dtrace -n '
    syscall::open:entry
    /strstr(copyinstr(arg0), "corpus") != NULL/ {
    printf("%s %s",execname,copyinstr(arg0));
    }'
    ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ
    ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ
    11೥10݄15೔౔༵೔

    View Slide

  12. ϓϩάϥϜ΋Մೳ
    dtrace -n '
    syscall::open:entry
    /strstr(copyinstr(arg0), "corpus") != NULL/ {
    printf("%s %s",execname,copyinstr(arg0));
    }'
    ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ
    ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ
    Πϕϯτ(ϓϩʔϒͷهड़)
    11೥10݄15೔౔༵೔

    View Slide

  13. ϓϩάϥϜ΋Մೳ
    dtrace -n '
    syscall::open:entry
    /strstr(copyinstr(arg0), "corpus") != NULL/ {
    printf("%s %s",execname,copyinstr(arg0));
    }'
    ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ
    ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ
    ड़ޠ
    11೥10݄15೔౔༵೔

    View Slide

  14. ϓϩάϥϜ΋Մೳ
    dtrace -n '
    syscall::open:entry
    /strstr(copyinstr(arg0), "corpus") != NULL/ {
    printf("%s %s",execname,copyinstr(arg0));
    }'
    ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ
    ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ
    ΞΫγϣϯ
    11೥10݄15೔౔༵೔

    View Slide

  15. ϓϩάϥϜ΋Մೳ
    dtrace -n '
    syscall::open:entry
    /strstr(copyinstr(arg0), "corpus") != NULL/ {
    printf("%s %s",execname,copyinstr(arg0));
    }'
    ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ
    ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ
    11೥10݄15೔౔༵೔

    View Slide

  16. σόοΨʔ
    Request Tracker (rt.cpan.orgͱ͔)Ͱ͸
    mod_perlͷςετΛࣦഊͯͨ͠ɻ
    ๻ͷίϯϐϡʔλ͚ͩͰɻ
    ͨͿΜ೔ຊޠ͔ͩΒɻ
    11೥10݄15೔౔༵೔

    View Slide

  17. σόοΨʔ
    Failed test
    'gpg: error reading key: ެ։伴͕ݟ͔ͭΓ·ͤΜ'
    doesn't match '(?-xism:public key not found)'
    11೥10݄15೔౔༵೔

    View Slide

  18. σόοΨʔ
    RT͸೔ຊޠ൛͕͋Δ͚Ͳɺ
    ʮެ։伴͕ݟ͔ͭΓ·ͤΜʯͱ͍͏༁͕ɾɾɾͳ͔ͬͨʂʁ
    11೥10݄15೔౔༵೔

    View Slide

  19. σόοΨʔ
    ͋ʂͦͷจ͸GPG͔Βདྷ͔ͨͳɾɾɾ
    11೥10݄15೔౔༵೔

    View Slide

  20. σόοΨʔ
    gpg-2.0.18 $ ack -a ެ։伴͕ݟ͔ͭΓ·ͤΜ
    gpg-2.0.18 $
    11೥10݄15೔౔༵೔

    View Slide

  21. σόοΨʔ
    gpg-2.0.18 $ echo "ެ։伴͕ݟ͔ͭΓ·ͤΜ" |
    iconv -f UTF-8 -t EUCJP | xargs ack -ao |
    iconv -f EUCJP -t UTF-8
    Binary file po/ja.gmo matches
    po/ja.po:2965:ެ։伴͕ݟ͔ͭΓ·ͤΜ
    po/ja.po:6525:ެ։伴͕ݟ͔ͭΓ·ͤΜ
    po/ja.po:8311:ެ։伴͕ݟ͔ͭΓ·ͤΜ
    gpg-2.0.18 $
    11೥10݄15೔౔༵೔

    View Slide

  22. σόοΨʔ
    ͜ͷࣦഊ͸mod_perl͚͔ͩͩΒɺ؀ڥม਺͕ؒҧ͏ͩΖ͏
    $LANGɺ$LC_ALL౳
    11೥10݄15೔౔༵೔

    View Slide

  23. σόοΨʔ
    
    LC_ALL=en gpg
    LC_ALL=ja gpg
    LC_ALL= gpg
    opensnoop
    11೥10݄15೔౔༵೔

    View Slide

  24. σόοΨʔ
    DTraceΛ࢖Θͳ͍Ͱɺ
    GPGͷࣗମʹprintΛଟ͘௥Ճ͢Δඞཁ
    11೥10݄15೔౔༵೔

    View Slide

  25. DTraceΛ࢖͏ؾͳ͍ͥɻ
    ͳͥͳΒɺࠓ͜ͷΞϓϦͷ஗͍ཧ༝Λௐ΂͍͕ͨɺ
    ͋ΒΏΔΞϓϦͷ஗͍ཧ༝Λݚڀ͢Δઐ໳Ոʹੜ֔Λ͛ͨ͘͞͞ͳ͍Μͩɻ
    (༁͸૬౰ͰͨΒΊͰ͢ɺΰϝϯͳʂ)
    11೥10݄15೔౔༵೔

    View Slide

  26. ͑͑͑͑͑ʁ
    ੑೳղੳ͕Լखʹଓ͚͍͔ͨʁ
    ͋ΒΏΔΞϓϦΛߴ଎Խʹग़དྷͳ͍ʁ
    ͦͷϘιϘιͰ΋DTraceΛ৆ࢍͩͱࢥ͏
    11೥10݄15೔౔༵೔

    View Slide

  27. ஫ҙʂ
    DTraceͷݴޠ͸ɺʮifʯ͕ͳ͍ʂ
    ୅ΘΓʹɺड़ޠΛ࢖͍·͠ΐ͏Ͷ
    ß
    11೥10݄15೔౔༵೔

    View Slide

  28. ஫ҙʂ
    probe {
    if (ok) {
    x;
    } else {
    y;
    }
    }
    probe /ok/ {
    x;
    }
    probe /!ok/ {
    y;
    }
    ͳͥͳΒɺDTrace͕ҋຐज़Λ࢖͏ͩΖ͏
    11೥10݄15೔౔༵೔

    View Slide

  29. Perl
    ɾ5.10.0Ҏ߱: sub-entry, sub-return
    ɾ5.15.1Ҏ߱: phase-change (${^GLOBAL_PHASE})
    ɹ
    ɾকདྷʁ: string eval౳
    perldoc perldtrace
    11೥10݄15೔౔༵೔

    View Slide

  30. Perl
    ɾ5.10.0Ҏ߱: sub-entry, sub-return
    ɾ5.15.1Ҏ߱: phase-change
    ɹ
    ɾকདྷʁ: string eval౳
    ๻ͷ࠷ॳPerlʹύονʂ
    ؆୯ͩͬͨʂ
    perldtrace
    11೥10݄15೔౔༵೔

    View Slide

  31. ͍ͤͪ͝ΐ͏
    ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠
    11೥10݄15೔౔༵೔

    View Slide

  32. one more thing . . .
    11೥10݄15೔౔༵೔

    View Slide

  33. օͷݸਓͷεϙϯαʔ
    ຊ౰ʹ
    ͋Γ͕ͱ͏͍͟͝·͢
    11೥10݄15೔౔༵೔

    View Slide

  34. ࣭໰͸͋Γ·ͤΜ͔ʁ
    ೔ຊޠͰ΋̤̠Ͱ͢ʂ
    slides: http://twitter.com/sartak
    11೥10݄15೔౔༵೔

    View Slide