VS Codeに多くの拡張機能を入れていると、「入力が急に遅くなった」「補完が表示されない」「エラー通知が繰り返し出る」といった不調が起きても、原因を特定するのは簡単ではありません。
このようなときは、VS Codeに用意されているExtension Bisectを使います。作業中のファイルを保存してから開始し、拡張機能を半分ずつ無効化した状態で毎回同じ操作を再現します。問題が消えたか、まだ続いているかを回答していけば、原因候補を効率よく絞り込めます。
ただし、Extension Bisectが示した拡張機能を、すぐに原因と断定してはいけません。最後に候補を単独で無効化・再有効化し、症状が消えたり戻ったりすることを確認するのが重要です。
VS Codeの不調をExtension Bisectで切り分ける仕組み
Extension Bisectは、現在有効になっている拡張機能を段階的に無効化し、不具合の原因候補を二分探索で絞り込む機能です。
拡張機能を1件ずつ手動で無効化する方法では、インストール数が多いほど確認回数も増えます。Extension Bisectでは、候補をおおむね半分ずつ減らしていくため、数十件の拡張機能が入っている環境でも、比較的少ない確認回数で原因候補へ到達できます。公式ブログでは、24件の拡張機能を例に、候補を半分ずつ分割する仕組みが説明されています。([Visual Studio Code][1])
現在の公式ドキュメントでも、拡張機能ビューの操作メニューから、問題のある拡張機能を切り分けるExtension Bisectを利用できることが案内されています。2021年公開の公式ブログは仕組みの説明として参照し、現在利用できる機能かどうかは現行ドキュメントと併せて確認するのが適切です。([Visual Studio Code][2])
Extension Bisectが向いている症状
次のように、特定の操作で繰り返し再現できる問題に向いています。
- ファイルを開くとVS Codeが重くなる
- 文字入力や保存に遅延が発生する
- コード補完やフォーマットが正常に動かない
- 特定のファイル形式を開くとエラーが出る
- コマンドを実行すると毎回同じ通知が表示される
- 特定のワークスペースだけ操作が不安定になる
- 拡張機能を更新してから挙動がおかしくなった
一方、数時間に一度しか起きない問題や、発生条件が分からない問題には向いていません。各段階で「正常になったか、まだ異常か」を正しく回答できなければ、誤った候補へ絞り込まれるためです。
Extension Bisectを始める前に準備すること
Extension Bisectを開始すると、拡張機能の有効・無効が切り替わり、VS Codeの再読み込みや拡張機能ホストの再起動が行われることがあります。開始前に、未保存のファイルをすべて保存してください。
可能であれば、Gitで作業中の変更をコミットするか、少なくとも差分を確認できる状態にしておくと安心です。
| 準備する項目 | 具体例 | 目的 |
|---|---|---|
| ファイルを保存する | 編集中のコードや設定ファイルを保存 | 再読み込み時の作業消失を防ぐ |
| 再現操作を決める | ファイルを開いて保存する、補完を表示する | 各段階で同じ判定をする |
| 正常・異常の基準を決める | エラー通知が出るか、操作完了まで極端に待たされるか | 感覚的な回答を避ける |
| 対象環境を固定する | 同じフォルダー、同じファイル、同じVS Codeウィンドウ | 条件の変化による誤判定を防ぐ |
| 実行中の処理を止める | ビルド、テスト、デバッグ、タスクを停止 | 別の処理による遅延を除外する |
「なんとなく軽くなった」ではなく、確認する症状を具体化することが重要です。
たとえば、次のように決めます。
TypeScriptファイルを開き、特定の変数名を入力すると、補完候補が表示されるまで長く待たされる。
この操作を毎回同じファイル、同じ入力内容で繰り返せば、判定の精度を上げられます。
VS CodeでStart Extension Bisectを実行する手順
作業中のファイルをすべて保存する
最初に、開いているファイルを保存します。
WindowsとLinuxでは Ctrl+K、続けて S、macOSでは Command+Option+S など、環境に応じた「すべて保存」の操作を利用できます。メニューから実行する場合は、保存済みであることをタブの表示で確認してください。
デバッグ、ビルド、テスト、ターミナル上の長時間処理も、可能な範囲で終了しておきます。
コマンドパレットからExtension Bisectを開始する
コマンドパレットを開きます。
- Windows/Linux:
Ctrl+Shift+P - macOS:
Shift+Command+P
検索欄に次の文字列を入力します。
Start Extension Bisect
表示された次のコマンドを選択します。
Help: Start Extension Bisect
公式ブログでも、Help: Start Extension Bisectから開始する手順が案内されています。表示名はVS Codeのバージョンや表示言語によって多少異なる場合があります。([Visual Studio Code][1])
コマンドパレットから見つからない場合は、拡張機能ビューを開きます。
- Windows/Linux:
Ctrl+Shift+X - macOS:
Shift+Command+X
拡張機能ビュー上部の「…」に相当する操作メニューを開き、Extension Bisectに関する項目を探します。現行の公式ドキュメントでは、このメニューからExtension Bisectを利用できることが案内されています。([Visual Studio Code][2])
拡張機能が無効になった状態で同じ操作を行う
Extension Bisectを開始すると、VS Codeが拡張機能の一部または全部を無効にした状態へ切り替わります。
その状態で、事前に決めておいた再現操作を実行します。
たとえば、通常時に次の操作でエラーが出ていたとします。
- 対象のプロジェクトを開く
- JavaScriptファイルを保存する
- フォーマットを実行する
- エラー通知が表示される
Extension Bisectの各段階でも、この4つを同じ順序で行います。途中で別のファイルを開いたり、設定を変更したりすると、正しい判定ができなくなります。
改善したか、問題が続いているかを回答する
確認後、VS Codeから結果の回答を求められます。公式ブログでは、次の選択肢で説明されています。([Visual Studio Code][1])
| 確認結果 | 選ぶ回答 | 判断基準 |
|---|---|---|
| 問題が再現しなくなった | Good now | 対象としていた症状が消えた |
| 問題が同じように続いている | This is bad | 対象としていた症状を再現できた |
| 結果が曖昧 | すぐに回答しない | 同じ操作をもう一度行う |
日本語表示では文言が翻訳されている場合があります。英語の文言そのものではなく、意味で判断してください。
「少し軽くなったが、エラーはまだ出る」という場合は、何を原因として調べているかで判定します。エラーを対象にしているなら、エラーが残っている以上は「問題が続いている」と判断します。
候補が特定されるまで同じ確認を繰り返す
回答すると、VS Codeが次の組み合わせへ切り替えます。
再び同じ操作を行い、問題が消えたか、続いているかを回答します。これを繰り返すことで、対象となる拡張機能が半分ずつ絞り込まれます。
公式ブログによると、Extension Bisectは最初にすべての拡張機能を無効にする段階を設けています。これは、問題が拡張機能ではなくVS Code本体などに起因している可能性を切り分けるためです。([Visual Studio Code][1])
正確に原因を絞り込むための判定ルール
Extension Bisectは、利用者の回答を基に候補を絞り込みます。回答を間違えると、正常な拡張機能が原因候補として表示されたり、原因を発見できなかったりします。
公式ブログでも、各段階で正しいフィードバックを返すことが重要だと説明されています。([Visual Studio Code][1])
毎回まったく同じ操作をする
比較する条件を変えないことが最も重要です。
避けるべき例は次のとおりです。
- 1回目は小さなファイル、2回目は大きなファイルで試す
- 途中でVS Codeの設定を変更する
- 別のワークスペースへ移動する
- 1回目は起動直後、2回目は長時間使用後に試す
- ネットワーク接続が必要な処理で、接続状態が異なる
- フォーマットとコード補完など、異なる症状を同時に判定する
一度のExtension Bisectでは、原則として一つの症状だけを対象にします。
「入力遅延」と「エラー通知」の両方がある場合は、まず入力遅延について調査し、完了後にエラー通知について別に実行した方が正確です。
一度改善しただけで原因を確定しない
バックグラウンド処理やキャッシュの状態によって、偶然速くなることがあります。
問題が消えたように見えても、同じ操作をもう一度実行してください。実行時間を厳密に測っていない場合は、「速くなった気がする」だけで回答しないことが重要です。
遅延を調べる場合は、次のような客観的な基準を決めます。
- エラー通知が表示されたか
- 補完候補が操作可能な範囲で表示されたか
- 保存処理が停止したような状態になったか
- 同じ操作を複数回行っても結果が一致したか
再現しなかっただけなのか、改善したのかを区別する
発生頻度が低い問題では、拡張機能を無効にしたから消えたのか、今回は偶然起きなかったのか判断できません。
普段から5回に1回程度しか起きない問題なら、各段階で1回だけ確認しても十分ではありません。同じ操作を複数回試し、判定できない場合はExtension Bisectをいったん終了して、再現条件の特定を優先します。
候補が見つかった後に必ず再確認する
Extension Bisectが特定した拡張機能は、あくまで原因候補です。
次の順序で再確認します。
候補の拡張機能だけを無効にする
拡張機能ビューを開き、候補の拡張機能を選択します。
歯車アイコンなどの管理メニューから、全体または現在のワークスペースで無効化します。VS Codeでは、拡張機能をアンインストールせず、一時的に全体またはワークスペース単位で無効化できます。変更後は、拡張機能ホストの再起動を求められることがあります。([Visual Studio Code][2])
無効化した状態で、問題の再現操作を2~3回行います。
再有効化して問題が戻るか確認する
候補の拡張機能を再び有効化し、同じ操作を行います。
次の両方を確認できれば、原因である可能性は高くなります。
- 無効化すると問題が消える
- 再有効化すると問題が戻る
再有効化しても問題が戻らない場合は、次の可能性があります。
- 一時的なキャッシュや状態が解消された
- 別の拡張機能との組み合わせが原因だった
- 再現条件が安定していなかった
- 拡張機能ホストの再起動自体で問題が解消した
この場合は、候補を原因と断定せず、もう一度Extension Bisectを実行します。
更新、設定変更、ワークスペース単位の無効化を検討する
原因を確認できても、すぐにアンインストールする必要はありません。
次の順序で対処を検討します。
- 拡張機能に更新があるか確認する
- 拡張機能のREADMEや変更履歴を確認する
- 問題に関係しそうな設定を見直す
- 特定プロジェクトだけで問題が起きるなら、そのワークスペースで無効化する
- 必要に応じて利用可能な別バージョンを検証する
- 代替拡張機能へ切り替える
- 使用しない場合はアンインストールする
VS Codeの拡張機能詳細画面では、README、変更履歴、依存関係などを確認できます。また、提供されている場合は「Install Another Version」から別バージョンを選択できます。([Visual Studio Code][2])
別バージョンを試す場合も、公式Marketplace上で提供されているものを利用し、検証後はセキュリティ更新を含む最新版へ戻す必要がないか確認してください。
Extension Bisectで原因が見つからない場合
すべての拡張機能を無効にしても問題が続く
すべての拡張機能が無効な状態でも同じ問題が発生する場合、インストール済み拡張機能以外に原因がある可能性があります。
次の項目を切り分けます。
- VS Codeのユーザー設定
- ワークスペース固有の設定
- 開いているファイルやプロジェクトの規模
- Gitやコンパイラーなど外部ツール
- ターミナルで使用しているシェル
- リモート接続やネットワーク
- セキュリティソフトや端末管理設定
- VS Code本体の不具合
- OSやグラフィック関連の問題
まず別の空フォルダーを開き、同じ問題が起きるか確認します。空フォルダーでは正常なら、プロジェクト内の設定やファイル構成に範囲を絞れます。
問題が毎回再現しない
Extension Bisectは、各段階で問題の有無を正しく回答できることが前提です。
不定期にしか起きない場合は、先に次の情報を記録します。
- 発生直前に行った操作
- 開いていたファイルの種類
- 使用していたワークスペース
- 発生した時刻
- 表示されたエラー全文
- VS Codeを起動してからの経過時間
- リモート接続やデバッグの有無
条件がそろったときだけ発生することが分かれば、その条件をExtension Bisectの再現操作として使えます。
複数の拡張機能を組み合わせたときだけ発生する
拡張機能Aだけ、拡張機能Bだけでは正常でも、両方を有効にした場合に競合することがあります。
この場合、Extension Bisectが一方を候補として示しても、それだけが単独で不具合を起こしているとは限りません。
候補が見つかった後に、次の組み合わせを確認します。
| 拡張機能A | 拡張機能B | 確認すること |
|---|---|---|
| 有効 | 有効 | 問題が起きるか |
| 有効 | 無効 | 問題が起きるか |
| 無効 | 有効 | 問題が起きるか |
| 無効 | 無効 | 問題が起きるか |
両方が有効なときだけ問題が起きるなら、拡張機能間の競合として報告できます。
調査するプロファイルや接続先が違う
VS Codeを複数のプロファイルで使っている場合や、SSH、WSL、Dev Containerなどへ接続している場合は、問題が起きているウィンドウでExtension Bisectを実行します。
ローカル環境では正常でも、リモート側にインストールされた拡張機能だけで問題が起きる場合があります。調査途中で別ウィンドウへ移動せず、再現する環境を固定してください。
Extension Bisectで失敗しやすいポイント
| 失敗例 | 問題点 | 改善方法 |
|---|---|---|
| 保存せずに開始する | 再読み込み時に作業へ影響する可能性がある | すべて保存してから開始する |
| 毎回違う操作を試す | 比較条件がそろわない | 再現手順を事前に書き出す |
一度軽くなっただけでGood nowを選ぶ | 偶然の改善を原因除去と誤認する | 同じ操作を複数回行う |
| 入力遅延とエラーを同時に調べる | 何を基準に回答するか曖昧になる | 症状ごとに分けて調査する |
| 候補が出た時点でアンインストールする | 誤判定や競合を見落とす | 単独無効化と再有効化で確認する |
| 途中で設定やファイルを変更する | 別の要因が混ざる | 調査中は環境を固定する |
| 以前から使っている拡張機能を無条件で除外する | 更新や設定変更による問題を見落とす | 初回は有効な拡張機能全体を対象にする |
公式ブログでは、正常だと確信できる拡張機能を事前に無効化して対象外にする方法も説明されています。ただし、本当に無関係だと判断できる場合に限るべきです。誤って除外すると、原因へ到達できなくなります。([Visual Studio Code][1])
原因となった拡張機能を報告する方法
Extension Bisectで候補が特定されると、拡張機能へ問題を報告できる場合があります。公式ブログでも、特定後に対象拡張機能の問題を報告する選択肢が案内されています。([Visual Studio Code][1])
報告時は、次の情報を整理します。
- 拡張機能名
- 拡張機能ID
- 拡張機能のバージョン
- VS Codeのバージョン
- OSとバージョン
- 問題が起きるワークスペースの種類
- 再現手順
- 期待した結果
- 実際に起きた結果
- 無効化すると改善したか
- 再有効化すると再発したか
- 表示されたエラーメッセージ
- 関係しそうな設定
拡張機能IDは、同じような名称の拡張機能を区別するために重要です。VS Codeの拡張機能詳細画面では、発行元と拡張機能ID、依存関係、変更履歴などを確認できます。([Visual Studio Code][2])
スクリーンショットやログに機密情報を含めない
報告前に、画像やログの内容を確認してください。
特に次の情報は削除またはマスキングします。
- 氏名やメールアドレス
- 組織名や非公開のプロジェクト名
- APIトークン
- アクセストークン
- パスワード
- SSH秘密鍵
- 暗号化の回復キー
- 接続文字列
- Cookieや認証ヘッダー
- 社内サーバーのアドレス
- 個人情報を含むファイルパス
- 非公開リポジトリの内容
エラーの再現に不要なソースコードは添付せず、可能であれば機密情報を含まない最小構成のサンプルで再現します。
VS Codeの不調は「絞り込み」と「再確認」を分けて考える
拡張機能が多いVS Codeで遅延やエラーの原因が分からない場合は、手当たり次第にアンインストールするのではなく、Extension Bisectを使って候補を絞り込みます。
手順の要点は次のとおりです。
- 作業中のファイルを保存する
- 再現操作と判定基準を決める
Help: Start Extension Bisectを開始する- 各段階で同じ操作を行う
- 改善したか、問題が続くかを正確に回答する
- 候補を単独で無効化して再確認する
- 再有効化して問題が戻るか確認する
- 必要に応じて更新、設定変更、無効化、問題報告を行う
最初に行うべきことは、問題が起きる操作を一つに絞り、正常と異常の判定基準を書き出すことです。そのうえでファイルを保存し、Extension Bisectを開始してください。
[1]: https://code.visualstudio.com/blogs/2021/02/16/extension-bisect “Resolving extension issues with bisect”
[2]: https://code.visualstudio.com/docs/configure/extensions/extension-marketplace “Extension Marketplace”

コメント