Debug di app Xamarin.iOS

È possibile eseguire il debug delle applicazioni Xamarin.iOS con il debugger predefinito in Visual Studio per Mac o in Visual Studio.

Usare il supporto di debug nativo di Visual Studio per Mac per eseguire il debug del codice C# e di altri linguaggi gestiti e usare LLDB quando è necessario eseguire il debug di codice C, C++ o Objective C che potrebbe venire collegato al progetto Xamarin.iOS.

Nota

Quando si compilano applicazioni in modalità di debug, Xamarin.iOS genererà applicazioni più lente e di dimensioni di gran lunga superiori perché ogni riga di codice deve essere instrumentata. Prima del rilascio, assicurarsi di creare una compilazione di rilascio.

Il debugger Xamarin.iOS è integrato nell'IDE e consente agli sviluppatori di eseguire il debug delle applicazioni Xamarin.iOS compilate con uno dei linguaggi gestiti supportati da Xamarin.iOS nel simulatore e sul dispositivo.

Il debugger Xamarin.iOS usa il debugger Mono Soft, quindi il codice generato e il runtime di Mono cooperano con l'IDE per offrire un'esperienza di debug. È diverso dai debugger hard, come LLDB o MDB, che controllano un programma senza le informazioni o la cooperazione del programma di cui viene eseguito il debug.

Impostazione di punti di interruzione

Quando si è pronti per avviare il debug dell'applicazione, il primo passaggio da eseguire è l'impostazione di punti di interruzione per l'applicazione. A questo scopo, fare clic nell'area del margine dell'editor, accanto al numero di riga del codice in corrispondenza del quale si vuole impostare il punto di interruzione:

È possibile visualizzare tutti i punti di interruzione impostati nel codice passando al riquadro Punti di interruzione:

The Breakpoints pad

Se il riquadro Punti di interruzione non viene visualizzato automaticamente, è possibile renderlo visibile selezionando Visualizza > punti di interruzione di Windows > debug

Prima di iniziare il debug di un'applicazione, assicurarsi sempre che la configurazione sia impostata su Debug, perché contiene un utile set di strumenti per supportare il debug, ad esempio i punti di interruzione, l'uso dei visualizzatori di dati e la visualizzazione dello stack di chiamate:

Avvia debug

Per avviare il debug, selezionare il dispositivo di destinazione o un altro strumento simile nell'IDE:

Distribuire quindi l'applicazione premendo il pulsante Esegui.

Quando si raggiunge un punto di interruzione, il codice viene evidenziato in giallo:

The code will be highlighted yellow

A questo punto, è possibile usare strumenti di debug, ad esempio per esaminare i valori degli oggetti, per ottenere altre informazioni su quello che accade nel codice:

Displaying a color value

Punti di interruzione condizionali

È anche possibile impostare regole che determinano i casi in cui deve essere presente un punto di interruzione, ovvero aggiungendo un punto di interruzione condizionale.

Per impostare un punto di interruzione condizionale, accedere alla finestra Proprietà punto di interruzione in uno dei due modi seguenti:

  • Per aggiungere un nuovo punto di interruzione condizionale, fare clic con il pulsante destro del mouse sul margine dell'editor, a sinistra del numero di riga per il codice in cui si vuole impostare il punto di interruzione, e quindi scegliere Nuovo punto di interruzione:

    Select New Breakpoint

  • Per aggiungere una condizione a un punto di interruzione, fare clic con il pulsante destro del mouse sul punto di interruzione e scegliere Proprietà punto di interruzione o selezionare il pulsante Proprietà, mostrato di seguito, nel riquadro Punti di interruzione:

    The Breakpoints Pad

È quindi possibile immettere la condizione in base alla quale deve essere aggiunto il punto di interruzione:

Enter the condition for the breakpoint to occur

Quando viene raggiunto un punto di interruzione, lo strumento di debug permette di ottenere il controllo sull'esecuzione del programma. L'IDE visualizza quattro pulsanti, per eseguire e scorrere il codice.

I pulsanti avranno l'aspetto seguente in Visual Studio per Mac:

The Debug tools enable the developer to get control over the program’s execution

