Esegui il debug del tuo progetto con Visual Studio Debugger (LLDB) quando utilizzi la classe Estensione per lo sviluppo di giochi Android.
Eseguire il debugger
Prima di poter eseguire il debugger, devi essere in grado di creare, eseguire il deployment e su Android. Per maggiori dettagli, consulta la sezione Eseguire l'esempio.
Dopo aver verificato di poter eseguire il gioco senza il debugger, puoi utilizzare lo del debugger premendo F5 o selezionando l'elemento Avvia debug nel menu Debug. Dovresti visualizzare una finestra di dialogo durante il collegamento del debugger al gioco.
L'avvio del debugger richiede tra 10 secondi e 1 minuto o più a seconda delle dimensioni dell'applicazione e della quantità di simboli necessari da caricare all'avvio. Ci vuole più tempo quando si collega a un nuovo dispositivo la prima volta perché il debugger deve scaricare alcune librerie Android dal dispositivo alla macchina host. Se il primo utilizzo richiede più di 1 minuto tentativi con un nuovo dispositivo, ti consigliamo di annullare la sessione di debug e al riavvio del sistema.
Quando esegui il debugger in questo modo, il gioco viene avviato in In attesa Debugger e non eseguirà alcun codice del tuo gioco fino a quando il debugger si connette. In questo modo puoi anche eseguire il debug della sezione di inizializzazione il tuo gioco.
Per ulteriori informazioni sulle funzionalità di debug di Visual Studio specifiche, consulta leggendo la documentazione di Visual Studio.
Collegamento a un processo
Se vuoi eseguire il debug di un gioco già in esecuzione su un ambiente fisico o virtuale dispositivo, puoi collegare il debugger al processo da Visual Studio.
In Visual Studio, assicurati che sia aperta una soluzione Android e:
- Vai al menu Debug e seleziona Allega al processo....
- Dal menu a discesa Trasporti, seleziona Estensione per lo sviluppo di giochi Android.
- Dal menu a discesa Qualificatore, seleziona il tuo dispositivo Android.
- Seleziona il processo di gioco dall'elenco dei processi disponibili e fai clic su Allega.
Esecuzione di comandi LLDB.Shell
Con una sessione di debug attiva, utilizza la finestra dei comandi di Visual Studio per eseguire LLDB.Shell.
Formato comando:
LLDB.Shell [command]
Esempio:
>LLDB.Shell expr myIntVariable = 9
Status: Success
Output Message:
(int) $2 = 9
Visualizzazione dati
Identificatore di formato
Puoi modificare il formato in cui viene visualizzato un valore nella sezione Auto, Finestre Locals, Watch e DataTip di variabili utilizzando gli indicatori di formato.
Gli indicatori di formato si trovano alla fine delle espressioni. Iniziano con una virgola
seguito da una stringa breve. Ad esempio, l'indicatore ,x
in _myInt,x
l'espressione formatterà myInt come esadecimale minuscolo.
Gli indicatori di formato possono essere utilizzati direttamente nella finestra Guarda o nella Finestre Auto, Locals e DataTip aggiungendole a Natvis. le espressioni regolari. Per ulteriori informazioni, vedi Natvis.
Elenco di indicatori di assistenza
Nome formato | Specificatori | Descrizione |
---|---|---|
boolean | B | mostra questo valore come booleano vero/falso, utilizzando la regola consuetudine secondo cui 0 è falso e tutto il resto è vero |
programma binario | file binario | b | mostralo come una sequenza di bit |
binario, nessun 0b iniziale | bb | mostra una sequenza di bit senza prefisso 0b |
byte | y | mostrano i byte, ma prova a visualizzarli anche come caratteri ASCII ad es. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
byte con ASCII | Y | mostrano i byte, ma prova a visualizzarli anche come caratteri ASCII ad es. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
carattere | c | mostra i byte come caratteri ASCII , ad esempio (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0 |
carattere stampabile | C | mostra i byte come caratteri ASCII stampabili ad es. (int *) c.sp.x = P.._.... |
numero in virgola mobile complesso | F | Interpreta questo valore come la parte reale e immaginaria di un numero in virgola mobile complesso ad es. (int *) c.sp.x = 2,76658e+19 + 4,59163e-41i |
decimale | D, I | mostralo come numero intero firmato (questa operazione non esegue una trasmissione, ma mostra semplicemente i byte come numero intero con segno) |
enumerazione | E,en | mostralo come enumerazione, stampando il nome del valore, se disponibile, oppure il valore intero, ad es. (enum enumType) val_type = eValue2 |
esadecimale - minuscolo | x, h | mostralo in notazione esadecimale minuscola (questa operazione non esegue una trasmissione, ma mostra semplicemente i byte in formato esadecimale) |
esadecimale - maiuscolo | X, H | mostralo in notazione esadecimale maiuscola (questa operazione non esegue una trasmissione, ma mostra semplicemente i byte in formato esadecimale) |
esadecimale - minuscolo, nessun numero 0x iniziale | xb, hb | mostralo in notazione esadecimale minuscola senza prefisso 0x (questo non esegue una trasmissione, ma mostra semplicemente i byte in formato esadecimale) |
esadecimale - maiuscolo, senza 0x iniziale | Xb, Hb | mostralo in notazione esadecimale maiuscola senza prefisso 0x (questo non esegue una trasmissione, ma mostra semplicemente i byte in formato esadecimale) |
in virgola mobile | f | viene visualizzato come numero in virgola mobile (non esegue una trasmissione, ma interpreta semplicemente i byte come un valore in virgola mobile IEEE754) |
ottale | o | mostralo in notazione ottale |
Tipo di sistema operativo | O | mostralo come macOS OSType ad es. (in virgola mobile) x = '\n\x1f\xd7\n' |
stringa - stringa del Do | s | mostra una stringa C con terminazione 0 ad es. "ciao mondo" |
stringa - stringa C, senza virgolette | sb | indica che è una stringa C con terminazione 0 senza virgolette, ad es. ciao mondo |
stringa - UTF-8 | S8 | mostra una stringa UTF-8 con terminazione 0 ad es. u8"ciao mondo ☕" |
stringa - UTF-8, senza virgolette | S8B | mostra una stringa UTF-8 con terminazione 0 senza virgolette ad es. ciao mondo ☕ |
stringa - UTF-16 | su | mostra una stringa UTF-16 con terminazione 0 ad es. u"ciao mondo ☕" |
stringa - UTF-16, senza virgolette | sub | mostra una stringa UTF-16 con terminazione 0 senza virgolette ad es. ciao mondo ☕ |
stringa - UTF-32 | S32 | mostra una stringa UTF-32 con terminazione 0 ad es. Ciao mondo ☕" |
stringa - UTF-32, senza virgolette | S32B | mostra una stringa UTF-32 con terminazione 0 senza virgolette ad es. ciao mondo ☕ |
Unicode16 | U | vengono visualizzati come caratteri UTF-16 ad es. (in virgola mobile) x = 0xd70a 0x411f |
Unicode 32 | U32 | vengono visualizzati come caratteri UTF-32 ad es. (in virgola mobile) x = 0x411fd70a |
decimale senza segno | u | mostralo come numero intero senza segno (questa operazione non esegue una trasmissione, ma mostra semplicemente i byte come numero intero senza segno) |
puntatore | p | mostralo come puntatore nativo (a meno che non si tratti di un puntatore, è probabile che l'indirizzo risultante non sia valido) |
intero complesso | I | Interpreta questo valore come la parte reale e immaginaria di un numero intero complesso ad es. (int *) puntatore = 1048960 + 1i |
array di caratteri | a | indica un array di caratteri, ad es. (carattere) *c.sp.z = {X} |
Raw - Una cruda verità | ! | formato non elaborato, ignorando la personalizzazione delle viste dei tipi di dati |
Natvis
Il framework Natvis consente di personalizzare la modalità di visualizzazione di Visual Studio ai tipi nativi nelle finestre delle variabili del debugger. Ad esempio, usa Natvis per personalizzare la visualizzazione delle finestre Smartwatch, Locals e Dati Suggerimenti.
La funzionalità di Natvis è abilitata per impostazione predefinita, ma può essere disabilitata in Visual Studio impostando Strumenti > Opzioni > Estensione per lo sviluppo di giochi Android > Natvis su Disabled (Disabilitata).
Caricamento dei file Natvis in corso...
Visual Studio carica i file Natvis dalle tre posizioni elencate di seguito. le ricarica a ogni avvio di una sessione di debug. I file devono rispettare le Schema Natvis di Visual Studio 2017.
.natvis
file che fanno parte di un progetto caricato o di un elemento della soluzione di primo livello.- La directory specifica dell'utente
(
%USERPROFILE%\Documents\Visual Studio 2017\Visualizers
) - La directory a livello di sistema
(
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
)
Ricaricamento dei file Natvis
Ricarica i file Natvis durante una sessione di debug valutando .natvisreload
nella
Finestra dei comandi o Finestra di visualizzazione.
File Natvis di esempio
Questo file Natvis di esempio include tutti i tag e gli attributi attualmente supportati.
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="demo::Vector<*>">
<AlternativeType Name="MySimilarVectorType<*>"/>
<!-- Included to show the <SmartPointer> feature is supported. -->
<SmartPointer Optional="true" Usage="Minimal">ptr</SmartPointer>
<!-- Included to show the <DisplayString> feature is supported. -->
<DisplayString Condition="_size == 0" Optional="true">()</DisplayString>
<DisplayString Condition="_size == 1">(x={_items[0]})</DisplayString>
<DisplayString Condition="_size == 2">(x={_items[0]}, y={_items[1]})</DisplayString>
<DisplayString Condition="_size == 3">(x={_items[0]}, y={_items[1]}, z={_items[2]})</DisplayString>
<DisplayString>[Size={_size,x}] (x={_items[0]}, y={_items[1]}, z={_items[2]}, ...)</DisplayString>
<!-- Included to show the <StringView> feature is supported. -->
<StringView Condition="true" Optional="true">_stringViewText</StringView>
<Expand HideRawView="false">
<!-- Included to show the <Item> feature is supported. -->
<Item Name="X" Condition="_size < 4 && _size >= 1" Optional="true">_items[0]</Item>
<Item Name="Y" Condition="_size < 4 && _size >= 2" Optional="true">_items[1]</Item>
<Item Name="Z" Condition="_size < 4 && _size >= 3" Optional="true">_items[2]</Item>
<!-- Included to show the <ArrayItems> feature is supported. -->
<ArrayItems Condition="_size >= 4" Optional="true">
<Size Condition="true" Optional="true">_size</Size>
<ValuePointer Condition="true">_items</ValuePointer>
</ArrayItems>
<!-- Included to show the <IndexListItems> feature is supported. -->
<IndexListItems Condition="true" Optional="true">
<Size Condition="true" Optional="true">_listSize</Size>
<ValueNode Condition="true">_list[%i]</ValueNode>
</IndexListItems>
<!-- Included to show the <LinkedListItems> feature is supported. -->
<LinkedListItems Condition="true" Optional="true">
<Size Optional="true">_listSize</Size>
<HeadPointer>_head</HeadPointer>
<NextPointer>_next</NextPointer>
<ValueNode>_value</ValueNode>
</LinkedListItems>
<!-- Included to show the <ExpandedItem> feature is supported. -->
<ExpandedItem Condition="true" Optional="true">_childVar</ExpandedItem>
<!-- Included to show the <Synthetic> feature is supported. -->
<Synthetic Name="[Size]" Condition="true" Optional="true">
<DisplayString>_size</DisplayString>
<Expand HideRawView="true">
<!-- Any supported <Expand> sub-tags. -->
</Expand>
</Synthetic>
<!-- Included to show the <TreeItems> feature is supported. -->
<TreeItems Condition="true" Optional="true">
<Size>_treeSize</Size>
<HeadPointer>_head</HeadPointer>
<LeftPointer>_left</LeftPointer>
<RightPointer>_right</RightPointer>
<ValueNode>_value</ValueNode>
</TreeItems>
<!-- Included to show format specifiers are supported. -->
<Item Name="[Hex Dump at {_index,x}]">myInt[_index],x</Item>
</Expand>
</Type>
</AutoVisualizer>
Creazione di file Natvis
Visual Studio supporta la creazione di file Natvis personali. Per ulteriori informazioni sulla personalizzazione delle finestre delle variabili di debug, consulta MSDN.
Debug dei file Natvis
In alcuni casi gli errori verranno presentati come Valore di una variabile (ad es. nel
le finestre Auto, Guarda e così via). Ad esempio: <error: use of undeclared
identifier 'missingVar'>
Per accedere a ulteriori dettagli sull'errore, apri GoogleAndroid.log
dalla barra degli strumenti
dell'estensione per lo sviluppo di giochi Android.
Limitazioni note
Se il tag o l'attributo non è elencato nel file di esempio riportato sopra, attualmente supportati. Visual Studio ignora i tag e gli attributi non supportati, puoi lasciarli in un file Natvis esistente e il file funzionerà, purché utilizza il nostro schema.
L'attributo
Usage
, sebbene richiesto dallo schema, non è supportato per<SmartPointer>
. Tuttavia, LLDB non limita l'accesso agli operatori definiti in C++, in modo che qualsiasi operatore richiesto possa essere invece definito in C++.