言語を切り替える
テーマを切り替える

Cursor バグ修正完全ガイド:エラー分析から検証までの効率ワークフロー

コンソールがまた真っ赤になる。

TypeError: Cannot read property 'map' of undefined——今夜 3 度目。このエラーを見たら、コピーして Google、Stack Overflow……目を閉じてもできる手順。でも 30 分経っても、5〜6 案試しても、問題はそのまま。

Cursor を使い始めて「AI が Bug を直してくれる!」と思った。実際は違った。エラーをそのまま投げると、的外れな案か、A を直して B を壊す提案ばかり。

試行錯誤の末に固めた Cursor Debug ワークフローで、初めて分かった。ツールが悪いのではなく、使い方が足りなかった。

この記事では、その 4 つの鍵を共有します。どれも失敗から学んだことです。「エラーが出たけど AI の頼り方が分からない」——そんなときの参考になれば幸いです。

ステップ 1:エラー情報の正しい収集と分析

以前、とても愚かなミスをしていました。エラーを見たら 1 行目だけコピーして Cursor に投げていたのです。

Error: Cannot find module 'express' を見て「Cursor、このエラー直して」と頼む。AI は困惑し、的外れな案ばかり。後から分かった——完全なスタックトレースこそが鍵だと。

1 行目だけでなく、スタック全体を見る

エラーメッセージは診察に似ています。症状(1 行目)は表象、病因はその後の検査結果(スタック)にあります。

完全なスタックの例:

TypeError: Cannot read property 'map' of undefined
    at UserList.render (src/components/UserList.jsx:23:18)
    at finishClassComponent (react-dom.development.js:17485:31)
    at updateClassComponent (react-dom.development.js:17435:24)

1 行目は「何が起きたか」、続く行は「どこで起きたか」。問題は React ソースではなく UserList.jsx の 23 行目——この情報が決定的です。

習慣:エラーに遭遇したら、1 行目ではなくスタック全体(通常 5〜10 行)をコピーする。

エラー種別を識別し、混ぜない

種別によって対処が変わります。大まかに 4 類型に分けています:

  1. 構文エラー:括弧の閉じ忘れ、キーワードの typo など。Cursor はすぐ気づく。
  2. ランタイムエラーundefined is not a function など。データかロジックの問題。
  3. 型エラー(TypeScript):型不一致。関連する型定義も一緒に見せる。
  4. 依存/環境エラーModule not found など。package.json や Node バージョンを確認。

Cursor に聞く前に種別を伝えます。「これは TypeScript の型エラーで……」と一言あるだけで、AI の思考方向が定まります。

コンテキストを記録する:何をした直後に出たか

あるとき設定ファイルを 1 つ変えたら、プロジェクト全体が動かなくなりました。エラー情報だけ渡すと、コード修正を提案。半日直してもダメ。

「webpack.config.js の entry を変えた」と補足したら、Cursor はすぐパスの typo と判断。

教訓:直前の操作を必ず伝える。「問題ないはず」でも省略しない。バグはそこに潜むことが多い。

今は次を 1〜2 文で記録しています:

  • 変更したファイル
  • 入れた依存
  • 切り替えた環境(Node バージョンなど)

AI が調査範囲をすぐ絞れます。

ステップ 2:Cursor に正確なコンテキストを渡す

Cursor 初期の頃、「AI は何でも知っている」と思い、適当に聞いていました。

実際には、技術スタック、依存バージョン、設定の中身は AI には見えません。教えなければ推測するしかなく、結果はプロジェクトに合わない案ばかり。

学んだのは、過不足なく、必要な分だけコンテキストを渡すこと。

@ で関連ファイルを引用する

Cursor の @ファイル名 で内容を直接参照できます。

コンポーネントでエラーが出たとき:

@UserList.jsx このコンポーネントでエラーが出ました。エラー情報:
[完全なスタックを貼り付け]

説明だけで推測させるのではなく、コード全体を見せられます。

注意:一度に 7〜8 ファイル @ したことがありますが、AI が要点を掴めなくなりました。2〜3 ファイルが目安。ディレクトリ全体なら @folder/ も使えますが、問題は特定ファイルに集中していることがほとんどです。

関連する設定ファイルを見せる

コードの問題に見えて、実は設定の問題——よくあります。

TypeScript の型エラーは tsconfig.json、依存が見つからないのは package.json のバージョン競合、というパターン。

経験則:次のときは能動的に設定を添付します。

  • 型エラー@tsconfig.json
  • コンパイルエラー@webpack.config.js または @vite.config.js
  • 依存エラー@package.json
  • 環境問題 → Node バージョン、OS を伝える

