
バグ報告から再現・原因特定までの最短ルート
「〇〇の画面が、たまにおかしくなります」。 ふわっとした一文のバグ報告が届いて、でも自分の手元では何度やっても再現しない——。保守運用をしていると、この「再現できないバグ」との時間が、いちばん心をすり減らしますよね。
原因がわからないまま「様子を見ます」と返すのは気が重いし、かといって当てずっぽうでコードを直すのはもっとこわい。焦って触ったせいで、別のところを壊してしまった経験がある人も多いと思います。
この記事では、バグ報告を受けてから再現し、原因を特定するまでを「最短ルート」で進める手順を一緒に整理します。天才的なひらめきではなく、迷わないための順番の話です。
結論:バグ調査は、①報告を「再現できる情報」に翻訳する → ②手元で再現させる(これが9割)→ ③原因を切り分けで挟み撃ちにする → ④直す前に「なぜ起きたか」を1行で言えるか確認するの順で進めます。いきなりコードを読み始めず、まず「どうすれば必ず再現するか」を突き止めることに時間を使うのが、結果として最短になります。
調べ方やコマンドは、言語や構成(PHPかその他か、フレームワークやログ基盤の有無)で変わります。順番と考え方を出発点に、自分の現場の道具に置き換えて使ってください。
何が起きているか:バグが「つかめない」3つの理由
原因にたどり着けないとき、たいてい詰まっているのは「原因を考える力」ではなく、その手前です。自分の能力を責める前に、どこで止まっているのかを知っておくと落ち着けます。
- 報告があいまいで、何を再現すればいいか分からない:「おかしい」「たまに」だけでは、こちらは動けません。原因調査以前に、再現の入口が見えていない状態です。
- 再現できていないのに、原因を探し始めている:再現しないバグは、直したかどうかも確かめられません。にもかかわらず、いきなりコードとにらめっこして消耗しがちです。
- 原因の候補が広すぎる:コード・データ・環境・タイミング……どこにでもありうると思うと、手が止まります。範囲を狭める手順がないまま、勘で当たりをつけている状態です。
この3つは、どれも「順番に潰す」ことで抜けられます。次から、入口の①から見ていきます。
バグ調査を最短で進める4ステップ

