Visual Studio でのスナップショットのデバッグについてよく寄せられる質問

スナップショット デバッガーを使用してライブ Azure アプリケーションをデバッグするときに考えられる質問の一覧を以下に示します。

スナップショットの取得にはどのようなパフォーマンス コストがかかりますか?

スナップショット デバッガーがアプリのスナップショットをキャプチャすると、アプリのプロセスはフォークされ、フォークされたコピーは中断されます。 スナップショットをデバッグする場合、デバッグ対象はプロセスのフォークされたコピーです。 このプロセスにかかる時間はわずか 10 から 20 ミリ秒ですが、アプリのヒープ全体はコピーされません。 代わりに、ページ テーブルのみがコピーされ、書き込み時にコピーするページが設定されます。 ヒープ上のアプリのオブジェクトの一部が変更された場合は、それぞれのページがコピーされます。 各スナップショットのメモリ内コストが小さい理由はこのためです (ほとんどのアプリでは数百キロバイト程度)。

スケールアウトされた Azure App Service (アプリの複数のインスタンス) があるとどうなりますか?

アプリのインスタンスが複数ある場合、スナップポイントはすべてのインスタンスに適用されます。 指定した条件で最初にヒットしたスナップポイントでのみ、スナップショットが作成されます。 複数のスナップポイントがある場合、後のスナップショットは最初のスナップショットを作成したものと同じインスタンスから取得されます。 出力ウィンドウに送信されたログポイントには、1 つのインスタンスのメッセージのみが表示されますが、アプリケーション ログに送信されたログポイントではすべてのインスタンスからメッセージが送信されます。

スナップショット デバッガーがシンボルを読み込む方法を教えてください。

スナップショット デバッガーを使用するには、ローカルのアプリケーションまたは Azure App Service にデプロイされているアプリケーションに一致するシンボルが必要です (埋め込みの PDB は現在サポートされていません)。スナップショット デバッガーでは、Azure App Service からシンボルが自動的にダウンロードされます。 Visual Studio 2017 バージョン 15.2 以降、Azure App Service にデプロイすると、アプリのシンボルもデプロイされます。

スナップショット デバッガーはアプリケーションのリリース ビルドに対して動作しますか?

はい。スナップショット デバッガーはリリース ビルドに対して動作するように設計されています。 スナップポイントが関数に配置されると、その関数はデバッグ バージョンに再コンパイルされ、デバッグ可能になります。 スナップショット デバッガーを停止すると、関数はリリース ビルドのバージョンに戻ります。

ログポイントが運用アプリケーションに副作用を及ぼす可能性はありますか?

いいえ。アプリに追加したログ メッセージは仮想的に評価されます。 アプリケーションに副作用を引き起こすことはありません。 ただし、ログポイントでは一部のネイティブ プロパティにアクセスできない場合があります。

サーバーに負荷がかかっていてもスナップショット デバッガーは機能しますか?

はい。スナップショットのデバッグは、サーバーに負荷がかかっていても機能します。 サーバーの空きメモリが少ない状況になると、スナップショット デバッガーが調整され、スナップショットがキャプチャされなくなります。

スナップショット デバッガーをアンインストールする方法を教えてください。

App Service からスナップショット デバッガー サイト拡張機能をアンインストールするには、次の手順を実行します。

  1. Visual Studio の Cloud Explorer または Azure portal のいずれかを使用して App Service を無効にします。
  2. App Service の Kudu サイト (つまり yourappservice.scm.azurewebsites.net) にアクセスし、[サイト拡張機能] に移動します。
  3. スナップショット デバッガー サイト拡張機能の [X] をクリックして削除します。

スナップショット デバッガー セッション中にポートが開かれるのはなぜですか?

Azure で取得されたスナップショットをデバッグするために、スナップショット デバッガーでは一連のポートを開く必要があります。これらは、リモート デバッグに必要なポートと同じです。 ポートの一覧については、こちらを参照してください

リモート デバッガー拡張機能を無効にするにはどうすればよいですか。

App Services の場合:

  1. App Service の Azure portal を使用してリモート デバッガー拡張機能を無効にします。
  2. Azure portal > 自分のアプリケーション サービス リソース ブレード > [アプリケーション設定]
  3. [デバッグ] セクションに移動し、[リモート デバッグ][オフ] ボタンをクリックします。

AKS の場合:

  1. Docker イメージ上の Visual Studio スナップショット デバッガーに対応するセクションを削除するように Dockerfile を更新します。
  2. 変更した Docker イメージをリビルドして再配置します。

