Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPerKaigi 2024 - PHP 本体のバグを見つけたら適切に報告しよう
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
140
Other Decks in Technology
See All in Technology
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
420
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
110
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
260
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
240
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.3k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
240
ソフトウェアDNAとクラウドエージェントのススメ
cloudace
0
120
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
3
1.8k
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
事業課題から技術的負債に向き合う
sansantech
PRO
2
2k
beyond jj: config & tools ecosystem
indirect
0
5.5k
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
0
270
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
New Earth Scene 8
popppiees
4
2.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
570
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Why Our Code Smells
bkeepers
PRO
340
58k
Rails Girls Zürich Keynote
gr2m
96
14k
A Soul's Torment
seathinner
8
3.6k
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
How STYLIGHT went responsive
nonsquared
100
6.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
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 やろうよ!バグ報告