順番に進めるのがコツです。とくに、②の「再現」ができるまでは、③の原因探しに深入りしないと決めておくと、迷子になりにくくなります。
① 報告を「再現できる情報」に翻訳する
最初の一手は、コードを開くことではなく、報告を具体的な条件に翻訳することです。ここが決まらないと、この先すべてがぼやけます。
報告者に聞く(または自分でログから埋める)のは、次の5つです。
- いつ:日時。だいたいでいい(「今日の午後」でも手がかりになる)。
- 誰が:どのユーザー・どの権限・どの端末やブラウザか。
- 何をしたら:直前の操作。どのボタン、どの画面、どんな入力値か。
- 何が起きたか:出たエラー文言、止まった場所、表示のおかしさ。スクショがあれば最強。
- 毎回か/たまにか:再現率。ここが「再現できるか」を大きく左右します。
一度に全部そろわなくて大丈夫です。「エラーが出た正確な時刻」と「そのときの操作」の2つが分かるだけで、調査は一気に前に進みます。聞くときも「使い方が悪かったのでは」という空気を出さず、「直したいので、状況だけ教えてください」と伝えると、相手も答えやすくなります。
② 手元で再現させる(ここが9割)
バグ調査でいちばん時間を使うべきは、実はここです。確実に再現する手順が1つ見つかれば、原因特定はほぼ終わったようなものだからです。逆に、再現しないまま直したコードは、直った証拠がありません。
再現に近づくために、次を順番に試します。
- ①でそろえた条件(ユーザー・操作・入力値)を、そっくりそのまま手元でなぞる。
- 再現しないときは、本番と手元の違いを疑う:データの中身、ユーザー権限、設定値、時刻や件数、ブラウザ。
- それでも出ないときは、その時刻のログを正としてたどる。エラーログ・アクセスログから「そのとき何が呼ばれたか」を追い、操作を逆算する。
「たまにしか起きない」バグは、再現条件が1つ隠れていることがほとんどです。特定のデータのときだけ、月初だけ、2回連続で押したときだけ——。ランダムに見えても、たいてい引き金があります。その引き金を探すのが、この工程の本当の仕事です。
どうしても手元で再現しないときは、無理に本番でいきなり再現させようとせず、ログを一時的に厚くする手があります。あやしい処理の入口と出口に、値や分岐を書き出すログを1〜2行足しておき、次に起きたときに証拠が残るようにします(本番でログを足すときは、パスワードや個人情報を書き出さないよう気をつけてください)。
③ 原因を切り分けで「挟み撃ち」にする
再現できたら、いよいよ原因の場所を狭めます。コツは、コードを上から順に読むのではなく、「どこまでは正常で、どこから異常か」の境界を挟み撃ちで探すことです。
- データを二分する:あるデータでは起きて、別のデータでは起きないなら、その差が原因に直結します。
- 処理を二分する:入力→処理→出力のどこで値が壊れるか。途中に値を出力して、「ここまでは正しい/ここからおかしい」の境界を探す。
- 時間軸を二分する:以前は動いていたなら、いつから壊れたか。変更履歴(デプロイ・設定変更・データ移行)と突き合わせる。Gitで管理していれば、正常だった時点と壊れた時点を指定して原因のコミットを絞り込む
git bisectも使えます。
大事なのは、一度に一つだけ変えることです。あれもこれも同時に変えると、何が効いたのか分からなくなります。「1か所変えて、再現するか確かめる」を繰り返すと、原因の範囲が半分ずつ狭まっていきます。
④ 直す前に「なぜ起きたか」を1行で言えるか確認する
原因の場所が見えたら、すぐ直したくなります。でも、その前に一呼吸。「なぜこのバグが起きたのか」を、自分の言葉で1行で説明できるかを確かめます。
- 「〇〇のとき、△△が想定外の値になり、□□でエラーになる」——こう言い切れるか。
- 言い切れないなら、まだ「たまたま直りそうな場所」を見ているだけかもしれません。
- 1行で言えたら、その条件をわざと作って再現し、修正後に再現しなくなることまで確認する。
ここを飛ばすと、「症状は消えたけど原因は別にあった」「別の入口から同じバグが再発した」が起きがちです。1行で説明できることは、直したという確信と、報告者への説明の両方を支えてくれます。
具体例:「たまに合計金額がズレる」を追ってみる
「注文一覧の合計が、たまに1円ズレる」という、つかみどころのない報告で考えてみます。
- ①翻訳:いつ・どの注文で・いくらのはずが・いくらになったか、を1件だけでいいので特定してもらう。
- ②再現:その注文データを手元に持ってきて再現。手元でも1円ズレた → 特定のデータで必ず起きると判明。ここで山を越えます。
- ③切り分け:金額の計算を途中で出力すると、税額の計算で端数処理(四捨五入か切り捨てか)が、明細ごとと合計とで食い違っていた。
- ④原因を1行で:「明細ごとに丸めた金額を足すと、合計を先に丸めた金額と1円ズレる」。条件を作って再現 → 端数処理をそろえて修正 → 再現しなくなることを確認。
「たまに」「1円」という小さな報告が、丸め方の食い違いという一点に着地しました。②で「必ず再現するデータ」を1つ押さえられたのが、決め手です。
影響:調べる順番を持っておくと、何が変わるか
バグ調査の順番を1枚持っておくと、直す力そのものより先に、焦りが減ります。
- 「原因がわからない」ではなく「今は②の再現で止まっている」と、自分の現在地が言える。
- 再現を最優先にするので、「直したつもり」で終わらず、直った確証を持てる。
- 「ここまで切り分けて、原因はこの処理です」と、報告者や上司に途中経過を説明できる。
- 同じ手順を毎回使うことで、調査の質が、その日の気力や勘に左右されにくくなる。
逆に、毎回いきなりコードを読み始めると、運よく気づけた日と、半日溶かした日の差が大きく出てしまいます。順番は、その日の自分を助けるための道具です。
明日やること:次のバグ報告で「再現メモ」を1枚作る
立派な調査票は要りません。明日できる、いちばん小さな一歩はこれです。
- 次に来たバグ報告を1つ選び、①の5項目(いつ・誰が・何をしたら・何が起きたか・毎回かたまにか)を箇条書きで埋める。
- 埋まらない項目は、報告者に1〜2個だけ質問して足す。
- その条件を手元でなぞり、「再現できた/できない」をメモに書く。
- 再現できたら、その手順を1行で書き留める(これが一番の資産)。
- 再現できなければ、あやしい処理にログを1行足して、次に起きたときの証拠を待つ。
きれいにまとめなくて大丈夫です。「どうすれば再現するか」の1行を残すだけで、次の自分(や引き継ぐ人)が、同じ迷路を歩かずに済みます。
「バグ調査」チェックリスト
調査に着手するとき、これだけ確認できているかを見る項目です。コピーして、自分のメモに当ててみてください。全部を毎回そろえる必要はありません。
まず外せない最低ラインはこの3つです。急ぎのバグでも、ここだけは押さえます。
- 【最低ライン】報告を「いつ・何をしたら・何が起きたか」まで具体化したか
- 【最低ライン】手元で再現できたか(できないなら、それを前提に動いているか)
- 【最低ライン】直す前に「なぜ起きたか」を1行で言えるか
次の項目は、再現に手こずるとき・原因が広いときに追加で確認します。当てはまらなければ飛ばして大丈夫です。
- 再現しないとき、本番と手元の違い(データ・権限・設定・時刻)を疑ったか
- その時刻のログをたどり、実際に呼ばれた処理を確認したか
- 原因を「データ・処理・時間軸」のどれかで二分して挟み撃ちにしたか
- 一度に一つだけ変えて、再現するかを確かめたか
- いつから壊れたかを、デプロイ・設定変更・データ移行と突き合わせたか
- 修正後、わざと再現条件を作って「再現しなくなること」を確認したか
全部に○が付かなくても大丈夫です。最低ラインの3つ、とくに「再現できたか」さえ押さえられれば、当てずっぽうで直すより、ずっと確かな一歩になります。
よければ、こちらも
バグ調査は、落ち着いて動くための「型」があるほど楽になります。調べる前の心構えと、調べたあとの記録・再発防止をセットにしておくと、次のバグがだいぶ軽くなります。
- 既存システムの改修|影響範囲を見落とさない調査の順番:原因が分かって直すとき、その修正がどこまで影響するかを先に調べておくための1枚です。
- 500エラーが出たら最初に見る5つのログ|場所と確認の順番:バグ調査の②で頼りになる、ログの見る場所と順番をまとめています。
- ポストモーテムの書き方|障害の振り返りを再発防止につなげる:原因が分かったあと、同じバグを二度と踏まないための振り返りの型です。

「再現できないバグ」がこわいのは、原因が見えないからではなく、どこから手をつければいいか分からないからです。でも、まず再現に集中すると決めるだけで、霧はかなり晴れます。 今日は次の報告で、「いつ・何をしたら・何が起きたか」を1行ずつ埋めてみるところからで十分です。その3行が、原因までの最短ルートの入口になります。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。