コードは正しいのにコンパイルが通らない——1 時間格闘した末、package.json を見せたら React と React-DOM のバージョン不一致と即答。早く見せていれば 1 時間節約できた。

必要な型定義を渡す

TypeScript なら特に重要。AI はカスタム型の中身を知りません。

User 型のエラーと言っても、フィールド構成は伝わりません。

対処:型定義も一緒に。

@types/user.ts を引用するか、interface を貼り付け:

interface User {
  id: string;
  name: string;
  email: string;
}

// ここでエラー:Type 'undefined' is not assignable to type 'string'
const user: User = getUserData();

期待するデータ構造が分かれば、より正確な修正案が返ってきます。

上級テクニック:サードパーティの型(node_modules 由来)が絡む場合、その型定義を見るよう指示できます。常用ライブラリなら AI は概ね把握しています。

ステップ 3:Cursor に信頼できる解決策を出させる

エラー収集とコンテキスト提供が終わったら、解決策の段階。

ここで多くの人が「直して」と言い、AI がいきなりコードを書き換えます。なぜそう直したか分からず、次も同じ壁にぶつかる。

今は 先に説明させ、後から修正させる 流れにしています。

構造化して質問する

2 つの聞き方を比べてください。

❌ 非効率

ここでエラー、直して
[エラー情報]

✅ 効率的

ユーザーリスト機能の実装中に型エラーが出ました。

背景:API からユーザーデータを取得してリスト表示
エラー:TypeError: Cannot read property 'map' of undefined
期待:ユーザーリストが正常に表示されること

@UserList.jsx
@api/users.ts

後者は (1) 何をしているか (2) 何が起きたか (3) 期待する結果 (4) 関連コードの所在——思考の枠組みが揃い、案の精度が上がります。

Cursor の機能を使い分ける

Cursor は Chat だけではありません。

1. Cmd/Ctrl + K(インライン編集)
数行の修正向け。エラー行を選択してショートカット、修正指示。型注釈や引数調整の小さな修正に。

2. Chat(チャット)
複数ターンが必要な複雑な問題向け。「考えられる原因は?」から始め、分析に沿って深掘り。

3. Composer(複数ファイル連携)
API 変更に伴うコンポーネント・型・テストの一括修正向け。

道具選びが効率を左右します。以前は何でも Chat にしていましたが、単純な問題を複雑に、複雑な問題を説明しきれない——今は種別で選び分けています。

「どうやるか」の前に「なぜ」を聞く

最重要ポイント。

第 1 ラウンド

このエラーの考えられる原因は?可能性をいくつか挙げて。

AI の分析例:

  • データロード前にレンダリングしている
  • API の戻り値形式が想定と違う
  • コンポーネント状態の初期化ミス

第 2 ラウンド

解決策はいくつある?それぞれの長所・短所は?

第 3 ラウンド

2 番目の案で実装して。

メリット:(1) 根本原因を理解できる (2) 複数案があると分かる (3) 最初の案を盲信せず能動的に選べる。

パフォーマンス問題で AI の第一声が useMemo だったことがあります。他案を聞くとデータ構造の最適化やレンダリングロジック変更も提示。後者を選び、根本解決——useMemo だけでは対症療法でした。

ステップ 4:AI の修正を検証・テストする

AI が直し、コードが変わった——もう終わり?

早い。

大きな失敗をしたことがあります。AI の変更を信用し、よく見ずにコミット。本番で A は直ったが B が壊れ、ロールバックで大変な目に。

それ以来、AI の変更は 1 ステップも省略せず検証しています。

コード変更を丁寧にレビューする

AI が直したら、まず Git で diff:

git diff

行ごとに:

  • 何が変わったか?
  • なぜそう変えたか?
  • 他機能への影響は?

型エラー修正のついでに、関数引数を string から string | undefined に変えられたことがあります。一見問題なさそうでも、十数箇所の呼び出し元で undefined 未処理——diff を見ていなければ時限爆弾でした。

原則:各行の意図を理解する。分からなければ「なぜこう変えた?副作用は?」と即聞く。

console.log で意図を検証する

エラー表示が消えても、本当に直ったのか、隠しただけか——確信が持てないことがあります。

重要ステップに console.log を入れます:

// AI が修正した箇所にログ
console.log('ユーザーデータ:', users);
console.log('データ型:', Array.isArray(users));

return users.map(user => <UserItem key={user.id} {...user} />);

