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

#phpcon2021 ステップ実行だけじゃないXdebug / hello-xdebug

#phpcon2021 ステップ実行だけじゃないXdebug / hello-xdebug

PHP Conference Japan 2021での発表資料です

https://fortee.jp/phpcon-2021/proposal/3ed8a69b-8618-4644-9a8c-655505078743

hideki kinjyo
PRO

October 03, 2021
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. ステップ実⾏だけじゃない
    Xdebug
    PHP Conference Japan 2021
    Hideki Kinjyo
    GitHub: o0h / Twitter: @o0h_
    [ൃද൛]

    View Slide

  2. Xdebugの話をします!

    View Slide

  3. 今⽇の⽬標:
    XdebugにSponsoringする⼈を
    1⼈でも増やす!
    お世話になっているOSSに貢献したい

    View Slide

  4. GitHubからどうぞ!
    https://github.com/sponsors/derickr

    View Slide

  5. アイコンと名前を載せましょう

    View Slide

  6. ࣗݾ঺հ
    • ⾦城秀樹 / きんじょうひでき
    • GitHub: @o0h / Twitter: @o0h_
    • 好きなFWはCakePHP
    • アイコンは
    美味しい鮭親⼦丼の写真です

    View Slide

  7. Xdebug、使っていますかー!

    View Slide

  8. Xdebugͱ͍͑͹ɾɾ
    ステップ実⾏!

    View Slide

  9. Xdebugͱ͍͑͹ɾɾ
    コードカバレッジ!

    View Slide

  10. あたりは、とてもよく使われている機能だと思います。

    View Slide

  11. ですが!!
    Xdebugにはもっと⾊々な機能があって、
    普段の開発をとっても便利にしてくれる凄い⼦・・・!
    なのです。

    View Slide

  12. トップページには5つの機能が!
    https://xdebug.org/

    View Slide

  13. という訳で!
    今回は、そんなXdebugの機能たちについて
    紹介していきたいと思います!

    View Slide

  14. ͓͠ͳ͕͖
    XdebugͷػೳͨͪΛ঺հ͍͖ͯ͠·͢ʂ
    1. Xdebug3ͷಋೖʹ͍ͭͯͬ͘͟Γͱ
    2. ։ൃϔϧύ / Development Helpers
    3. ϑΝϯΫγϣϯτϨʔγϯά / Tracing
    4. ϓϩϑΝΠϦϯά / Profiling
    5. ίʔυΧόϨοδ / Code Coverage Analysis
    6. ΨϕʔδίϨΫγϣϯ෼ੳ / GC Stats (ൃදͰ͸֓ཁ͚ͩ)
    7. εςοϓ࣮ߦ / Step Debugger (ൃදͰ͸֓ཁ͚ͩ)

    View Slide

  15. §1
    Xdebug3の導⼊についてざっくりと

    View Slide

  16. XdebugͷೖΕํ
    • Xdebug͸PHPͷ֦ுͰ͢
    • ʮPHP֦ுͷΠϯετʔϧʯͱʮઃఆϑΝΠϧͷهड़ʯ
    ͕ඞཁͰ͢ʂ
    • Πϯετʔϧʹ͍ͭͯ͸ެࣜαΠτΛݟ·͠ΐ͏ʂ
    https://xdebug.org/docs/install

    View Slide

  17. XdebugͷೖΕํ(ࢀߟྫ)
    ↓֤P/FͷύοέʔδϚωʔδϟΛར༻ՄೳͰ͢
    • Alpine(apk): `sudo apk add php7-pecl-xdebug`
    • Debian(apt): `sudo apt-get install php-xdebug`
    • PECL: `pecl install xdebug`

    View Slide

  18. XdebugͷೖΕํ(ࢀߟྫ2)
    ࢲ͕ྑ͘༡ͼͰ࢖͏Dockerfile͸͜Μͳײ͡Ͱ͢
    (git clone -> docker-php-ext-install)

    View Slide

  19. Xdebug3ͷઃఆ
    • Xdebug͸ɺver.3ʹͳͬͯ৭ʑͱઃఆ͕มΘΓ·ͨ͠ʂ
    • ෳࡶʹ๲Ε্͕ͬͯ͠·ͬͨͷͰɺεοΩϦ͍ͤͨ͞ʂ
    ͱ͍͏΋ͷͰ͢
    • ʮࣅͨΑ͏ͳ΋ͷʯʮ࢖ΘΕ͍ͯͳ͍΋ͷʯΛ੔ཧͨ͠
    ͍Ϟνϕ

    View Slide

  20. Xdebug on the way to time traveling
    by Derick Rethans
    https://derickrethans.nl/talks/xdebug-phpmad21.pdf

    View Slide

  21. xdebug.mode
    • Xdebug2Ͱ͸ɺʮ˓˓ͷػೳΛ༗ޮ/ແޮʯͱ͍͏ઃఆ߲໨͕ݸผʹ
    ઃ͚ΒΕ͍ͯ·ͨ͠
    • Xdebug3Ͱ͸ʮ༗ޮͳmodeͷྻڍʯͱ͍͏୯Ұͷ߲໨Λར༻͠·
    ͢(xdebug.mode)
    • ʮεςοϓ࣮ߦ͠ͳ͕ΒϓϩϑΝΠϧΛऔΔʯͱ͍ͬͨڍಈʹ͸͋
    ·Γࢫຯ͕͋Γ·ͤΜΑͶʁ
    • ʮҰॹʹ؅ཧͯ͠͠·ͬͨ΄͏͕ݟ௨͠΋ྑ͍͠ͳ͊ʯͱ

    View Slide

  22. ʮ͜ΜͳʹεοΩϦ͠·ͨ͠ʯͷྫ
    • 公式の移⾏ガイドの例を⾒ると、随分とコン
    パクトになっていることが分かります
    • modeには 「off」もしくは機能を指定します
    • 有効値: off / develop / coverage / debug /
    gcstats /profile /trace
    • 複数の機能をカンマ区切りで複数指定可能
    引⽤: Xdebug: Documentation » Xdebug 2 から 3 へのアップグレード
    https://xdebug.org/docs/upgrade_guide/ja

    View Slide

  23. Xdebugͷઃఆঢ়ଶͷ֬ೝ
    • Ͳͷmodeʹͳ͍ͬͯΔ͔ʁͲΜͳઃఆʹͳ͍ͬͯΔ͔ʁΛ
    ֬ೝ͍ͨ͠Ͱ͢ΑͶ
    • `phpinfo()` Ͱ΋ՄೳͰ͕͢ɺ
    `xdebug_info()` Λར༻͢ΔͱαΫοͱ෼͔Γ΍͍͢Ͱ͢
    • ઃఆɾઃఆͷσόοάʹ͍ͭͯ͸Youtubeʹ͋Δಈը͕਌੾
    参考: Xdebug 3: Diagnostics - YouTube
    https://www.youtube.com/watch?v=IN6ihpJSFDw

    View Slide

  24. xdebug_info()の例
    「Enabled Features」にはmodeごとのenabled/disabledが表⽰される

    View Slide

  25. §2
    開発ヘルパ / Development Helpers

    View Slide

  26. Development Helpers
    ֓ཁ
    var_dump()΍Τϥʔ/ྫ֎৘ใͷදࣔͷڧԽͳͲ
    ࢖͍ํ
    ؔ਺͕௥Ճɾ্ॻ͖͞ΕΔ
    xdebug.mode
    develop

    View Slide

  27. var_dump()ͷڧԽ
    • ඪ४ͷ `var_dump` ͷ৘ใΛڧԽ(= `xdebug_var_dump()`
    ͰͷΦʔόʔϩʔυ)͠·͢
    • HTMLλάͷ෇༩ɺग़ྗ৘ใͷ௥Ճ

    View Slide

  28. Τϥʔ৘ใͷڧԽ
    • ඪ४ͷΤϥʔϋϯυϥ/ྫ֎ϋϯυϥΛΦʔόʔϥΠυ͠ɺ
    දࣔ಺༰ɾܗࣜͷڧԽΛߦ͍·͢
    • ελοΫτϨʔεɺϩʔΧϧม਺ͷ஋ͷදࣔ
    • var_dump()ʹ΋͋ͬͨΑ͏ʹʮHTMLԽʯ
    • ύοͱݟͰಡΈ΍͘͢ͳΔςʔϒϧ౳

    View Slide

  29. ແޮ
    ༗ޮ

    View Slide

  30. ৭ʑͳઃఆ
    • දࣔ৘ใʹ੍͍ͭͯޚ͢ΔͨΊͷ৭ʑͳ
    ઃఆ͕ଘࡏ͠·͢
    • ͜ͷ৔Ͱ͸ׂѪɾɾʂ
    • →͸ެࣜυΩϡϝϯτͷΩϟϓνϟ
    • ʮmodeʹؔ࿈͢Δઃఆ߲໨ʯͳͷͰɺ
    දࣔपΓʹؔ܎͢Δ΋ͷҎ֎΋͋Γ·͢

    View Slide

  31. ΦϚέ: CLIͰ΋දࣔΛݟ΍͘͢
    • ʮWebͩͱHTMLදࣔʹͳΔʯͱ͍͏ͷʹ͸ݴٴࡁΈͰ͢
    ͕ɺ`’xdebug.cli_color`Λ༗ޮʹ͢ΔͱCLIͰ΋දࣔΛϦο
    νʹͰ͖·͢

    View Slide

  32. xdebug_time_index()
    • ॲཧ։͔࢝Βɺίʔϧ͞ΕΔ·Ͱͷܦա࣌ؒΛऔಘ͢Δ
    • ͓֮͑ͯ͘ͱɺλΠϚʔ࢓ࠐΜͰ࣌ؒΛܭଌ͍ͨ࣌͠ͱ͔
    ʹ࢖͑Δ͔΋

    View Slide

  33. xdebug_get_monitored_functions()
    • ࢦఆ͞Εͨؔ਺(ϝιου΋Մ)ͷར༻ঢ়گΛऔಘ͢Δ
    • ʮͲ͜Ͱ͜ͷؔ਺͕ݺ͹Ε͍ͯΔͷ͔ͳʁʯΛ஌Γ͍ͨ࣌
    ʹ
    • ྫ͑͹ʮdeprecatedʹ͍ͨ͠ʯʮϦϑΝΫλ͍ͨ͠ʯͱ
    ͖ʹ࢖͑Δʁ͔΋ʁ
    • ඪ४ؔ਺ͱ͔PHP֦ுͳͲɺεςοϓ࣮ߦ΍loggingΛ࢓
    ࠐΊͳ͍ࡍʹ΋ίϨͳΒ࢖͑Δ

    View Slide

  34. xdebug_get_monitored_functions()

    View Slide

  35. ͦͷଞͷؔ਺ͨͪ
    • XdebugͷΠϯετʔϧ࣌ʹ௥Ճ͞ΕΔؔ਺ͷதʹ͸ɺ։
    ൃମݧΛ޲্ͤ͞Δ͔΋஌Εͳ͍΋ͷؚ͕·Ε͍ͯ·͢
    • ެࣜυΩϡϝϯτΛνϥݟͯ͠Έ͍ͯͩ͘͞
    参考: Xdebug: Documentation » Development Helpers#Related Settings and Functions
    https://xdebug.org/docs/develop#related_settings_and_functions

    View Slide

  36. §3
    ファンクショントレーシング / Tracing

    View Slide

  37. Function Trace
    ֓ཁ
    ؔ਺ͷτϨʔε৘ใΛ෼ੳ͢Δ
    ࢖͍ํ
    `xdebug.start_with_request `ͷઃఆ΋͘͠͸`xdebug_start_trace()` Λ
    ༻͍ͯτϨʔεΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δ
    xdebug.mode
    trace

    View Slide

  38. ಈ࡞ྫ
    • ๭FWΛྫʹɺ࣮ࡍʹʮͲΜͳײ͡ͳͷʁʯͱ͍͏ྫΛ
    • `xdebug_start_trace()` / `xdebug_stop_trace()` ؔ਺Λར༻͠ɺ
    ؔ৺ͷ͋ΔՕॴ͚ͩൈ͖ग़ͯ͠ݟΔ
    • ʮmodeΛ༗ޮʹ͢Δ → ίʔυΛॻ͘ˠ ࣮ߦ͢Δ → ϑΝΠ
    ϧʹग़ྗ͞ΕΔʯͱ͍͏ྲྀΕʹͳΓ·͢
    • ࠓճͷྫͰ͸ˠͷΑ͏ʹઃఆ͠·ͨ͠

    View Slide

  39. ͜͜ͷτϨʔε͕
    ग़ྗ͞Ε·͢

    View Slide

  40. ʮUNQYEFCVHUSBDFYUʯ
    ͱ͍͏ϑΝΠϧ͕࡞੒͞Ε·ͨ͠

    View Slide

  41. ಈ࡞ྫ
    • ࣮ߦ͞ΕͨλΠϛϯά(xdebug_time_indexͷ஋)
    • ϝϞϦ࢖༻ྔ

    View Slide

  42. ಈ࡞ྫ
    • ωετϨϕϧ
    • ϝιου໊

    View Slide

  43. ͻͱ͜ͱɾɾ
    • `xdebug.collect_return` ΍ `xdebug.collect_assignments`
    Λઃఆ͢Δ͜ͱͰɺ໭Γ஋΍Ҿ਺ΛҰॹʹग़ྗ͢Δ͜ͱ͕
    Ͱ͖·͢
    • traceΛߦ͏ͱॏ͘ͳΔ(ʹ࣮ࡍͷύϑΥʔϚϯεΑΓ௿͘
    ͳΔ)ͷͰɺॲཧͷதʹ֤εςοϓ͕઎ΊΔ૬ରతͳׂ߹Λ
    ݟΔͷ͕ྑ͍͔΋Ͱ͢

    View Slide

  44. §4
    プロファイリング / Profiling

    View Slide

  45. Profiling
    ֓ཁ
    ࣮ߦঢ়گͷϓϩϑΝΠϦϯάΛߦ͏
    ࢖͍ํ
    `xdebug.start_with_request `ͷઃఆΛ༻͍ͯ݁ՌϑΝΠϧΛग़ྗ͢Δ
    xdebug.mode
    profile

    View Slide

  46. ಈ࡞ྫ
    • ࠓճͷྫͰ͸ˠͷΑ͏ʹઃఆ͠·ͨ͠
    • Ճ͑ͯɺϒϥ΢β֦ுͷXdebug Helper
    ͰprofileΛར༻͠·͢
    ͜ΕΛΠϯετʔϧ τϦΨʔ͢Δ

    View Slide

  47. ʮUNQYEFCVHDBDIFHSJOEPVUʯ
    ͱ͍͏ϑΝΠϧ͕࡞੒͞Ε·ͨ͠
    πʔϧΛ࢖ͬͯಡΈऔ͍͖ͬͯ·͢

    View Slide

  48. PhpStorm
    Tools > Analyze Xdebug Profiler Snapshot > ੜ੒͞Εͨ
    grindϑΝΠϧͷࢦఆ

    View Slide

  49. PhpStorm / Execution Statistics
    • ͦΕͧΕͷॲཧʹඅ΍ͨ࣌ؒ͠ɾϝ
    ϞϦͷ෼ੳ͕ग़དྷ·͢
    • Time/Memory: ͦͷॲཧʹඅ΍͠
    ͨίετ
    • Own Times / Memory: ݺͼग़͠ઌ
    Λআ͘ɺͦͷॲཧࣗମʹඅ΍ͨ͠
    ίετ
    • Calls: ݺͼग़͞Εͨճ਺

    View Slide

  50. PhpStorm / Callees, Callers
    Լ෦ʹ͋ΔྖҬͰɺ
    ݺͼग़͠ઌ(callee)ɾݺͼग़͠ݩ(caller)Λௐ΂Δ͜ͱ͕Ͱ͖·͢

    View Slide

  51. PhpStorm
    • path mappingΛઃఆ͓͚ͯ͠
    ͹ɺϓϩϑΝΠϧσʔλ͔Β
    ௚઀ιʔείʔυ΁ͷδϟϯ
    ϓ͕ՄೳͰ͢
    • ಛʹॲཧ͕ॏ͍(ׂ߹͕େ͖͍)
    ΋ͷ͸ύοͱݟͰ෼͔ΔΑ͏
    ʹͳ͍ͬͯΔͷ΋خ͍͠Ͱ͢
    • ӈΩϟϓνϟͷ੨ࣈ෦෼

    View Slide

  52. • XdebugͷυΩϡϝϯτͰ঺հ͞Ε͍ͯΔͷ͸
    ʮKCacheGrind ʯʮQCacheGrindʯʮWebgrindʯ
    • ͦΕͧΕରԠϓϥοτϑΥʔϜ͕ҟͳΔ
    • ݸਓతʹ͸QCacheGrindΛ(΋)࢖͍ͬͯ·͢
    • WebgrindΛ࢖ͬͨྫ͸
    WEB+DB PRESS Vol.122ʹ͋Δهࣄ͕Φεεϝ
    ͦͷଞͷπʔϧ

    View Slide

  53. §5
    コードカバレッジ / Code Coverage Analysis

    View Slide

  54. Code Coverage Analysis
    ֓ཁ
    ࣮ߦ͞ΕͨίʔυͷΧόϨοδ෼ੳΛߦ͏
    ࢖͍ํ
    `xdebug_start_code_coverage()`Λ༻͍ͯ෼ੳΛ։࢝͠ɺ݁ՌϑΝΠϧ
    Λग़ྗ͢Δ
    xdebug.mode
    coverage

    View Slide

  55. • جຊతʹ͸PHPUnitͰͷར༻͕ଟ͍ͱࢥ͍·͢
    • ผͷ࢖͍ํͷఏҊͱͯ͠ɺʮ࣮ࡍͷಈ࡞Ͱ࢖ΘΕ͍ͯΔ
    ίʔυΛௐ΂Δʯͱ͍͏΋ͷ͕঺հ͞Ε͍ͯ·͢
    (by Derick Rethansࢯ @YouTube)
    • `phpunit/php-code-coverage` Λ༻͍ͯɺϓϩμΫτίʔ
    υଆͰΧόϨοδͷऩूΛىಈ͢Δख๏
    ಈ࡞ྫ

    View Slide

  56. Xdebug 3: Code Coverage for Websites - YouTube
    https://www.youtube.com/watch?v=T9rwW-uySBE

    View Slide

  57. Code Coverage for Websites
    1. (PHPUnitファミリーの)カバレッジライブラリをイ
    ンスタンス化して

    View Slide

  58. Code Coverage for Websites
    2. カバレッジの取得開始のために起動して

    View Slide

  59. Code Coverage for Websites
    3. レポート出⼒処理を、shutdown functionとして実
    ⾏するように登録して

    View Slide

  60. Code Coverage for Websites
    4. 今作成したファイルを、実際の処理(今回は `route.php`)
    に含まれるようにrequireして

    View Slide

  61. Code Coverage for Websites
    5. カバレッジが出⼒されました!!の図

    View Slide

  62. ͻͱ͜ͱɾɾ
    • うまく活⽤できれば、「もう使われていないコー
    ド」を⼀網打尽にできそうだな〜という感じが
    • 要らないコードを安⼼感持って捨てられる武器に
    なるのは嬉しい!

    View Slide

  63. §6
    ガベージコレクション分析 / GC Stats
    ൃදͰ͸֓ཁ͚ͩ

    View Slide

  64. Garbage Collection Statistics
    ֓ཁ
    ΨϕʔδίϨΫγϣϯͷ࣮ࢪঢ়گͷ෼ੳΛߦ͏
    ࢖͍ํ
    `xdebug.start_with_request `ͷઃఆ΋͘͠͸`xdebug_start_gcstats()`
    Λ༻͍ͯ෼ੳΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δ
    xdebug.mode
    gcstats

    View Slide

  65. §7
    ステップ実⾏ / Step Debugger
    ൃදͰ͸֓ཁ͚ͩ

    View Slide

  66. Step Debugging
    ֓ཁ
    εςοϓ࣮ߦΛߦ͏
    ࢖͍ํ
    `xdebug.start_with_request `ͷઃఆΛ͠ɺ(DBGpΫϥΠΞϯτͷ)ϒϨ
    ΠΫϙΠϯτઃఆ΋͘͠͸`xdebug_break()` Λ༻͍ͯεςοϓ࣮ߦΛ
    ߦ͏
    xdebug.mode
    debug

    View Slide

  67. §X
    まとめ

    View Slide

  68. Xdebugʹॿ͚ΒΕ·ͨ͠ʂͱ͍͏ମݧஊ
    • ステップ実⾏: 初めて⾒るコードでも流れを終えると⼀気に進みます
    ね!
    • プロファイリング:「環境構築がやっと終わりました!」くらいの経
    験値ほぼゼロなプロジェクトでも、パフォーマンス改善の実施に取
    り組めたこともあります
    • カバレッジ: 「不要なコードのあぶり出し」はいつかやってみたい・・
    • その他、リファクタする時などに際して⾊々と便利そうな機能をフ
    ル活⽤していきたいです

    View Slide

  69. ࢀߟจݙ
    • WEB+DB PRESS Vol.122には
    「パフォーマンスチューニングをしよう PHP 8で
    XdebugとWebgrindを使ってプロファイリング」
    というお話が載っています
    • Xdebugの中の⼈(Derick Rethans⽒)が
    Youtubeに解説動画を投稿しています
    youtube.com/playlist?list=PLg9Kjjye-m1g_eXpdaifUqLqALLqZqKd4

    View Slide

  70. • Derick Rethans⽒による、「Xdebug 3でどうしたい
    のか」というお話。開発段階での構想を語ったもの
    https://www.youtube.com/watch?v=KemV2XViUbQ
    ࢀߟจݙ

    View Slide

  71. ·ͱΊ
    • Xdebugには⾊々な機能があるよ!という話でした
    • 「ちょっと使っているけど、実は雰囲気で触っている」み
    ちいなやつありませんか?
    • 改めて、公式サイトや開発者のブログなどを⾒ると、新た
    な発⾒があるかも知れません!!

    View Slide

  72. アイコンと名前を載せましょう

    View Slide

  73. ご清聴
    ありがとうございました🎉

    View Slide