Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPerKaigi 2024 - PHP 本体のバグを見つけたら適切に報告しよう
Search
Go Kudo
March 11, 2024
Technology
2.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPerKaigi 2024 - PHP 本体のバグを見つけたら適切に報告しよう
Go Kudo
March 11, 2024
More Decks by Go Kudo
See All by Go Kudo
phpcon2024_kudo_tmp
zeriyoshi
0
130
Other Decks in Technology
See All in Technology
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
460
【GCC2026】大規模言語モデルを活用した内製検索サービスの社内展開や業務活用
bandainamcostudios
PRO
0
530
VLMで2.3万枚のPyCon JP写真を検索!
terapyon
1
460
Claude Teamプランの コスト最適化を考える
rfdnxbro
0
230
コミュニティから始まった農業IoTとの7年間 ——人との関わりが教えてくれたこと
peacemaker07
0
110
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
20
7.2k
AI-DLC実践録_フルサイクル開発への挑戦
miyuc
0
420
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
RelayerというPHPのフレームワークを作った
polidog
PRO
0
140
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
320
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
270
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How to Ace a Technical Interview
jacobian
281
24k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Practical Orchestrator
shlominoach
191
12k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
380
Product Roadmaps are Hard
iamctodd
55
12k
Prompt Engineering for Job Search
mfonobong
0
420
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Transcript
PHP 本体のバグを見つけたら 適切に報告しよう 工藤 剛
• 社会人 6 年目 • モバイルゲーム会社勤務 ◦ お仕事で PHP 利用中
▪ たまに php-src にコントリビュートしたり OSS 出したりも • 興味対象 ◦ PHP ◦ 自作キーボード ◦ 電子工作 自己紹介
PHP のバグを踏んだことは ありますか?
では... バグ報告しましたか?
ぶっちゃけ難しい!
• 実行環境の情報 ◦ バージョン ◦ OS ◦ etc • 再現コード
バグ報告に必要なもの 簡単なバグなら これだけで十分だが...
特定の状況下でしか発生しないバグも多い • 数リクエスト処理後に発生 • 数時間すると発生 • OPcache 有効時にのみ発生 • etc…
だいたいの不具合はより複雑 再現できないバグは 修正できない!
• デバッグビルドでの検証結果 ◦ 拡張の有効・無効状態の詳細 ◦ 実行環境情報 ◦ スタックトレース バグ報告するときに更に役立つもの
• デバッグビルドでの検証結果 ◦ 拡張の有効・無効状態の詳細 ◦ 実行環境情報 ◦ スタックトレース バグ報告するときに更に役立つもの
デバッグビルド とは
バグを見つけやすい形でビルドされた PHP 基本的にバイナリで提供されていない=自分でビルドが必要 デバッグビルド版 PHP
PHP のビルドは 難しいって聞いたんだけど...
Debian 系ならこれだけ 踏んだバグの部分に応じて 適宜ライブラリを追加 & 拡張を有効化 (PDO など) 最低限のビルドならそんなに難しくない $
sudo apt-get update $ sudo apt-get install -y build-essential autoconf autotools-dev re2c bison git $ git clone https://github.com/php/php-src $ cd php-src $ ./buildconf --force $ ./configure --disable-all --disable-phpdbg --disable-cgi --disable-fpm --enable-cli --enable-debug $ make -j$(nproc) $ ./sapi/cli/php
もっと簡単に!
$ docker run --rm -it php:8.3.0-cli /bin/bash # php -r
'var_dump(range(9.9, "0"));' Segmentation fault PHP 8.3.0 のバグを再現してみる
# docker-php-source extract # cd /usr/src/php # ./configure --disable-all --enable-debug
# make -j$(nproc) # ./sapi/cli/php -v PHP 8.3.0 (cli) (built: Mar 8 2024 12:56:02) (NTS DEBUG) Copyright (c) The PHP Group Zend Engine v4.3.0, Copyright (c) Zend Technologies # ./sapi/cli/php -r 'var_dump(range(9.9, "0"));' Segmentation fault そこからデバッグビルド版にする
# apt-get update # apt-get install -y gdb # gdb
--args ./sapi/cli/php -r 'var_dump(range(9.9, "0"));' (gdb) run Starting program: /usr/src/php/sapi/cli/php -r var_dump\(range\(9.9,\ \"0\"\)\)\; [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1". Program received signal SIGSEGV, Segmentation fault. zif_range (execute_data=0xfffff7a130f0, return_value=0xfffff7a13070) at /usr/src/php/ext/standard/array.c:2963 2963 unsigned char low = (unsigned char)Z_STRVAL_P(user_start)[0]; gdb を入れてスタックトレースを取る 原因の行まで 特定できた!
gdb の画面で “backtrace” 詳細なバックトレースを出力
もっと見やすく!
PHP (php-src) には gdb 用の補助スクリプトが同梱されている ネストした PHP スクリプトも簡単にトレースできる # gdb
--command /usr/src/php/.gdbinit --args ./sapi/cli/php <PHPファ イル> zbacktrace
ごく稀に発生するやつは どうする?
gdb はコアダンプからもスタックトレースを解析できる! # gdb <実行ファイルのパス> <コアダンプのパス> --command <.gdbinit へのパス> コアダンプを取って解析する
プロダクション環境に デバッグビルドを入れるの 困難では?
頑張るしかない... おすすめは canary 環境にデバッグビルドの PHP を 仕込んでおき流量をコントロール canary 環境は APM
等入れていて遅くなっていることが多いので まだ許容できることが多い (はず) コアダンプ取りにくい問題
• バグ報告怖くない! ◦ ここまで詳細にレポートできなくてもとにかく上げるのが大事 ◦ 報告されなかったばかりに放置されている不具合もあった ▪ DateTime 周り https://github.com/php/php-src/pull/11473
• やってみようという心意義を大切に! • わからなければ聞いてください! ◦ X: https://x.com/zeriyoshi やろうよ!バグ報告