次の方法で共有


マイ コードのみを使用してユーザー コードのみをデバッグする

マイ コードのみ は、システム、フレームワーク、およびその他の非ユーザー コードの呼び出しを自動的にステップ実行する Visual Studio デバッグ機能です。 呼び出し履歴 ウィンドウで、Just My Code はこれらの呼び出しを [外部コード] フレームに折りたたみます。

.NET プロジェクトと C++ プロジェクトでは、マイ コードのみ動作が異なります。

マイ コードのみを有効または無効にする

ほとんどのプログラミング言語では、Just My Code が既定で有効になっています。

  • Visual Studio で "マイ コードのみ" を有効または無効にするには、[ツール]>[オプション] (または [デバッグ]>[オプション]) >[デバッグ]>[全般][マイ コードのみを有効にする] をオンまたはオフにします。

[オプション] ダイアログ ボックスの [マイ コードのみを有効にする] のスクリーンショット。マイ コードのみを有効にする

[オプション] ダイアログ ボックスの [マイ コードのみを有効にする] のスクリーンショット。マイ コードのみを有効にする

手記

マイ コードのみを有効にする は、すべての言語のすべての Visual Studio プロジェクトに適用されるグローバル設定です。

マイ コードのデバッグのみ

デバッグ セッション中、モジュール ウィンドウには、デバッガーがマイ コード (ユーザー コード) として扱っているコード モジュールとそのシンボルの読み込み状態が表示されます。 詳細については、「デバッガーをアプリにアタッチする方法について理解を深める」を参照してください。

モジュール ウィンドウのユーザー コードのスクリーンショット。[モジュール] ウィンドウでユーザー コードを

モジュール ウィンドウのユーザー コードのスクリーンショット。[モジュール] ウィンドウでユーザー コードを

[呼び出し履歴] または [タスク] ウィンドウで、「Just My Code」により、ユーザー以外のコードが [External Code]ラベルの付いた灰色の注釈付きコードフレームに折りたたまれます。

呼び出し履歴ウィンドウの外部コードのスクリーンショット

コールスタックウィンドウの外部コードのスクリーンショット。

ヒント

モジュール呼び出し履歴タスク、またはその他のほとんどのデバッグ ウィンドウを開くには、デバッグ セッションに参加している必要があります。 デバッグ中に、[デバッグ>Windows] で、開くウィンドウを選択します。

折りたたまれた [外部コード] フレームでコードを表示するには、[呼び出し履歴の] ウィンドウまたは [タスク] ウィンドウを右クリックし、コンテキスト メニューから [外部コードの表示] 選択します。 展開された外部コード行は、[外部コード] フレームに置き換えられます。

[呼び出し履歴] ウィンドウの [外部コードの表示] のスクリーンショット。

[呼び出し履歴] ウィンドウの [外部コードの表示] のスクリーンショット。

手記

外部コードの表示 は、ユーザーが開いているすべての言語のすべてのプロジェクトに適用される現在のユーザー プロファイラー設定です。

呼び出し履歴 ウィンドウで展開された外部コード行をダブルクリックすると、ソース コードの呼び出し元のコード行が緑色で強調表示されます。 DLL またはその他のモジュールが見つからないか読み込まれていない場合は、シンボルまたはソースが見つからないページが開く可能性があります。

Visual Studio 2022 バージョン 17.7 以降では、[呼び出し履歴] ウィンドウで外部コードをダブルクリックすることで、.NET コードを自動コンパイルできます。 詳細については、「のデバッグ中.NET アセンブリからソース コードを生成する」を参照してください。

.NET Just My Code

.NET プロジェクトでは、マイ コードのみでは、シンボル (.pdb) ファイルとプログラムの最適化を使用して、ユーザー コードと非ユーザー コードを分類します。 .NET デバッガーは、最適化されたバイナリと読み込まれていない .pdb ファイルを非ユーザー コードと見なします。

3 つのコンパイラ属性は、.NET デバッガーがユーザー コードと見なす内容にも影響します。

  • DebuggerNonUserCodeAttribute は、適用されるコードがユーザー コードではないことをデバッガーに通知します。
  • DebuggerHiddenAttribute は、[マイ コードのみ] がオフになっている場合でも、デバッガーからコードを非表示にします。
  • DebuggerStepThroughAttribute は、適用先のコードを (ステップ インではなく) ステップ スルーするよう、デバッガーに伝えます。

.NET デバッガーは、他のすべてのコードをユーザー コードと見なします。

.NET デバッグ中:

  • 非ユーザー コードで [デバッグ]>[ステップ イン] を選択すると (または F11 キーを押すと)、コードがユーザー コードの次の行にステップ オーバーされます。
  • 非ユーザー コードのデバッグ>ステップ アウト (または Shift+F11) は、次のユーザー コード行に実行されます。

