Part 5: AI × 開発 実践
Chapter 28: AI を使ったデバッグ
エラー分析・原因特定・修正の依頼方法
バグの調査と修正は開発時間の多くを占めます。AI ツールを使うことで、エラーの原因特定から修正案の提示まで、デバッグのサイクルを大幅に短縮できます。この章では AI を最大限活用したデバッグの手法を学びます。
28.1 エラーメッセージの読み方
AI にエラーメッセージを渡すときのポイント
エラーを AI に渡す際は、できるだけ多くのコンテキストを一緒に渡しましょう。
最低限渡すべき情報:
- エラーメッセージとスタックトレース(全文)
- エラーが発生しているコード
- エラーが発生する状況(どんな操作をしたか)
- 期待していた動作
プロンプトテンプレート:
以下のエラーが発生している。原因と修正方法を教えてほしい。
【エラーメッセージ】
TypeError: Cannot read properties of undefined (reading 'id')
at getUserOrders (src/services/orderService.ts:34:28)
at async OrderController.list (src/controllers/orderController.ts:15:22)
【エラーが発生しているコード】
// src/services/orderService.ts
async function getUserOrders(userId: string) {
const user = await userRepository.findById(userId);
return orderRepository.findByUserId(user.id); // line 34
}
【エラーが発生する状況】
GET /api/orders を呼び出したとき。
ログインしているユーザーの ID を渡しているはずだが、たまに発生する。
【期待していた動作】
ユーザーの注文一覧が返ってくる。エラーの種類別アプローチ
| エラーの種類 | AI への渡し方のポイント |
|---|---|
| TypeScript 型エラー | エラーメッセージと該当コード全体 |
| 実行時エラー | スタックトレース全文 + 再現手順 |
| ネットワークエラー | リクエスト/レスポンスのヘッダーと本文 |
| パフォーマンス問題 | プロファイリング結果やスロークエリログ |
| テスト失敗 | テストコード + 実際の出力 + 期待する出力 |
28.2 ログの分析と原因特定
ログを AI に読み込ませる
以下のアプリケーションログを分析して、エラーの原因を特定してほしい。
特に「ERROR」レベルのログに注目し、時系列で何が起きているかを説明してほしい。
[ログをここに貼り付ける]デバッグフロー
ログ分析のプロンプト例
以下の Node.js アプリケーションのログがある。
本番環境で断続的に 500 エラーが発生しているが、原因がわからない。
問題のある箇所を特定して、考えられる原因を3つ挙げてほしい。
それぞれの原因の確認方法も教えてほしい。
--- ログ開始 ---
2024-01-15 10:23:41 INFO Request received: GET /api/products
2024-01-15 10:23:41 DEBUG DB connection pool: 8/10 used
2024-01-15 10:23:42 INFO Request received: GET /api/orders
2024-01-15 10:23:42 ERROR Failed to acquire DB connection: timeout after 5000ms
2024-01-15 10:23:42 ERROR Unhandled promise rejection: ConnectionTimeoutError
... (以下続く)
--- ログ終了 ---28.3 再現手順の整理
「たまに発生するバグ」は最も調査が難しいカテゴリーです。AI と一緒に再現条件を絞り込みましょう。
再現条件の絞り込みプロンプト
以下のバグが断続的に発生している。再現条件を絞り込む手助けをしてほしい。
【バグの概要】
本番環境で1日に数回、決済処理が失敗する。
エラーは「Payment processing failed: INSUFFICIENT_FUNDS」。
ユーザーの口座残高は十分あるはずなのに発生する。
【わかっていること】
- 平日の午前中に多い
- 特定のユーザーだけではなく複数のユーザーで発生
- 再試行すると成功することが多い
【確認済みの項目】
- DB のデータは正常
- 決済 API の残高照会は正しい値を返している
再現条件を絞り込むために、次に何を確認すべきか教えてほしい。再現スクリプトの作成
このバグを再現するためのテストスクリプトを作ってほしい。
条件: 同時に複数のリクエストが来たときに発生しやすいと仮定する。
並列で100件のリクエストを送って、エラーが発生するかテストするスクリプトを Node.js で書いてほしい。28.4 修正案の評価と選択
AI が複数の修正案を提示してくれた場合、どれを選ぶかを AI と一緒に判断しましょう。
修正案の評価プロンプト
以下の3つの修正案を提示してもらった。
それぞれのトレードオフを教えてほしい。
特に以下の観点で評価してほしい:
1. パフォーマンスへの影響
2. コードの複雑さ
3. 将来の保守性
4. バグが再発するリスク
【修正案 A】
[コードを貼り付ける]
【修正案 B】
[コードを貼り付ける]
【修正案 C】
[コードを貼り付ける]リグレッションリスクの確認
この修正を適用した場合、他に影響が出る箇所はないか確認してほしい。
特に以下のファイルと組み合わせた場合の影響を教えてほしい:
[関連ファイルのコードを貼り付ける]28.5 デバッグプロンプトのパターン
実務で使えるデバッグプロンプトのパターン集です。
パターン 1: 型エラーの解消
TypeScript のコンパイルエラーが解消できない。
【エラー】
Type 'string | undefined' is not assignable to type 'string'.
【コード】
[該当コードを貼り付ける]
このエラーを解消するベストな方法を教えてほしい。
型アサーション (as string) 以外の方法を優先してほしい。パターン 2: パフォーマンス問題の調査
以下の関数が遅い。プロファイリングすると常にこの関数がボトルネックになっている。
【コード】
[関数のコードを貼り付ける]
【データ量】
users テーブル: 約10万件
orders テーブル: 約100万件
どこがボトルネックで、どう改善できるか教えてほしい。
SQL クエリの改善案も含めて提示してほしい。パターン 3: 競合状態のデバッグ
以下のコードで競合状態 (race condition) が発生していると思われる。
問題のある箇所と修正方法を教えてほしい。
【コード】
[非同期処理のコードを貼り付ける]
【発生状況】
同時に複数のユーザーが同じリソースを更新しようとするとデータが破損する。パターン 4: メモリリークの調査
Node.js アプリのメモリ使用量が時間と共に増加し続けている。
以下のコードでメモリリークが発生している可能性がある箇所を指摘してほしい。
【コード】
[該当コードを貼り付ける]
【観測事実】
- アプリ起動直後: 150MB
- 1時間後: 300MB
- 6時間後: 800MB (OOM でクラッシュ)パターン 5: 本番のみで発生するバグ
開発環境では再現せず、本番環境のみで発生するバグがある。
【バグの内容】
[エラーメッセージを貼り付ける]
【環境の違い】
- 開発: macOS, Node.js 20, PostgreSQL 15 (Docker)
- 本番: Ubuntu 22.04, Node.js 18, PostgreSQL 14 (RDS)
環境の違いに起因する可能性のある原因を挙げてほしい。デバッグの心構え
AI はデバッグを劇的に効率化しますが、いくつかの注意点があります。
効果的な使い方:
- エラーメッセージと関連コードをセットで渡す
- 「なぜそのエラーが発生するか」を理解してから修正する
- 修正後に必ずテストを実行する
- 根本原因を把握した上で、再発防止策も考える
避けるべき使い方:
- エラーメッセージだけ渡して「直してほしい」と頼む
- AI が提示したコードを理解せずにそのまま適用する
- 「動いたから OK」で終わらせる(根本原因を把握しない)
AI をデバッグパートナーとして活用することで、今まで数時間かかっていた調査が数分で終わるようになります。