
「再現しない」バグの調べ方|環境とタイミングを疑う順番
「たしかにエラーが出ました」という報告。でも自分の画面で同じ操作をすると、何度やっても普通に動く——。 保守運用をしていると、この「再現しないバグ」に何度もぶつかりますよね。相手は困っている。でもこちらは症状すら見られない。そのうち「自分の確認が甘いのかも」「本当は自分のミスなのに気づけていないのかも」と、だんだん自分を疑い始めてしまう。あの宙ぶらりんな時間、地味に消耗します。
でも、再現しないバグの正体は、あなたの調べ方が下手だからではありません。「動く自分の環境」と「エラーが出る相手の環境」で、何かの条件が違っているだけです。その条件を1つずつ合わせにいけば、たいていの「再現しない」は「再現する」に変わります。
この記事では、再現しないバグに出会ったとき、やみくもにコードを読む前に、どの条件から疑って合わせにいくかの順番を一緒に整理します。全部を一度に調べるのではなく、当たりやすいところから手をつける話です。
結論:まず「いつ・どの画面で・どんな結果になったか」を具体的にそろえることから始めます(推測で再現しようとしない)。そのうえで、①データ(対象レコード・入力値)→②利用者の条件(権限・ブラウザ・端末)→③タイミング(時間帯・同時操作・順番)→④環境差(本番だけ・特定サーバーだけ)の順に、自分の環境を相手に近づけていきます。再現できた瞬間に、原因はほぼ半分見えています。焦って直そうとせず、「まず自分の手元で1回起こす」ことをゴールにします。
再現のしやすさは、システムの作り(1台構成か複数台か、キャッシュやキューを使うか)で大きく変わります。順番と考え方を出発点に、自分の現場の道具に置き換えて使ってください。
何が起きているか:再現しないのは「条件が隠れている」から
再現しないバグがやっかいなのは、症状が嘘だからではなく、再現に必要な条件が報告に含まれていないからです。報告する人は悪気なく「エラーが出た」としか言えないことが多く、その裏にある「そのとき何が違ったか」は本人も気づいていません。
- 同じ操作に見えて、入力や対象が違う:たまたまその人のデータだけ、想定していない値が入っていた、という定番です。
- 人によって見え方が違う:権限・契約プラン・ブラウザ・スマホかPCかで、通る経路そのものが変わることがあります。
- タイミングでしか起きない:同時アクセスが重なったとき、処理の順番が入れ替わったときだけ壊れる(いわゆる競合状態)ものは、落ち着いた環境では再現しません。
- 見ているだけで消える:詳しく調べようとログを増やしたり、ゆっくり操作したりすると、タイミングが変わって症状が出なくなる——これは俗に「ハイゼンバグ」と呼ばれ、追う人を一番迷わせます。
つまり必要なのは「気合いで何度も操作する」ことではなく、隠れている条件を1つずつ表に出して、自分の環境に持ち込む目です。次から、その順番を見ていきます。
再現の条件を合わせにいく4つの層