これ以上ユーザーコードがなければ、デバッグは終了する、別のブレークポイントに到達する、またはエラーが発生するまで続行されます。

デバッガーがユーザー以外のコードで中断した場合 (たとえば、デバッグ >すべての を中断してユーザー以外のコードで一時停止使用した場合)、[ソース なし] ウィンドウ 表示されます。 その後、Debug>Step コマンドを使用して、ユーザー コードの次の行に移動できます。

ユーザー以外のコードでハンドルされない例外が発生した場合、デバッガーは例外が生成されたユーザー コード行で中断します。

例外に対して最初の例外が有効になっている場合、呼び出し元のユーザー コード行はソース コードで緑色で強調表示されます。 呼び出し履歴 ウィンドウには、[外部コード] ラベルが付いた注釈付きフレームが表示されます。

C++ Just My Code

Visual Studio 2017 バージョン 15.8 以降では、コードステップ実行用のマイ コードのみもサポートされています。 この機能では、コンパイラ スイッチ /JMC (マイ コード デバッグのみ) を使用する必要もあります。 C++ プロジェクトでは、スイッチは既定で有効になっています。 コールスタック ウィンドウおよび "Just My Code" のコールスタックサポートについて、/JMC スイッチは必要ありません。

ユーザー コードとして分類するには、ユーザー コードを含むバイナリの PDB をデバッガーで読み込む必要があります (読み込み状態を確認するには、モジュール ウィンドウを使用します)。

[呼び出し履歴] ウィンドウなどの呼び出し履歴の動作については、C++ の "マイ コードのみ" では、これらの関数のみが "非ユーザーコード" と見なされます。

  • シンボルファイルでソース情報が除去された関数。
  • シンボル ファイルがスタック フレームに対応するソース ファイルがないことを示す関数。
  • %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers フォルダー内 *.natjmc ファイルで指定された関数。

コードのステップ実行に関しては、C++ の Just My Code 機能では、次の関数のみが非ユーザーコード として認識されます。

  • 対応する PDB ファイルがデバッガーに読み込まれていない関数。
  • %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers フォルダー内 *.natjmc ファイルで指定された関数。

手記

マイ コードのみでコード ステップ実行をサポートするには、Visual Studio 15.8 Preview 3 以降の MSVC コンパイラを使用して C++ コードをコンパイルする必要があり、/JMC コンパイラ スイッチを有効にする必要があります (既定で有効になっています)。 詳細については、C++ 呼び出し履歴とコードステップ実行動作のカスタマイズ およびこの ブログ記事を参照してください。 古いコンパイラを使用してコンパイルされたコードの場合、コードステップ実行をカスタマイズする唯一の方法は .natstepfilter ファイルを使用することであり、これは「Just My Code」に依存しません。 「C++ のステップ実行動作をカスタマイズ」の項を参照してください。

C++ デバッグ中は、ユーザー以外のコードは既定でスキップされます。 C++ デバッグ中:

  • 非ユーザー コードで [デバッグ]>[ステップ イン] を選択すると (または F11 キーを押すと)、ステップ インが非ユーザー コードから呼び出される場合、コードまたは実行がユーザー コードの次の行にステップ オーバーします。
  • 非ユーザー コードのデバッグ>ステップ アウト (または Shift+F11) は、ユーザー コードの次の行 (現在のスタック フレーム外) に実行されます。

それ以上のユーザー コードがない場合、デバッグはそれが終わるか、別のブレークポイントにヒットするか、エラーがスローされるまで続行されます。

デバッガーが非ユーザー コードで中断した場合 (たとえば、デバッグ>すべての を中断し、ユーザー以外のコードで一時停止すると)、非ユーザー コードでステップ実行が続行されます。

デバッガーが例外にヒットした場合は、ユーザー コードと非ユーザー コードのどちらにあるかにかかわらず、例外で停止します。 [ユーザーが処理しない オプション]は[例外設定 ダイアログ ボックス]で無視されます。

C++ の呼び出し履歴とコードのステップ実行動作をカスタマイズする

C++ プロジェクトの場合は、*.natjmc ファイルで指定することで、呼び出し履歴 ウィンドウで非ユーザー コードとして扱うモジュール、ソース ファイル、および関数 指定できます。 このカスタマイズは、最新のコンパイラを使用している場合のコード ステップ実行にも適用されます (C++ Just My Code 参照)。

  • Visual Studio コンピューターのすべてのユーザーに非ユーザー コードを指定するには、.natjmc ファイルを %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers フォルダーに追加します。
  • 個々のユーザーに非ユーザー コードを指定するには、.natjmc ファイルを %USERPROFILE%\My Documents\<Visual Studio バージョン>\Visualizers フォルダーに追加します。