Cursor にログ出力を見せます:

ログを入れました。出力はこうです:
ユーザーデータ:undefined
データ型:false

データがまだ来ていない。修正の方向が間違っていませんか?

AI はログから再分析し、レンダリングではなくデータ取得層が原因と気づくことが多い。

非常に有効。問題は A にあると思いきや B にある——ログが真因を早く示します。

テストを実行する

ユニットテストがあれば、修正後は必ず:

npm test

テストがなくても(以前の自分のプロジェクトもそうでした)、あれば必ず使う。想定外の境界条件を拾ってくれます。

配列処理の Bug を直したとき、見た目は問題なし。テスト実行で空配列時にクラッシュ——AI は正常系だけ考え、空配列を見落としていました。

手動テストも重要

  • 元のエラー再現(解決確認)
  • 正常フロー(既存機能の破壊なし)
  • 境界条件(空値・極端入力)

チェックリスト:

  • 元シナリオは直ったか
  • 正常データは処理できるか
  • 空/異常データは適切に扱えるか
  • 他の呼び出し元は問題ないか

実例:AI 修正の副作用

React コンポーネントの再レンダリング問題。AI は関数を useCallback でラップする案。再レンダリングは止まった。

しかしページ読み込みが遅くなった。調べると、useCallback の依存配列に毎回新規作成されるオブジェクトがあり、useCallback が無効化——オーバーヘッドだけ増えていた。

「この依存、おかしくない?」と聞くと、オブジェクトを useMemo でキャッシュするか基本型を渡す案に切り替わった。

教訓:AI の案は最適とは限らず、新たな問題を生むことも。同僚の PR と同じ厳しさでレビューする。

盲信せず、過疑いもしない

手順が多く感じるかもしれません。本番障害の緊急ロールバックに比べれば、検証時間は安い。

検証を重ねると、AI のよくあるミス(null / undefined 処理の漏れなど)が見え、事前に防げます。

バランス:小修正は軽く、大修正は入念に。影響範囲で検証の深さを決める。

実戦ケース:Bug 修正の一連の流れ

理論はここまで。実際のケースを見ましょう。

先週、Next.js プロジェクトで突然コンパイルエラー。画面真っ白、コンソール真っ赤。

シナリオ

エラーメッセージ:

Error: Element type is invalid: expected a string (for built-in components)
or a class/function (for composite components) but got: undefined.

Check the render method of `BlogPost`.
    at createFiberFromTypeAndProps (react-dom.development.js:25532:21)
    at createFiberFromElement (react-dom.development.js:25560:15)

第一反応:「undefined?インポートしたはずなのに」

Step 1:完全なエラー情報を収集

1 行目だけでなく、スタック全体(約 10 行)をコピー。2 行目以降が重要——BlogPost の render メソッドが原因。

コンテキストも記録:

  • react-markdown を新規インストール
  • BlogPost.tsx の import 文を変更

Step 2:正確なコンテキストを提供

Cursor Chat で:

Next.js プロジェクトでコンポーネント import エラー。

背景:react-markdown (v9.0.1) を入れ、BlogPost で使用しようとした
エラー:[完全なスタック]
期待:Markdown コンテンツが正常にレンダリングされる

@components/BlogPost.tsx
@package.json

Cursor は (1) react-markdown のバージョン (2) BlogPost のコード (3) 依存関係を把握できます。

Step 3:多ターンで解決策を探る

第 1 ラウンド

このエラーの考えられる原因は?

AI の 3 案:

  1. import 文の誤り(named vs default)
  2. react-markdown と React のバージョン不一致
  3. インストール完了前に使用

第 2 ラウンド

依存は入れ終わっています。import の問題でしょうか?
今の書き方:import { ReactMarkdown } from 'react-markdown'

AI の回答:

react-markdown v9 は default export です。named export ではありません。
修正:import ReactMarkdown from 'react-markdown'

Step 4:修正を検証

提案通り import を変更——すぐには信じない。

Git diff:

- import { ReactMarkdown } from 'react-markdown'
+ import ReactMarkdown from 'react-markdown'

変更は最小限。副作用はなさそう。

npm run dev

ページ表示 OK。念のため追加テスト:

  • 通常の Markdown
  • コードブロック付き Markdown
  • 空コンテンツ

すべて問題なし。解決確認。

時間比較

従来方式

  • Google「react-markdown undefined error」→ 10 分
  • Stack Overflow で 3 案試すも失敗 → 20 分
  • 公式ドキュメント → 15 分
  • 合計:45 分