大事なのは、当たりやすくて調べやすい条件から先に合わせることです。多くの「再現しない」は、実は①データか②利用者の条件で片づきます。いきなり③タイミングや④環境差といった難しい層から疑うと、時間だけが溶けていきます。
① まず「データ」を疑う(対象レコード・入力値)
最初にやるのは、コードを読むことではなく、エラーが出たときの「実物のデータ」を見にいくことです。ここで原因が割れるケースが、驚くほど多いです。
- どのレコードで起きたかを特定する:注文番号・ユーザーID・伝票番号など、対象を1件に絞ります。「その1件」を自分の手元で開くと、症状が再現することがよくあります。
- 想定外の値が入っていないか見る:空欄、全角、絵文字、桁あふれ、マイナス、極端に長い文字列、想定していない日付。人間は「まさかそんな値」を平気で入れます。
- 本番のデータを(安全な範囲で)検証環境に持ち込む:個人情報の扱いに気をつけつつ、問題のレコードに近いデータを検証側に用意して、同じ操作をなぞります。
ここで特定のデータでだけ再現するなら、犯人はデータ(またはその値を想定していない処理)です。奥の層は触らなくて大丈夫。逆に、どのデータでも再現しないなら、条件はもっと別のところにあります。次の②へ進みます。
ここで一呼吸。「自分では再現できない」時間は、腕を疑う時間ではなく、条件をそろえる時間です。まだ症状を見られていないのは、あなたの落ち度ではありません。
② 利用者の条件を疑う(権限・ブラウザ・端末)
データで再現しないなら、次は「誰が・何で」見ているかです。同じ画面でも、その人の状態によって通る道が違うことがあります。
- 権限・ロール・プランをそろえる:管理者では出ないが一般ユーザーでだけ出る、無料プランでだけ出る、といった差はよくあります。可能なら、その人と同じ権限のテスト用アカウントで操作します。
- ブラウザ・OS・端末を合わせる:特定のブラウザやスマホでだけ崩れる・止まることがあります。「PCでは動くがスマホで報告された」なら、まずスマホ(または開発者ツールのスマホ表示)で試します。
- 回線・拡張機能・言語設定も条件になる:社内からは動くが社外だと止まる、広告ブロッカーやセキュリティソフトが絡む、言語設定で日付の形式が変わる、なども実際にあります。
ここでも、相手の条件に一つ近づけるごとに、同じ操作をなぞって確かめるのがコツです。一度に全部変えると、何が効いたのか分からなくなります。
③ タイミングを疑う(時間帯・同時操作・順番)
データも条件もそろえたのに、それでも再現しない——ここから少し難しい層です。「そのときだけ」重なった何かを疑います。
- 時間帯・負荷を合わせる:バッチが動く深夜、アクセスが集中する昼、月末の締め処理中など、混んでいるときだけ起きるものがあります。報告の「何時ごろか」は重要な手がかりです。
- 同時操作を再現する:同じデータを2人が同時に更新した、送信ボタンを二度押しした、タブを複数開いていた——処理が重なったときだけ壊れる競合は、一人で静かに操作しても出ません。あえて同時に叩いてみます。
- 操作の順番をなぞる:「AをやってからBに戻ってCを押した」のような、報告者の実際の手順を丁寧に再現します。近道せず、遠回りな手順ほど再現の鍵になりがちです。
この層は、ログのタイムスタンプを突き合わせるのが有効です。エラーが出た時刻の前後で、ほかにどんな処理が動いていたかを並べて見ると、「重なり」が見えてきます。
④ 環境差を疑う(本番だけ・特定サーバーだけ)
最後は、環境そのものの違いです。手前を全部そろえても検証環境で再現しないなら、ここを疑います。
- 本番でだけ起きる:データ量、設定値、外部サービスとの連携、SSL、ドメイン、キャッシュの有無など、本番と検証の差が原因のことがあります。まず「本番と検証で何が違うか」を書き出します。
- 特定のサーバーでだけ起きる:複数台構成なら、1台だけ設定や状態がずれていて、その台に振られたときだけ出る、というパターンがあります。ロードバランサの振り分けや、サーバーごとのログを確認します。
- 調べると消える(ハイゼンバグ):詳しく見ようとすると出なくなるときは、無理に手元での再現に固執せず、本番に安全にログを仕込んで“起きた瞬間の状況”を捕まえる方針に切り替えます。
この層に来たら、本番を直接いじる前に、まず観測を増やすのが安全です。再現できないものを勘で直すと、直ったかどうかも確かめられません。まずは「次に起きたときに原因が分かる」状態を作ることを優先します。
具体例:「特定のお客様だけ、注文完了でエラーになる」
よくある報告で、順番に条件を合わせてみます。
- ①データ:エラーが出た注文番号を教えてもらい、その1件を検証環境に近い形で再現。すると……普通に完了してしまう。データ単体では再現せず。
- ②利用者:報告者の会員ランクを確認すると「特別割引対象」。同じランクのテストアカウントで注文すると——エラーが再現。割引後の金額が0円になるケースを処理が想定していなかった。
- ③タイミング:念のため確認すると、同時にクーポンも併用していた。割引とクーポンが重なる順番でだけ0円になると判明。
- ④環境:本番特有の設定ではなく、条件の重なりが原因と確定。検証環境でも安定して再現できるようになった。
犯人は「データ」でも「タイミング」でも単体ではなく、②の利用者条件(特別割引ランク)を入り口に、③の重なり(クーポン併用)で顔を出す組み合わせでした。もし最初からコードを読み込んでいたら、どの分岐を追えばいいか分からず迷子になっていたはずです。手前から条件を合わせて「まず1回再現させた」からこそ、読むべき場所が一気に絞れました。
影響:再現の順番を持つと、何が変わるか
再現の切り分け順を1枚持っておくと、直す力そのものより先に、焦りと自己否定が減ります。
- 「再現できない=自分の力不足」と思い込む前に、「条件がまだそろっていないだけ」と立ち止まれる。
- どの条件で再現するか言えるので、報告者に「では同じ権限で試します」と具体的な次の一手を返せる。
- 再現できた時点で原因の当たりがつくので、コードを闇雲に読む時間が減る。
- 再現できないバグを勘で直して「直ったつもり」になる、いちばん危ない状態を避けられる。
逆に、順番を持たずに毎回「とりあえず操作を繰り返す」だけだと、たまたま出た日と、丸一日出せずに終わる日の差が大きくなります。順番は、宙ぶらりんな時間を短くする道具です。
明日やること:再現できないバグの「条件メモ」を1枚作る
立派な調査書は要りません。明日できる、いちばん小さな一歩はこれです。
- いま抱えている(または次に来た)再現しないバグについて、報告から分かる事実だけを書き出す(誰が・いつ・どの画面で・どんな結果)。
- 上の①データ→②利用者→③タイミング→④環境の順に、「まだ確かめていない条件」に印を付ける。
- いちばん手前の未確認から、一つだけ条件を合わせて同じ操作をなぞる。
- 変えた条件と結果(再現した/しない)を1行ずつ記録する。何を試したか残すと、同じ確認を二度しない。
- 再現できたら、そのときの条件をそのまま「再現手順」としてメモに残す。原因調査も引き継ぎも、ここから一気に楽になります。
きれいにまとめなくて大丈夫です。「どの条件を試して、どうだったか」の1枚があるだけで、次の自分(や相談する相手)が、同じ場所を手探りせずに済みます。
「再現しないバグ」チェックリスト
調査に着手するとき、これだけ確認できているかを見る項目です。コピーして、自分のメモに当ててみてください。全部を毎回そろえる必要はありません。
まず外せない最低ラインはこの3つです。焦っていても、ここだけは押さえます。
- 【最低ライン】推測で操作する前に「誰が・いつ・どの画面で・どうなったか」を具体的にそろえたか
- 【最低ライン】エラーが出た「実物のデータ(対象1件)」を見にいったか
- 【最低ライン】データ→利用者→タイミング→環境の順に、条件を一つずつ合わせたか
次の項目は、手前で再現しないとき・原因が条件の重なりにあるときに追加で確認します。当てはまらなければ飛ばして大丈夫です。
- 想定外の入力値(空欄・全角・絵文字・桁あふれ等)が対象データに入っていないか見たか
- 報告者と同じ権限・プラン・ブラウザ・端末で操作したか
- エラーの発生時刻の前後で、ほかに動いていた処理をログで突き合わせたか
- 同時操作・二度押し・特殊な操作順を、あえて再現してみたか
- 本番と検証の差(データ量・設定・連携・キャッシュ)を書き出したか
- 手元で再現できないときは、勘で直さず「本番で原因を捕まえるログ」を仕込む方針に切り替えたか
全部に○が付かなくても大丈夫です。最低ラインの3つ、とくに「実物のデータを1件見にいく」さえ押さえられれば、自分を疑って消耗するより、ずっと確かな一歩になります。
よければ、こちらも
再現しないバグは、「まず1回起こす」ところまで来れば、あとは原因調査の技が効いてきます。再現後の原因特定と、本番でしか出ない不具合を捕まえる備えをセットにしておくと、次の「再現しない」がだいぶ軽くなります。
- バグ報告から再現・原因特定までの最短ルート|落ち着いて追う手順:再現できたあと、原因までを最短でたどるための考え方をまとめています。
- 「動きがおかしい」を切り分ける最初の質問リスト|報告から事実を引き出す:あいまいな報告から、再現に必要な事実を引き出す聞き方を整理しています。
- 500エラーが出たら最初に見る5つのログ|場所と確認の順番:手元で再現できないとき、本番で起きた瞬間を捕まえるログの見どころをまとめています。

再現しないバグがこわいのは、症状が見えないまま、自分の力を疑い始めてしまうからです。でも、①データ→②利用者→③タイミング→④環境の順に条件を合わせると決めるだけで、霧はかなり晴れます。多くの場合、あなたの調べ方は正しくて、ただ隠れた条件がまだそろっていなかっただけです。 今日は、抱えている再現しないバグの「条件メモ」を1枚書いてみるところからで十分です。その1枚が、次の「再現しない」を、宙ぶらりんな時間ではなく手順に変えてくれます。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。