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೔౔༵೔

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

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

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

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

  6. iotop ΋͔ͯ͠͠ɺ஌Βͣʹ͢ͰʹDTraceΛ࢖͍ͬͯͨʂ $ iotop dtrace: failed to initialize dtrace: DTrace

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

    OSΛDTraceʹϙʔτ͢Δͬͯ) DTRACE 11೥10݄15೔౔༵೔
  8. XCodeͷϓϩϑΝΠϥ͸DTraceΛ࢖͏ 11೥10݄15೔౔༵೔

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

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

    11೥10݄15೔౔༵೔
  11. ϓϩάϥϜ΋Մೳ dtrace -n ' syscall::open:entry /strstr(copyinstr(arg0), "corpus") != NULL/ {

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

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

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

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

    printf("%s %s",execname,copyinstr(arg0)); }' ʮcorpusʯͱ͍͏ϑΝΠϧΛ։͘ϓϩηεΛදࣔ ๻͕͜ͷεΫϦϓτΛॻ͍ͯ࢖ͬͨ 11೥10݄15೔౔༵೔
  16. σόοΨʔ Request Tracker (rt.cpan.orgͱ͔)Ͱ͸ mod_perlͷςετΛࣦഊͯͨ͠ɻ ๻ͷίϯϐϡʔλ͚ͩͰɻ ͨͿΜ೔ຊޠ͔ͩΒɻ 11೥10݄15೔౔༵೔

  17. σόοΨʔ Failed test 'gpg: error reading key: ެ։伴͕ݟ͔ͭΓ·ͤΜ' doesn't match

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

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

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

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

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

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

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

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

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

  28. ஫ҙʂ probe { if (ok) { x; } else {

    y; } } probe /ok/ { x; } probe /!ok/ { y; } ͳͥͳΒɺDTrace͕ҋຐज़Λ࢖͏ͩΖ͏ 11೥10݄15೔౔༵೔
  29. Perl ɾ5.10.0Ҏ߱: sub-entry, sub-return ɾ5.15.1Ҏ߱: phase-change (${^GLOBAL_PHASE}) ɹ ɾকདྷʁ: string

    eval౳ perldoc perldtrace 11೥10݄15೔౔༵೔
  30. Perl ɾ5.10.0Ҏ߱: sub-entry, sub-return ɾ5.15.1Ҏ߱: phase-change ɹ ɾকདྷʁ: string eval౳

    ๻ͷ࠷ॳPerlʹύονʂ ؆୯ͩͬͨʂ perldtrace 11೥10݄15೔౔༵೔
  31. ͍ͤͪ͝ΐ͏ ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ 11೥10݄15೔౔༵೔

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

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

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