Cursor 支援

  • エラー+コンテキスト収集 → 2 分
  • 多ターンで特定 → 3 分
  • 検証 → 2 分
  • 合計:7 分

6 倍以上の効率。

鍵は、バージョン・コード・エラー情報という十分なコンテキストを渡し、AI が根本原因を直接特定できたこと。自分で一つずつ試すループを回避できました。

まとめ

Cursor Debug ワークフローの 4 点:

  1. エラー収集は完全に——1 行目よりスタック全体
  2. コンテキストは正確に——@ でファイル、設定と型定義も
  3. 解決策は理性的に——先に「なぜ」、能動的に選ぶ
  4. 検証は厳格に——diff、ログ、テスト、省略しない

手順は多く聞こえますが、慣れれば数分。Google + Stack Overflow + 試行錯誤より、効率は段違い。

ただし一点ははっきり:Cursor はツールであって魔法ではない

代わりに考えたり、ロジックを理解したりはしません。賢いアシスタントが、素早く原因候補を出してくれる——最終判断はあなた。

今の感覚は、経験豊富な同僚が隣にいるようなもの。「これどういうこと?」と聞けば、いくつかの可能性を整理してくれる。あとは状況に合わせて選ぶだけ。

一人でドキュメントを漁るより、ずっと楽。

最後のアドバイス:自分用の Debug チェックリストを作る。

エラーが出たら、この順で進めています:

  • 完全なスタックトレースをコピー
  • 直前の操作を記録
  • @ で関連ファイル(2〜3 個)
  • 設定/型が関係すれば添付
  • 先に原因分析、それから案を選ぶ
  • コード変更をレビュー
  • 元シナリオ+境界条件をテスト

この習慣が、Debug 効率を一気に上げます。

試してみてください。頭の痛いエラーも、手早く片付けられるはずです。

Cursor AI 支援 Debug 完全フロー

Cursor でバグを効率的に直す 4 ステップ:エラー収集から検証まで

⏱️ 目安時間: 10 分

  1. 1

    ステップ1: ステップ 1:エラー情報を完全に収集する

    核心原則:1 行目よりスタックトレース全体が重要

    必須操作:
    • 1 行目だけでなく、完全なスタックトレース(5〜10 行)をコピーする
    • エラー種別を識別:構文/ランタイム/型/依存関係
    • 操作コンテキストを記録:直前に変更したファイル、入れた依存、切り替えた環境

    理由:
    スタックには発生箇所(ファイル名+行番号)が含まれます。1 行目は「何が起きたか」、続く行は「どこで起きたか」を示します。操作履歴があれば、AI は調査範囲をすぐ絞れます。

    注意点:
    「問題ないはず」の操作も省略しないでください。多くのバグは、そう思っている変更の中に潜んでいます。
  2. 2

    ステップ2: ステップ 2:正確なコンテキストを渡す

    核心原則:過不足なく、理解に必要な分だけ

    必須操作:
    • @ で関連ファイルを 2〜3 個引用(多すぎない)
    • エラー種別に応じて設定ファイルを添付:
    - 型エラー → @tsconfig.json
    - コンパイルエラー → @webpack.config.js または @vite.config.js
    - 依存エラー → @package.json
    • TypeScript なら関連する interface / type 定義も渡す

    理由:
    AI はあなたの技術スタック、依存バージョン、カスタム型を知りません。正確なコンテキストがあれば、一般論ではなくプロジェクトに合った案が返ってきます。

    注意点:
    引用は 2〜3 ファイルに抑えましょう。多すぎると判断が散漫になります。どれを見せるべきか不明なら、先に AI に聞いてください。
  3. 3

    ステップ3: ステップ 3:信頼できる解決策を引き出す

    核心原則:先に「なぜ」、次に「どうやって」

    必須操作:
    • 第 1 ラウンド:「このエラーの考えられる原因は?」
    • 第 2 ラウンド:「解決策はいくつあり、それぞれの長所・短所は?」
    • 第 3 ラウンド:最適案を選び、AI に実装させる
    • ツールの使い分け:
    - Cmd/Ctrl+K:単一ファイルの小さな修正
    - Chat:複雑な問題の多ターン対話
    - Composer:複数ファイルの連携修正

    理由:
    いきなりコードを直させると、原理を理解できず次も困ります。多ターン対話で根本原因を把握し、最初の案を受動的に受け入れるのではなく、能動的に選べます。

    注意点:
    AI の第一反応が最適解とは限りません。パフォーマンス問題で useMemo を提案しても、データ構造の見直しの方が根本解決になることもあります。
  4. 4

    ステップ4: ステップ 4:厳格に検証・テストする

    核心原則:同僚の PR をレビューするつもりで AI の変更を見る

    必須操作:
    • git diff で行ごとにレビューし、意図を理解する
    • console.log を入れて重要ステップを確認し、修正方針が正しいか検証
    • テストがあれば実行:npm test
    • 手動で 3 シナリオを確認:
    - 元のエラー再現(解決確認)
    - 正常フロー(既存機能の破壊なし)
    - 境界条件(空値・異常入力など)

    理由:
    AI は A を直して B を壊すことがあります。関数の引数型だけ変えて、他の呼び出し元の互換性を見落とす——そんなパターンです。検証を省略すると、本番ロールバックの原因になります。

    注意点:
    小さな修正は軽く、大きな修正は入念に。検証時間は、本番障害の復旧時間よりずっと短いです。

