Domande frequenti per il debug di snapshot in Visual Studio

Ecco un elenco di domande che potrebbero sorgere durante il debug di applicazioni di Azure attive con Snapshot Debugger.

Qual è l'impatto sulle prestazioni della creazione di uno snapshot?

Quando Snapshot Debugger acquisisce uno snapshot dell'app, crea una copia tramite fork del processo dell'app e sospende la copia creata tramite fork. Quando si esegue il debug di uno snapshot, si esegue il debug della la copia creata tramite fork del processo. Questo processo richiede solo 10-20 millisecondi, ma non copia l'heap completo dell'app. Viene invece copiata solo la tabella della pagina e le pagine vengono impostate per la copia su scrittura. Se alcuni degli oggetti dell'app nell'heap cambiano, vengono copiate le pagine corrispondenti. Ecco perché ogni snapshot ha un costo ridotto in memoria (in base all'ordine di centinaia di kilobyte per la maggior parte delle app).

Cosa accade in presenza di un servizio app di Azure con scale-out (più istanze dell'app)?

In presenza di più istanze dell'app, a ogni singola istanza vengono applicati punti di acquisizione snapshot. Solo il primo punto di acquisizione snapshot da raggiungere con le condizioni specificate crea uno snapshot. Se esistono più punti di acquisizione snapshot, gli snapshot successivi provengono dalla stessa istanza che ha creato il primo snapshot. I punti di inserimento istruzione di registrazione inviati alla finestra di output visualizzeranno solo i messaggi da un'istanza, mentre i punti di inserimento istruzione di registrazione inviati ai registri applicazioni inviano messaggi da ogni istanza.

In che modo Snapshot Debugger carica i simboli?

Snapshot Debugger richiede di avere a disposizione i simboli corrispondenti per l'applicazione in locale o distribuiti nel servizio app di Azure. I PDB incorporati non sono attualmente supportati. Snapshot Debugger scarica automaticamente i simboli dal servizio app di Azure. A partire da Visual Studio 2017 versione 15.2, la distribuzione nel servizio app di Azure consente di distribuire anche i simboli dell'app.

Snapshot Debugger funziona sulle build di versione dell'applicazione?

Sì, Snapshot Debugger è progettato per funzionare sulle build di versione. Quando si inserisce un punto di acquisizione snapshot in una funzione, la funzione viene ricompilata come versione di debug, rendendo possibile il debug. Con l'arresto di Snapshot Debugger, per le funzioni viene ripristinata la versione della build di versione.

I punti di inserimento istruzione di registrazione possono avere effetti collaterali nell'applicazione di produzione?

No, eventuali messaggi di log aggiunti all'app vengono valutati in modo virtuale e non determinano effetti collaterali nell'applicazione. Tuttavia, alcune proprietà native potrebbero non essere accessibili con i punti di inserimento istruzione di registrazione.

Se il server è sottoposto a carichi elevati, Snapshot Debugger funziona correttamente?

Sì, il debug di snapshot può funzionare nei server in condizioni di carico elevato. Snapshot Debugger limita il carico di lavoro e non acquisisce snapshot nelle situazioni in cui è presente una quantità scarsa di memoria libera nel server.

Qual è la procedura per disinstallare Snapshot Debugger?

È possibile disinstallare l'estensione del sito Snapshot Debugger nel servizio app seguendo questa procedura:

  1. Disattivare il servizio app tramite Cloud Explorer in Visual Studio o nel portale di Azure.
  2. Passare al sito di Kudu del servizio app (ovvero, servizioapp.scm.azurewebsites.net) e passare a Estensioni del sito.
  3. Fare clic sulla X per l'estensione del sito Snapshot Debugger per rimuoverla.

Per quale motivo vengono aperte delle porte durante una sessione di Snapshot Debugger?

Snapshot Debugger deve aprire un set di porte per eseguire il debug degli snapshot creati in Azure. Si tratta delle stesse porte necessarie per il debug remoto. È possibile trovare l'elenco delle porte qui.

Come si disabilita l'estensione Debugger remoto?

Per Servizi app:

  1. Disabilitare l'estensione Debugger remoto tramite il portale di Azure per il servizio app.
  2. Portale > di Azure il pannello >delle risorse del servizio applicazioni Impostazioni applicazione
  3. Passare alla sezione Debug e fare clic sul pulsante Disattivato per Debug remoto.

Per servizio Azure Kubernetes:

  1. Aggiornare il Dockerfile per rimuovere le sezioni corrispondenti al debugger di snapshot di Visual Studio nelle immagini Docker.
  2. Ricompilare e ridistribuire l'immagine Docker modificata.

Per i set di scalabilità di macchine virtuali o macchine virtuali rimuovere l'estensione Remote Debugger, Certificati, KeyVaults e pool NAT in ingresso come indicato di seguito:

  1. Rimuovere l'estensione Debugger remoto

    Esistono diversi modi per disabilitare il debugger remoto per le macchine virtuali e i set di scalabilità di macchine virtuali:

    • Disabilitare il debugger remoto tramite Cloud Explorer

      • Cloud Explorer > la risorsa > macchina virtuale Disabilita debug (la disabilitazione del debug non esiste per il set di scalabilità di macchine virtuali in Cloud Explorer).
    • Disabilitare il debugger remoto con script/cmdlet di PowerShell

      Per la macchina virtuale:

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

      Per i set di scalabilità di macchine virtuali:

      $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
      
    • Disabilitare il debugger remoto tramite il portale di Azure

      • > Portale di Azure estensioni del pannello > delle risorse della macchina virtuale o dei set di scalabilità di macchine virtuali
      • Disinstallare l'estensione Microsoft.VisualStudio.Azure.RemoteDebug.VSRemoteDebugger

      Nota

      Set di scalabilità di macchine virtuali: il portale non consente la rimozione delle porte DebuggerListener. Sarà necessario usare Azure PowerShell. Per informazioni dettagliate, vedi di seguito.

  2. Rimuovere i certificati e Azure KeyVault

    Quando si installa l'estensione Debugger remoto per macchine virtuali o set di scalabilità di macchine virtuali, vengono creati certificati client e server per autenticare il client di Visual Studio con le risorse dei set di scalabilità di macchine virtuali o macchine virtuali di Azure.

    • Certificato client

      Questo certificato è un certificato autofirmato che si trova in Cert:/CurrentUser/My/

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

      Un modo per rimuovere questo certificato dal computer è tramite PowerShell

      $ResourceName = 'ResourceName' # from above
      Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object {$_.Subject -match $ResourceName} | Remove-Item
      
    • Certificato server

      • L'identificazione personale del certificato server corrispondente viene distribuita come segreto in Azure KeyVault. Visual Studio tenterà di trovare o creare un insieme di credenziali delle chiavi con prefisso MSVSAZ* nell'area corrispondente alla risorsa della macchina virtuale o dei set di scalabilità di macchine virtuali. Tutte le risorse di macchine virtuali o set di scalabilità di macchine virtuali distribuite in tale area condividono quindi lo stesso insieme di credenziali delle chiavi.
      • Per eliminare il segreto di identificazione personale del certificato del server, passare al portale di Azure e trovare l'insieme di credenziali delle chiavi MSVSAZ* nella stessa area che ospita la risorsa. Eliminare il segreto che deve essere etichettato remotedebugcert<<ResourceName>>
      • Sarà anche necessario eliminare il segreto del server dalla risorsa tramite PowerShell.

      Per le macchine virtuali:

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

      Per i set di scalabilità di macchine virtuali:

      $vmss.VirtualMachineProfile.OsProfile.Secrets[0].VaultCertificates.Clear()
      Update-AzVmss -ResourceGroupName $rgName -VMScaleSetName $vmssName -VirtualMachineScaleSet $vmss
      
  3. Rimuovere tutti i pool NAT in ingresso DebuggerListener (solo set di scalabilità di macchine virtuali)

    Il debugger remoto introduce i pool NAT associati a DebuggerListener applicati al servizio di bilanciamento del carico del set di scalabilità.

    $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
    }
    

Come si disabilita Snapshot Debugger?

Per servizio app:

  1. Disabilitare Snapshot Debugger tramite il portale di Azure per il servizio app.

  2. Portale > di Azure il pannello >delle risorse del servizio applicazioni Impostazioni applicazione

  3. Eliminare le impostazioni dell'app seguenti nel portale di Azure e salvare le modifiche.

    • INSTRUMENTATIONENGINE_EXTENSION_VERSION
    • SNAPSHOTDEBUGGER_EXTENSION_VERSION

    Avviso

    Tutte le modifiche apportate a Impostazioni applicazione avvieranno un riavvio dell'app. Per altre informazioni sulle impostazioni dell'applicazione, vedere Configurare un'app del servizio app nel portale di Azure.

Per servizio Azure Kubernetes:

  1. Aggiornare il Dockerfile per rimuovere le sezioni corrispondenti al debugger di snapshot di Visual Studio nelle immagini Docker.
  2. Ricompilare e ridistribuire l'immagine Docker modificata.

Per i set di scalabilità di macchine virtuali/macchine virtuali:

Esistono diversi modi per disabilitare snapshot debugger:

  • Cloud Explorer > la risorsa macchina virtuale/set di scalabilità di > macchine virtuali Disabilita diagnostica

  • Portale > di Azure il pannello > delle risorse macchina virtuale/set di scalabilità di macchine virtuali Disinstalla > l'estensione Microsoft.Insights.VMDiagnosticsSettings

  • Cmdlet di PowerShell da Az PowerShell

    Macchina virtuale:

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

    Set di scalabilità di macchine virtuali:

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