.natjmc ファイルは、次の構文を持つ XML ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <!-- Modules -->
  <Module Name="ModuleSpec" />
  <Module Name="ModuleSpec" Company="CompanyName" />

  <!-- Files -->
  <File Name="FileSpec"/>

  <!-- Functions -->
  <Function Name="FunctionSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />

</NonUserCode>

Module 要素の属性

属性 説明
Name 必須。 モジュールまたは複数のモジュールの完全なパス。 Windows ワイルドカード文字 ? (0 文字または 1 文字) と * (0 個以上の文字) を使用できます。 例えば

<Module Name="?:\3rdParty\UtilLibs\*" />

は、任意のドライブ上の \3rdParty\UtilLibs 内のすべてのモジュールを外部コードとして扱うようにデバッガーに指示します。
Company 随意。 実行可能ファイルに埋め込まれているモジュールを発行する会社の名前。 この属性を使用して、モジュールのあいまいさを解消できます。

File 要素の属性

属性 説明
Name 必須。 外部コードとして扱うソース ファイルまたはファイルの完全パス。 パスを指定するときに、Windows ワイルドカード文字 ? および * を使用できます。

Function 要素の属性

属性 説明
Name 必須。 外部コードとして扱う関数の完全修飾名。 パスを指定するときに、windows ワイルドカード文字 ? および * を使用できます。
Module 随意。 関数を含むモジュールの名前または完全パス。 この属性を使用すると、同じ名前の関数を明確に区別できます。
ExceptionImplementation true に設定すると、この関数ではなく、例外をスローした関数が呼び出し履歴に表示されます。

マイ コードの設定に依存しない C++ ステップ実行の動作をカスタマイズする

C++ プロジェクトでは、*.natstepfilter ファイルで NoStepInto 関数としてリストアップすることでステップオーバーする関数を指定できます。 *.natstepfilter ファイルにリストされている関数は、マイ コードの設定に依存しません。 NoStepInto 関数は、いくつかの StepInto 関数やその他のユーザー コードを呼び出した場合でも、関数をステップ オーバーするようにデバッガーに指示します。 .natjmcに記載されている関数とは異なり、デバッガーは NoStepInto 関数内のユーザー コードの最初の行にステップ インします。

  • すべてのローカル Visual Studio ユーザーに非ユーザー コードを指定するには、.natstepfilter ファイルを %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers フォルダーに追加します。
  • 個々のユーザーに対して非ユーザー コードを指定するには、.natstepfilter ファイルを %USERPROFILE%\My Documents\<Visual Studio バージョン>\Visualizers フォルダーに追加します。

手記

サードパーティの拡張機能によっては、.natstepfilter 機能が無効になる場合があります。

.natstepfilter ファイルは、次の構文を持つ XML ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>

要素 説明
Function 必須。 1 つ以上の関数を非ユーザー関数として指定します。
Name 必須。 一致する完全な関数名を指定する ECMA-262 形式の正規表現。 例えば:

<Name>MyNS::MyClass::.*</Name>

は、MyNS::MyClass 内のすべてのメソッドが非ユーザー コードと見なされることをデバッガーに通知します。 一致照合では、大文字と小文字が区別されます。
Module 随意。 関数を含むモジュールへの完全なパスを指定する ECMA-262 形式の正規表現。 一致では、大文字と小文字を区別しません。
Action 必須。 大文字と小文字が区別される以下のいずれかの値です。

NoStepInto - 関数をステップ オーバーするようにデバッガーに指示します。
StepInto - デバッガーに関数にステップ インするように指示し、一致した関数の他の NoStepInto をオーバーライドします。

.natstepfilter および .natjmc ファイルに関する追加情報

  • Visual Studio 2022 バージョン 17.6 以降では、.natjmc および .natstepfilter ファイルをソリューションまたはプロジェクトに直接追加できます。

  • .natstepfilter および .natjmc ファイル 構文エラーは、デバッガーの出力ウィンドウでは報告されません。

  • .natvis ファイル とは異なり、.natstepfilter と .natjmc ファイル はホット リロードされません。 代わりに、これらのファイルはデバッグ セッションの開始時近くに再読み込みされます。

  • テンプレート関数の場合、名前に &lt;.*&gt; または &lt;.* を使用すると役立つ場合があります。

JavaScript 自分のコードだけ

Visual Studio 2022 .esproj プロジェクトの場合、Visual Studio Code は launch.json ファイルを使用してデバッガーを構成およびカスタマイズします。 launch.json はデバッガー構成ファイルです。

Visual Studio では、デバッガーはユーザー コードにのみアタッチされます。 .esproj プロジェクトの場合は、Visual Studio のユーザー コード (つまり、マイ コード 設定) を、launch.jsonskipFiles 設定を使用して構成できます。 この設定は、VS Code の launch.json 設定と同じように動作します。 skipFiles の詳細については、「不要なコードのスキップ」を参照してください。