Visual Studio 中快照集偵錯的常見問題集

以下是使用快照偵錯工具針對即時 Azure 應用程式進行偵錯時,可能出現問題的清單。

建立快照集的效能成本為何?

當快照偵錯工具擷取您應用程式的快照集時,它會分支應用程式的程序,並暫止分支複本。 當您針對快照集進行偵錯時,其實是針對程序的分支複本進行偵錯。 此程序只需要 10 到 20 毫秒,但不會複製應用程式的完整堆積。 而是只會複製頁面資料表,並將頁面設定為寫入時複製。 如果堆積中應用程式的部分物件有所變更,就會複製它們的個別頁面。 這是為何每個快照集都會佔用小部分記憶體 (對大多數應用程序而言,大約為幾百 KB) 的原因。

如果我有相應放大的 Azure App Service (應用程式的多個執行個體) 的話,會發生什麼事?

當您的應用程式有多個執行個體時,快照點會套用至每一個執行個體。 只有使用指定條件叫用的第一個快照點會建立快照集。 如果有多個快照點,之後的快照集會來自建立第一個快照集的同一個執行處理。 傳送至輸出視窗的記錄點只會顯示來自一個執行個體的訊息,傳送至應用程式記錄檔的記錄點則會傳送來自每個執行個體的訊息。

快照偵錯工具如何載入符號?

快照偵錯工具要求在本機有您應用程式的相符符號,或將符號部署至您的 Azure App Service。 (目前不支援內嵌的 PDB。)快照偵錯工具會自動從您的 Azure App Service 下載符號。 從 Visual Studio 2017 15.2 版開始,部署至 Azure App Service 也會部署您應用程式的符號。

快照偵錯工具是否可用於應用程式的發行組建?

是 - 快照偵錯工具可用於發行組建。 在函式中置入快照點時,會將函式重新編譯回偵錯版本,因此可偵錯。 停止快照偵錯工具會讓函式回復成發行組建版本。

記錄點 會對生產環境應用程式造成副作用嗎?

否 - 新增至應用程式的任何記錄訊息都會以虛擬方式進行評估。 它們無法在您的應用程式中造成任何副作用。 不過,某些原生屬性可能無法使用記錄點存取。

如果我的伺服器負載很輕,快照偵錯工具是否可運作?

是。即使伺服器負載很輕,快照偵錯工具依然能夠運作。 在伺服器可用記憶體容量偏低的情況下,快照偵錯工具會進行節流且不會擷取快照集。

如何解除安裝快照偵錯工具?

可透過下列步驟,在 App Service 上解除安裝快照偵錯工具網站延伸模組:

  1. 透過 Visual Studio 中的 Cloud Explorer 或在 Azure 入口網站中關閉您的 App Service。
  2. 瀏覽至您 App Service 的 Kudu 網站 (也就是 yourappservice.scm.azurewebsites.net),並瀏覽至 [網站延伸模組]
  3. 按一下快照偵錯工具網站延伸模組上的 X 即可將它移除。

為什麼會在快照偵錯工具工作階段期間開啟連接埠?

快照偵錯工具必須開啟一組連接埠,才能針對在 Azure 中建立的快照集進行偵錯,這些和進行遠端偵錯時所需的連接埠相同。 您可以在此處找到連接埠清單

如何停用遠端偵錯工具延伸模組?

針對應用程式服務:

  1. 透過 Azure 入口網站停用 App Service 的遠端偵錯工具延伸模組。
  2. Azure 入口網站 > 您的應用程式服務資源刀鋒視窗 > 應用程式設定
  3. 瀏覽至 [偵錯] 區段,然後針對 [遠端偵錯] 按一下 [關閉] 按鈕。

針對 AKS:

  1. 更新 Dockerfile 以移除 Docker 對應至 Docker 映像上 Visual Studio 快照偵錯工具的區段。
  2. 重建並重新部署已修改的 Docker 映像。

針對虛擬機器/虛擬機器擴展集,請移除遠端偵錯工具延伸模組、憑證、KeyVault 和 InBound NAT 集區,如下所示:

  1. 移除遠端偵錯工具延伸模組

    有數種方式可以停用虛擬機器和虛擬機器擴展集的遠端偵錯工具:

    • 透過 Cloud Explorer 停用遠端偵錯工具

      • Cloud Explorer > 您的虛擬機器資源 > 停用偵錯 (對於 Cloud Explorer 上的虛擬機器擴展集,[停用偵錯] 不存在)。
    • 使用 PowerShell 指令碼/Cmdlet 停用遠端偵錯工具

      針對虛擬機器:

      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 入口網站停用遠端偵錯工具

      • Azure 入口網站 > 您的虛擬機器/虛擬機器擴展集資源刀鋒視窗 > 延伸模組
      • 解除安裝 Microsoft.VisualStudio.Azure.RemoteDebug.VSRemoteDebugger 延伸模組

      注意

      虛擬機器擴展集 - 入口網站不允許移除 DebuggerListener 連接埠。 您必須使用 Azure PowerShell。 如需詳細資料,請參閱下文。

  2. 移除憑證和 Azure KeyVault

    安裝虛擬機器或虛擬機器擴展集的遠端偵錯工具延伸模組時,會建立用戶端和伺服器憑證,搭配 Azure 虛擬機器/虛擬機器擴展集資源驗證 Visual Studio 用戶端。

    • 用戶端憑證

      此憑證是位於 Cert:/CurrentUser/My/ 的自我簽署憑證

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

      從您電腦移除此憑證的方式是透過 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 入口網站,並在裝載資源的相同區域中尋找 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 輸入 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. 透過 Azure 入口網站停用 App Service 的快照偵錯工具。

  2. Azure 入口網站 > 您的應用程式服務資源刀鋒視窗 > 應用程式設定

  3. 在 Azure 入口網站中刪除下列應用程式設定,並儲存您的變更。

    • INSTRUMENTATIONENGINE_EXTENSION_VERSION
    • SNAPSHOTDEBUGGER_EXTENSION_VERSION

    警告

    應用程式設定的任何變更都會起始應用程式重新啟動。 如需應用程式設定的詳細資訊,請參閱在 Azure 入口網站中設定 App Service 應用程式

針對 AKS:

  1. 更新 Dockerfile 以移除 Docker 對應至 Docker 映像上 Visual Studio 快照偵錯工具的區段。
  2. 重建並重新部署已修改的 Docker 映像。

針對虛擬機器/虛擬機器擴展集:

有數種方式可以停用快照偵錯工具:

  • Cloud Explorer > 您的虛擬機器/虛擬機器擴展集資源 > 停用診斷

  • Azure 入口網站 > 您的虛擬機器/虛擬機器擴展集資源刀鋒視窗 > 延伸模組 > 解除安裝 Microsoft.Insights.VMDiagnosticsSettings 延伸模組

  • 來自 Az PowerShell 的 PowerShell Cmdlet

    虛擬機器:

        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