「process exited with code N」の対処 — Claude CodeのIDE・SDK連携エラー
VS CodeやAgent SDKアプリが出す「Claude Code process exited with code N」を、終了コード以外の手がかりで切り分ける手順をまとめます。
「Claude Code process exited with code N」は、Claude Code自身が出すエラーではありません。起動した側のプログラム(VS Code拡張やAgent SDKアプリ)が出します。終了コードの数字だけでは何が失敗したかは分かりません。本当の原因はプロセス自身の出力にあります。起動元がそれを捕捉していれば末尾に付き、していなければ起動元のログにしか残りません。
切り分けの中心は番号の解釈ではなく、同じプロジェクトでターミナルからclaudeを直接起動して本物のエラーメッセージを出させることです。例外が1つあります。Windowsでは終了コード4294967295が無害な場合があり、この場合は何も直す必要がありません。
起動元によって、エラーの見え方が変わる
同じ文言でも、手元に残る情報は起動元で違います。VS Code拡張とAgent SDKでは、見るべき場所が別です。
起動元ごとの見どころ
VS Code拡張
エラーと並んで「View output logs」のリンクが出ます。本物の失敗メッセージはそこにあります。
claudeCode.claudeProcessWrapperはclaudeプロセスの起動に使う実行ファイルを指定する設定で、設定している場合はラッパー経由で起動されます。TypeScript SDK
query()のメッセージをfor awaitで回すループが、通常のErrorで失敗します。メッセージはClaude Code process exited with code 1. stderr: <CLIのstderr末尾>の形で、stderrがあれば末尾に付きます。専用のエラークラスは無く、try/catchで受けます。Python SDK
文言は
Command failed with exit code 1 (exit code: 1)で、ProcessErrorとして上がり、終了コードは例外のexit_code属性に入ります。Error outputの行は固定文なので、実際のstderrはClaudeAgentOptionsのstderrコールバックで拾います。
Agent SDKでは、CLIが先にエラー結果を報告してから終了した場合に、メッセージが別の形へ置き換わります。Claude Code returned an error result: <CLI自身のエラー報告>です。
コロン以降がCLI自身の報告なので、終了コードより先にそこを読みます。PythonではProcessErrorのサブクラスであるResultErrorとして上がり、data属性に完全なエラー結果が入ります。ResultErrorはProcessErrorのサブクラスなので、except ProcessErrorは両方を捕まえます。区別して扱うならexcept ResultErrorを先に書きます。claude-agent-sdk 0.2.140より前は、エラー結果での終了がResultErrorではなく素のExceptionとして上がっていました。TypeScriptは同じ形のメッセージを持つErrorで失敗します。
ターミナルでclaudeを直接使っているだけなら、このメッセージは見ません。IDE拡張やSDKという中継役が挟まって、はじめて起動元の文言に置き換わります。
切り分けの順番
エラーの正体にたどり着く4手順
- 1
起動元のログを見る
見る場所は上のカードのとおりです。SDKアプリでは、メッセージを回すループの周りで例外を捕まえておくと、失敗の文面をログに残せます。
- 2
同じプロジェクトで`claude`を直接起動する
失敗はたいていターミナルでも再現し、今度は本物のエラーメッセージがそのまま表示されます。メッセージが出たら、公式のエラー一覧でその文言を引きます。
- 3
`claude doctor`で土台を確認する
起動できない状態でも、シェルから実行できます。インストール・設定ファイル・Remote Controlの利用可否が出ます。
- 4
`--debug-file`でログを手元に残す
再現はするが手がかりが薄いときに使います。起動時の動きがファイルに残ります。
cd /path/to/your/project
claudeWindowsで出る終了コード4294967295は、無害なことがある
Windowsのネイティブ版は、ターンが終わった直後に終了コード4294967295で終了することがあります。メッセージの待ちがなく、バックグラウンドタスクも動いていないターン境界でこの終了が起きた場合、VS Code拡張はエラーを出しません。セッションを静かに閉じるだけで、次にメッセージを送れば会話は再開されます。
v2.1.273より前のバージョンでは、このターン境界の終了でもエラーを出していました。失われたものは何もありません。古いバージョンの拡張で、応答が終わった直後に毎回このエラーを見るなら、まずバージョンを確認する価値があります。
claude doctorは何を出すか
claude doctorはセッションを開始せずに診断を出力します。--helpの説明では、現在のディレクトリの設定ファイルを信頼確認なしで読み、修復まで行いたいときはセッション内の/doctorを使う、とされています。つまりclaude doctorは診断だけで、修復はしません。
v2.1.287で、空のHOMEと空の設定ディレクトリを指定して実行すると、先頭は次のようになりました(パスは一部省略)。
Claude Code doctor
Running: native (2.1.287)
Platform: darwin-arm64
Path: ~/.local/share/claude/versions/2.1.287
Config install method: not set
Search: OK (bundled)
Auto-updates: enabled
Auto-update channel: latest
Remote Control
Remote Control requires a claude.ai subscription.
- Not signed in to claude.aiどの実行ファイルが動いているか、インストール方法、検索(ripgrep)の状態、自動更新の有無が1画面で分かります。IDEから起動したclaudeと、自分のシェルで動くclaudeが別物ではないか(別のバージョン、別のパス)を疑うときの材料になります。ログインしていない環境でも実行でき、未ログインの場合はRemote Controlの欄にNot signed in to claude.aiと出ます。
--debug-fileで出力を手元に残す
ターミナルで再現しても手がかりが薄いなら、--debug-file <path>で出力先のファイルを指定します。--helpでは「ファイルパスを指定してデバッグログを書く。デバッグモードも暗黙に有効になる」と説明されています。--debugは[filter]を取れるので、"api,hooks"のようにカテゴリで絞ることもできます。絞り込みが効くのは=で値をつなぐ書き方だけです。claude --debug='mcp,startup'と書きます。空白で区切ると、絞り込みなしのデバッグモードになります。
claude --debug-file /tmp/claude-debug.log環境変数CLAUDE_CODE_DEBUG_LOGS_DIRでログの置き場所を決めている環境でも、--debug-fileの指定が優先されます。Claude Codeのセッション内からは/debugでも実行時の問題を診断できます。
同じ「起動元のエラー」でも原因の層が違う
起動元のプログラムが出すエラーは、公式のエラー一覧で「Wrapper and IDE errors」にまとまっています。process exitedと取り違えやすいものは、次の2つです。
| エラー | 状況 | 次の一手 |
|---|---|---|
| Could not locate the Claude CLI on PATH | 状況WindowsのVS Code統合ターミナルがPowerShellで、拡張がclaudeを見つけられない | 次の一手where.exe claudeでPATHを確認する |
| The connection to Claude Code ended before this message completed | 状況拡張がメッセージを送ったが、claudeプロセスが確認や完了の前に接続を閉じた | 次の一手同じメッセージをもう一度送る。繰り返すならターミナルで再現させる |
前者は、起動はしたが失敗した、という話ではありません。PowerShellでPATH上の名前からclaudeを起動すると、開いているフォルダのclaudeが実行されかねないため、拡張が起動を拒否する仕組みです。対処は3つあります。
- VS Codeの外で新しいPowerShellを開き、
where.exe claudeを実行する。パスが出なければインストールディレクトリをPATHに追加する。パスが出るなら、PowerShellプロファイル由来か、VS Codeがまだ拾っていないPATH変更が原因 - PATHはプロファイルではなく、ユーザーまたはシステムの環境変数に設定する。拡張はプロファイルを実行しないため、プロファイルだけに書いた変更は届かない
- PATHを変えたらVS Codeを再起動する。拡張は起動時に捕まえたPATHしか見ない
後者は、拡張が「処理されたか分からない」ため再送を求めるメッセージです。process exitedのように終了コードは付かず、次のメッセージで新しいclaudeプロセスが会話を再開します。
終了コードが付かない起動失敗は、別のメッセージで出る
claudeの実行ファイルが見つかったのに起動できない場合、SDKは「終了コード付きの終了」とは別のメッセージを出します。検索語が変わるので、文面を見てどちらの話かを先に分けます。
- Python SDKは
CLIConnectionErrorで、本文はFailed to start Claude Code:に続けてOS自身のエラーです - TypeScript SDKは、実行ファイルのパスを添えた
exists but failed to launchか、それ以外のFailed to spawn Claude Code processです。どちらも専用のエラークラスは持たないErrorです
多くの場合、指定したパスがテキストファイルやディレクトリ、実行権限のないファイルを指しています。cli_path(Python)やpathToClaudeCodeExecutable(TypeScript)を指定していないなら、設定を外してSDKに探させるのが近道です。
WindowsのPython SDKには固有の落とし穴もあります。cli_pathが.batや.cmdのとき、npmが作るclaude.cmdも含めて、Refusing to execute batch scriptで接続を拒否します。cmd.exe経由だと引数に紛れた命令を実行されかねず、確実なエスケープ手段が無いためです。ネイティブのclaude.exeを指すか、cli_pathを外します。
VS Code拡張が使うclaudeは、拡張に同梱された専用のコピーです。拡張を入れても、シェルのPATHにclaudeは入りません。ターミナルでclaudeと打って切り分けるなら、スタンドアロン版のインストールが別途要ります。
拡張のビルドにお使いのプラットフォーム向けのバイナリが同梱されていないと、有効化の時点でUnsupported platformが出ます。その場合は、別途入れたclaudeをclaudeCode.claudeProcessWrapperで指します。バイナリが同梱されているビルドでは、そのパスが引数として渡されます。
SDKアプリを自作しているときのログの置き方
SDKはclaudeを子プロセスとして起動します。呼び出し側がその標準エラー出力を捨てていると、手元に残るのは終了コードだけです。stderrをアプリ自身のログに書いておくと、次に同じエラーが出たときアプリのログだけで原因を追えます。
シグナルで止められた場合は、Claude Code process terminated by signal <name>という同じ形のメッセージになります。終了コードの代わりにシグナル名が入るので、process exited with codeとは別の検索語で調べることになります。
Pythonでstderrを拾う最小の形は、次のとおりです。コールバックは文字列を1つ受け取る関数で、ClaudeAgentOptionsのstderrに渡します。TypeScriptも、オプションのstderrに(data: string) => voidを渡す同じ形です。
import logging
from claude_agent_sdk import ClaudeAgentOptions
options = ClaudeAgentOptions(
stderr=lambda line: logging.error("claude stderr: %s", line),
)SDKのバージョンによっては、起動に失敗した理由が結果メッセージとして返ることもあります。TypeScript SDKはv0.3.274以降で、既知の起動失敗の際に、stderrと同じ文面をerrors配列に入れたerror_during_executionの結果を書いてから終了します。環境変数CLAUDE_CODE_STARTUP_FAILURE_RESULTSを1にすると、すべての起動失敗理由でこの結果が返ります。
よくあるつまずき
- VS Codeやサービス管理のプロセスのようなGUI・常駐プロセス経由の起動は、ログインシェルのプロファイルで設定した
PATHを引き継がないことがあります。ターミナルでは動くのにIDE経由だけ失敗するなら、この環境差を疑います。Agent SDKの公式トラブルシューティングも、IDEやサービスマネージャーから起動したプロセスはPATHが異なることが多いと説明しています。SDKアプリからclaudeが見つからないときは、アプリが動くのと同じ環境でclaude --versionが通るかを確認します - どうしても原因が分からなければ、セッション内から
/feedbackで報告するか、GitHubリポジトリで既知のissueを探します。issueには、完全なエラー文とバージョン(SDKならSDKのバージョン)を添えます
まとめ
起動元のログに本物のエラー文が残っていれば、そこから公式のエラー一覧を引けます。文が残っていなければ、ターミナルでの直接起動と--debug-fileに進みます。