仮想マシンまたは仮想マシン スケール セットの場合、リモート デバッガー拡張機能、証明書、KeyVault、および InBound NAT プールを次のように削除します。

  1. リモート デバッガー拡張機能を削除します

    仮想マシンおよび仮想マシン スケール セットのリモート デバッガーを無効にする方法はいくつかあります。

    • Cloud Explorer を使用してリモート デバッガーを無効にします

      • Cloud Explorer > 自分の仮想マシン リソース > [デバッグを無効にする] (Cloud Explorer の仮想マシン スケール セットには、[デバッグを無効にする] は存在しません)。
    • PowerShell スクリプトまたはコマンドレットを使用してリモート デバッガーを無効にします

      仮想マシンの場合:

      Remove-AzVMExtension -ResourceGroupName $rgName -VMName $vmName -Name Microsoft.VisualStudio.Azure.RemoteDebug.VSRemoteDebugger
      

      仮想マシン スケール セットの場合:

      $vmss = Get-AzVmss -ResourceGroupName $rgName -VMScaleSetName $vmssName
      $extension = $vmss.VirtualMachineProfile.ExtensionProfile.Extensions | Where {$_.Name.StartsWith('VsDebuggerService')} | Select -ExpandProperty Name
      Remove-AzVmssExtension -VirtualMachineScaleSet $vmss -Name $extension
      
    • Azure portal を使用してリモート デバッガーを無効にします

      • Azure portal > 自分の仮想マシンまたは仮想マシン スケール セットのリソース ブレード > [拡張機能]
      • Microsoft.VisualStudio.Azure.RemoteDebug.VSRemoteDebugger 拡張機能をアンインストールします

      Note

      仮想マシン スケール セット - ポータルでは、DebuggerListener ポートを削除できません。 Azure PowerShell を使用する必要があります。 詳細については、以下をご覧ください。

  2. 証明書と Azure KeyVault を削除します

    仮想マシンまたは仮想マシン スケール セット用にリモート デバッガー拡張機能をインストールすると、クライアントとサーバーの両方の証明書が作成され、Azure 仮想マシンおよび仮想マシン スケール セットのリソースに対して Visual Studio クライアントが認証されます。

    • クライアント証明書

      この証明書は、Cert:/CurrentUser/My/ にある自己署名証明書です

      Thumbprint                                Subject
      ----------                                -------
      
      1234123412341234123412341234123412341234  CN=ResourceName
      

      この証明書をマシンから削除する方法の 1 つは、PowerShell を使用することです

      $ResourceName = 'ResourceName' # from above
      Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object {$_.Subject -match $ResourceName} | Remove-Item
      
    • サーバー証明書

      • 対応するサーバー証明書の拇印は、Azure KeyVault のシークレットとしてデプロイされています。 Visual Studio では、仮想マシンまたは仮想マシン スケール セット リソースに対応するリージョン内で、MSVSAZ* というプレフィックスが付いた KeyVault の検索または作成が試みられます。 そのため、そのリージョンにデプロイされたすべての仮想マシンまたは仮想マシン スケール セットのリソースでは、同じ KeyVault が共有されます。
      • サーバー証明書の拇印のシークレットを削除するには、Azure portal に移動し、リソースをホストしているリージョンと同じリージョン内で MSVSAZ* KeyVault を見つけます。 おそらく remotedebugcert<<ResourceName>> というラベルが付けられているシークレットを削除します
      • また、PowerShell を使用してリソースからサーバー シークレットを削除する必要があります。

      仮想マシンの場合:

      $vm.OSProfile.Secrets[0].VaultCertificates.Clear()
      Update-AzVM -ResourceGroupName $rgName -VM $vm
      

      仮想マシン スケール セットの場合:

      $vmss.VirtualMachineProfile.OsProfile.Secrets[0].VaultCertificates.Clear()
      Update-AzVmss -ResourceGroupName $rgName -VMScaleSetName $vmssName -VirtualMachineScaleSet $vmss
      
  3. すべての DebuggerListener InBound NAT プールを削除します (仮想マシン スケール セットのみ)

    リモート デバッガーによって、スケール セットのロード バランサーに適用される DebuggerListener in-bound NAT プールが導入されます。

    $inboundNatPools = $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations.IpConfigurations.LoadBalancerInboundNatPools
    $inboundNatPools.RemoveAll({ param($pool) $pool.Id.Contains('inboundNatPools/DebuggerListenerNatPool-') }) | Out-Null
    
    if ($LoadBalancerName)
    {
       $lb = Get-AzLoadBalancer -ResourceGroupName $ResourceGroup -name $LoadBalancerName
       $lb.FrontendIpConfigurations[0].InboundNatPools.RemoveAll({ param($pool) $pool.Id.Contains('inboundNatPools/DebuggerListenerNatPool-') }) | Out-Null
       Set-AzLoadBalancer -LoadBalancer $lb
    }
    

スナップショット デバッガーを無効にするにはどうすればよいですか。

App Service の場合:

  1. App Service の Azure portal でスナップショット デバッガーを無効にします。

  2. Azure portal > 自分のアプリケーション サービス リソース ブレード > [アプリケーション設定]

  3. Azure portal で次のアプリ設定を削除し、変更を保存します。

    • INSTRUMENTATIONENGINE_EXTENSION_VERSION
    • SNAPSHOTDEBUGGER_EXTENSION_VERSION

    警告

    [アプリケーション設定] を変更すると、アプリの再起動が開始されます。 [アプリケーション設定] の詳細については、「Azure portal で App Service アプリを構成する」を参照してください。

AKS の場合:

  1. Docker イメージ上の Visual Studio スナップショット デバッガーに対応するセクションを削除するように Dockerfile を更新します。
  2. 変更した Docker イメージをリビルドして再配置します。

仮想マシンまたは仮想マシン スケール セットの場合:

スナップショット デバッガーを無効にするには、いくつかの方法があります。

  • Cloud Explorer > 自分の仮想マシンまたは仮想マシン スケール セット リソース > [診断を無効にする]

  • Azure portal > 自分の仮想マシンまたは仮想マシン スケール セットのリソース ブレード > [拡張機能] > Microsoft.Insights.VMDiagnosticsSettings 拡張機能のアンインストール

  • Az PowerShell の PowerShell コマンドレット

    仮想マシン:

        Remove-AzVMExtension -ResourceGroupName $rgName -VMName $vmName -Name Microsoft.Insights.VMDiagnosticsSettings
    

    仮想マシン スケール セット:

        $vmss = Get-AzVmss -ResourceGroupName $rgName -VMScaleSetName $vmssName
        Remove-AzVmssExtension -VirtualMachineScaleSet $vmss -Name Microsoft.Insights.VMDiagnosticsSettings