Si tratta di:

  • Esegui/Arresta: avvia/arresta l'esecuzione del codice, fino al punto di interruzione successivo.
  • Esegui istruzione/routine: esegue la riga di codice successiva. Se la riga successiva è una chiamata di funzione, il pulsante esegue la funzione e si ferma alla riga di codice successiva, dopo la funzione.
  • Esegui istruzione: anche questo pulsante esegue la riga di codice successiva. Se la riga successiva è una chiamata di funzione, il pulsante si ferma alla prima riga della funzione, permettendo di continuare a eseguire il debug della funzione riga per riga. Se la riga successiva non è una funzione, il pulsante si comporta come il pulsante Esegui istruzione/routine.
  • Esci da istruzione/routine: torna alla riga in cui è stata chiamata la funzione corrente.

Punti di interruzione

È importante sottolineare che iOS concede alle applicazioni solo pochi secondi (10) per avviare e completare il metodo FinishedLaunching nel delegato dell'applicazione. Se l'applicazione non completa questo metodo in 10 secondi, iOS termina il processo.

È quindi quasi impossibile impostare i punti di interruzione nel codice di avvio del programma. Per eseguire il debug del codice di avvio, è consigliabile rimandare parte dell'inizializzazione e inserirla in un metodo richiamato dal timer o in qualche altro metodo di callback eseguito al termine di FinishedLaunching.

Diagnostica del dispositivo

Se si verifica un errore di configurazione del debugger, è possibile abilitare la diagnostica dettagliata aggiungendo "-v -v -v" agli altri argomenti di mtouch nelle opzioni del progetto. In questo modo le informazioni dettagliate sull'errore verranno visualizzate nella console del dispositivo.

Debug wireless

L'impostazione predefinita in Xamarin.iOS prevede il debug dell'applicazione sui dispositivi tramite la connessione USB. A volte potrebbe essere necessario testare il collegamento/scollegamento del cavo del dispositivo USB per lo sviluppo di applicazioni basate su accessori esterni. In questi casi, è possibile usare il debug tramite la rete wireless.

Per altre informazioni sulla distribuzione e sul debug wireless, vedere la guida Distribuzione wireless.

Dettagli tecnici

Xamarin.iOS usa il nuovo debugger Mono Soft. Diversamente dal debugger Mono standard, che è un programma che controlla un processo separato usando le interfacce del sistema operativo, il debugger soft fa in modo che il runtime di Mono esponga la funzionalità di debug tramite un protocollo di collegamento.

All'avvio, un'applicazione di cui deve essere eseguito il debug contatta il debugger, che inizia a operare. In Xamarin.iOS per Visual Studio, Xamarin Mac Agent funge da intermediario tra l'applicazione (in Visual Studio) e il debugger.

Questo debugger soft richiede uno schema di debug cooperativo quando è in esecuzione sul dispositivo. Il file binario viene quindi compilato quando il debug è di dimensioni maggiori perché il codice è instrumentato per poter contenere codice aggiuntivo in ogni punto della sequenza per supportare il debug.

Accesso alla console

I log di arresto anomalo del sistema e l'output della classe Console verranno inviati alla console dell'iPhone. È possibile accedere a questa console con Xcode usando l'"Organizer" e selezionando il dispositivo dall'organizer.

In alternativa, se non si vuole avviare Xcode, è possibile usare iPhone Configuration Utility di Apple per accedere direttamente alla console. Questa presenta l'ulteriore vantaggio di poter accedere ai log della console da un computer Windows se si deve eseguire il debug di un problema sul campo.

Per gli utenti di Visual Studio, sono disponibili alcuni log nella finestra Output, ma è consigliabile passare al Mac per log più completi e dettagliati.


Debug di librerie di classi di Mono

Xamarin.iOS viene fornito con il codice sorgente per le librerie di classi di Mono, che può essere usato per eseguire istruzioni passo a passo dal debugger e visualizzare il funzionamento sottostante.

Poiché questa funzionalità usa più memoria durante il debug, è disattivata per impostazione predefinita.

Per abilitare questa funzionalità, assicurarsi che solo il codice del progetto di debug; non eseguire l'istruzione nell'opzione del codice framework sia deselezionata nel menu Visual Studio per Mac > Preferences > Debugger, come illustrato di seguito:

Debugging Mono's Class Libraries

Dopo avere eseguito questa operazione, è possibile avviare l'applicazione ed eseguire le istruzioni una alla volta di una delle librerie di classi principali di Mono.