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

C90bac78c0fb61105cfd8239767f903d?s=128

hideki kinjyo
PRO

October 03, 2021
Tweet

Transcript

  1. ステップ実⾏だけじゃない Xdebug PHP Conference Japan 2021 Hideki Kinjyo GitHub: o0h

    / Twitter: @o0h_ [ൃද൛]
  2. Xdebugの話をします!

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

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

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

  6. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です
  7. Xdebug、使っていますかー!

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

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

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

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

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

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

  14. ͓͠ͳ͕͖ XdebugͷػೳͨͪΛ঺հ͍͖ͯ͠·͢ʂ 1. Xdebug3ͷಋೖʹ͍ͭͯͬ͘͟Γͱ 2. ։ൃϔϧύ / Development Helpers 3.

    ϑΝϯΫγϣϯτϨʔγϯά / Tracing 4. ϓϩϑΝΠϦϯά / Profiling 5. ίʔυΧόϨοδ / Code Coverage Analysis 6. ΨϕʔδίϨΫγϣϯ෼ੳ / GC Stats (ൃදͰ͸֓ཁ͚ͩ) 7. εςοϓ࣮ߦ / Step Debugger (ൃදͰ͸֓ཁ͚ͩ)
  15. §1 Xdebug3の導⼊についてざっくりと

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

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

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

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

  20. Xdebug on the way to time traveling by Derick Rethans

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

    • ʮҰॹʹ؅ཧͯ͠͠·ͬͨ΄͏͕ݟ௨͠΋ྑ͍͠ͳ͊ʯͱ
  22. ʮ͜ΜͳʹεοΩϦ͠·ͨ͠ʯͷྫ • 公式の移⾏ガイドの例を⾒ると、随分とコン パクトになっていることが分かります • modeには 「off」もしくは機能を指定します • 有効値: off

    / develop / coverage / debug / gcstats /profile /trace • 複数の機能をカンマ区切りで複数指定可能 引⽤: Xdebug: Documentation » Xdebug 2 から 3 へのアップグレード https://xdebug.org/docs/upgrade_guide/ja
  23. Xdebugͷઃఆঢ়ଶͷ֬ೝ • Ͳͷmodeʹͳ͍ͬͯΔ͔ʁͲΜͳઃఆʹͳ͍ͬͯΔ͔ʁΛ ֬ೝ͍ͨ͠Ͱ͢ΑͶ • `phpinfo()` Ͱ΋ՄೳͰ͕͢ɺ `xdebug_info()` Λར༻͢ΔͱαΫοͱ෼͔Γ΍͍͢Ͱ͢ •

    ઃఆɾઃఆͷσόοάʹ͍ͭͯ͸Youtubeʹ͋Δಈը͕਌੾ 参考: Xdebug 3: Diagnostics - YouTube https://www.youtube.com/watch?v=IN6ihpJSFDw
  24. xdebug_info()の例 「Enabled Features」にはmodeごとのenabled/disabledが表⽰される

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

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

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

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

  29. ແޮ ༗ޮ

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

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

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

  33. xdebug_get_monitored_functions() • ࢦఆ͞Εͨؔ਺(ϝιου΋Մ)ͷར༻ঢ়گΛऔಘ͢Δ • ʮͲ͜Ͱ͜ͷؔ਺͕ݺ͹Ε͍ͯΔͷ͔ͳʁʯΛ஌Γ͍ͨ࣌ ʹ • ྫ͑͹ʮdeprecatedʹ͍ͨ͠ʯʮϦϑΝΫλ͍ͨ͠ʯͱ ͖ʹ࢖͑Δʁ͔΋ʁ •

    ඪ४ؔ਺ͱ͔PHP֦ுͳͲɺεςοϓ࣮ߦ΍loggingΛ࢓ ࠐΊͳ͍ࡍʹ΋ίϨͳΒ࢖͑Δ
  34. xdebug_get_monitored_functions()

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

    Development Helpers#Related Settings and Functions https://xdebug.org/docs/develop#related_settings_and_functions
  36. §3 ファンクショントレーシング / Tracing

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

    trace
  38. ಈ࡞ྫ • ๭FWΛྫʹɺ࣮ࡍʹʮͲΜͳײ͡ͳͷʁʯͱ͍͏ྫΛ • `xdebug_start_trace()` / `xdebug_stop_trace()` ؔ਺Λར༻͠ɺ ؔ৺ͷ͋ΔՕॴ͚ͩൈ͖ग़ͯ͠ݟΔ •

    ʮmodeΛ༗ޮʹ͢Δ → ίʔυΛॻ͘ˠ ࣮ߦ͢Δ → ϑΝΠ ϧʹग़ྗ͞ΕΔʯͱ͍͏ྲྀΕʹͳΓ·͢ • ࠓճͷྫͰ͸ˠͷΑ͏ʹઃఆ͠·ͨ͠
  39. ͜͜ͷτϨʔε͕ ग़ྗ͞Ε·͢

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

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

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

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

    ݟΔͷ͕ྑ͍͔΋Ͱ͢
  44. §4 プロファイリング / Profiling

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

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

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

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

  49. PhpStorm / Execution Statistics • ͦΕͧΕͷॲཧʹඅ΍ͨ࣌ؒ͠ɾϝ ϞϦͷ෼ੳ͕ग़དྷ·͢ • Time/Memory: ͦͷॲཧʹඅ΍͠

    ͨίετ • Own Times / Memory: ݺͼग़͠ઌ Λআ͘ɺͦͷॲཧࣗମʹඅ΍ͨ͠ ίετ • Calls: ݺͼग़͞Εͨճ਺
  50. PhpStorm / Callees, Callers Լ෦ʹ͋ΔྖҬͰɺ ݺͼग़͠ઌ(callee)ɾݺͼग़͠ݩ(caller)Λௐ΂Δ͜ͱ͕Ͱ͖·͢

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

    ʹͳ͍ͬͯΔͷ΋خ͍͠Ͱ͢ • ӈΩϟϓνϟͷ੨ࣈ෦෼
  52. • XdebugͷυΩϡϝϯτͰ঺հ͞Ε͍ͯΔͷ͸ ʮKCacheGrind ʯʮQCacheGrindʯʮWebgrindʯ • ͦΕͧΕରԠϓϥοτϑΥʔϜ͕ҟͳΔ • ݸਓతʹ͸QCacheGrindΛ(΋)࢖͍ͬͯ·͢ • WebgrindΛ࢖ͬͨྫ͸

    WEB+DB PRESS Vol.122ʹ͋Δهࣄ͕Φεεϝ ͦͷଞͷπʔϧ
  53. §5 コードカバレッジ / Code Coverage Analysis

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

  55. • جຊతʹ͸PHPUnitͰͷར༻͕ଟ͍ͱࢥ͍·͢ • ผͷ࢖͍ํͷఏҊͱͯ͠ɺʮ࣮ࡍͷಈ࡞Ͱ࢖ΘΕ͍ͯΔ ίʔυΛௐ΂Δʯͱ͍͏΋ͷ͕঺հ͞Ε͍ͯ·͢ (by Derick Rethansࢯ @YouTube) •

    `phpunit/php-code-coverage` Λ༻͍ͯɺϓϩμΫτίʔ υଆͰΧόϨοδͷऩूΛىಈ͢Δख๏ ಈ࡞ྫ
  56. Xdebug 3: Code Coverage for Websites - YouTube https://www.youtube.com/watch?v=T9rwW-uySBE

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

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

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

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

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

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

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

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

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

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

    xdebug.mode debug
  67. §X まとめ

  68. Xdebugʹॿ͚ΒΕ·ͨ͠ʂͱ͍͏ମݧஊ • ステップ実⾏: 初めて⾒るコードでも流れを終えると⼀気に進みます ね! • プロファイリング:「環境構築がやっと終わりました!」くらいの経 験値ほぼゼロなプロジェクトでも、パフォーマンス改善の実施に取 り組めたこともあります •

    カバレッジ: 「不要なコードのあぶり出し」はいつかやってみたい・・ • その他、リファクタする時などに際して⾊々と便利そうな機能をフ ル活⽤していきたいです
  69. ࢀߟจݙ • WEB+DB PRESS Vol.122には 「パフォーマンスチューニングをしよう PHP 8で XdebugとWebgrindを使ってプロファイリング」 というお話が載っています

    • Xdebugの中の⼈(Derick Rethans⽒)が Youtubeに解説動画を投稿しています youtube.com/playlist?list=PLg9Kjjye-m1g_eXpdaifUqLqALLqZqKd4
  70. • Derick Rethans⽒による、「Xdebug 3でどうしたい のか」というお話。開発段階での構想を語ったもの https://www.youtube.com/watch?v=KemV2XViUbQ ࢀߟจݙ

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

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

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