FAQ

なぜ Cursor にはエラーの 1 行目だけ渡してはいけないのですか?
1 行目は「何が起きたか」(例:TypeError)しか示しません。完全なスタックトレースで初めて「どこで起きたか」が分かります。

例:
1 行目:TypeError: Cannot read property 'map' of undefined
スタック:at UserList.render (src/components/UserList.jsx:23:18)

1 行目だけでは型エラーとしか分かりません。スタックがあれば UserList.jsx の 23 行目が原因と特定できます。スタックなしでは AI は推測頼みになり、的外れな案になりがちです。

正しいやり方:5〜10 行の完全なスタックをコピーし、発生源を正確に特定させましょう。
Cursor に見せる設定ファイルは、どう判断すればいいですか?
エラー種別で決めます:

型エラー(TypeScript)→ @tsconfig.json +関連型定義
コンパイルエラー → @webpack.config.js または @vite.config.js
依存エラー(Module not found)→ @package.json
環境問題 → Node バージョン、OS を伝える

素早い判断:
「compilation failed」など設定関連の文言があればコンパイル設定を。モジュールが見つからなければ package.json。型不一致なら tsconfig と型定義です。

一度に 3 ファイルを超えて引用しないでください。判断が散漫になります。
Cursor の Chat、Cmd+K、Composer はどう使い分けますか?
問題の複雑さと関与ファイル数で選びます:

Cmd/Ctrl+K(インライン編集):
• 単一ファイル、数行の修正向け
• 型注釈、引数調整、リネームなど
• 速く、変更結果がすぐ見える

Chat(チャット):
• 原因不明で多ターン分析が必要な複雑な問題向け
• 深く議論し、本質を理解できる

Composer(複数ファイル連携):
• API 変更に伴うコンポーネント・型・テストの一括修正向け
• 複数ファイルの整合性を保てる

使い分けを誤ると、単純な修正を Chat で冗長にしたり、複雑な修正を Cmd+K で堂々巡りにしたりします。
AI の修正が本当に問題を解決したか、どう検証しますか?
3 ステップ検証、どれも省略不可:

1. コード変更のレビュー(git diff):
• 何をなぜ変えたか行ごとに確認
• 他機能への影響を考える
• 不明点は即 AI に質問

2. デバッグログで意図を確認:
• 重要箇所に console.log
• データフローが期待通りか確認
• エラーを隠しただけでないか検証

3. 3 シナリオのテスト:
• 元のエラー再現
• 正常フロー
• 境界条件(空値・異常入力)

実例:AI が型エラーを直す際、引数を string|undefined に変えました。エラーは消えましたが、他の十数箇所で undefined 未処理のまま——git diff で発見し、本番事故を防げました。
Cursor Debug で本当に効率が 6 倍になるのですか?
実際のケースに基づく時間比較です:

従来方式(45 分):
• Google でエラー検索 → 10 分
• Stack Overflow で 3 案試すも失敗 → 20 分
• 公式ドキュメントを読む → 15 分

Cursor 支援(7 分):
• 完全なエラー情報+コンテキスト収集 → 2 分
• 多ターン対話で根本原因特定 → 3 分
• 修正の検証 → 2 分

差の本質:
従来は「試行錯誤ループ」で無駄な試行に時間を使います。Cursor 方式はコンテキストで AI が根本原因を直接特定します。

前提:正しい聞き方を身につけていること。エラーを投げるだけでは、効率は上がらないどころか下がることもあります。

7分で読めます · 公開日: 2026年1月22日 · 更新日: 2026年6月15日

関連記事

コメント

GitHubアカウントでログインしてコメントできます