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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Go Kudo
March 11, 2024
Technology
2.6k
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
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
170
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
150
toB プロダクトから見たWAF
tokai235
0
250
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
200
“詰む”前に仕組みを作れ 〜技術の波に溺れないためのキャッチアップ術〜
takasyou
7
4.3k
技術・能力を向上する原理原則 #きのこセッションa #きのこ2026
bash0c7
0
140
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
590
Fabricをフル活用する AI Agent Hub -製造業特化AIエージェントの設計
iotcomjpadmin
0
160
When Platform Engineering Meets GenAI
sucitw
0
200
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
130
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
280
製造現場での生成AIの活用、およびエージェントAIの実装のあり方、AVEVAの取り組み
iotcomjpadmin
0
180
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Why Our Code Smells
bkeepers
PRO
340
58k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
The untapped power of vector embeddings
frankvandijk
2
1.8k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
210
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
Facilitating Awesome Meetings
lara
57
7k
The Cult of Friendly URLs
andyhume
79
6.9k
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 やろうよ!バグ報告