Beheben Sie Fehler in Ihrem Projekt mit dem Visual Studio Debugger (LLDB), wenn Sie den Erweiterung für Android-Spieleentwicklung
Debugger ausführen
Bevor Sie den Debugger ausführen können, müssen Sie in der Lage sein, Ihren für Android. Weitere Informationen finden Sie im Abschnitt Beispiel ausführen.
Sobald Sie sich vergewissert haben, dass Sie Ihr Spiel ohne Debugger ausführen können, verwenden Sie den indem Sie F5 drücken oder Debugging starten auswählen. im Menü Fehlerbehebung aus. Während des Debuggers sollte ein Dialogfeld angezeigt werden. für das Spiel.
Das Starten des Debuggers dauert zwischen 10 Sekunden und 1 Minute oder länger abhängig von der Größe Ihrer Anwendung und der Anzahl der Symbole, die Sie benötigen, die beim Start geladen werden sollen. Das Anbringen an ein neues Gerät dauert länger wenn der Debugger zum ersten Mal mit dem Hostcomputer zu verbinden. Wenn es beim ersten Mal länger als 1 Minute dauert, Versuchen Sie es nur mit einem neuen Gerät. Abbrechen der Debug-Sitzung und einen Neustart durchführen.
Wenn Sie den Debugger auf diese Weise ausführen, wird das Spiel in Warten auf Debugger verwenden, wird der Code Ihres Spiels erst dann Der Debugger stellt eine Verbindung her. So können Sie auch Fehler im für Ihr Spiel.
Weitere Informationen zu bestimmten Visual Studio-Debugger-Funktionen finden Sie unter Dokumentation zu Visual Studio
An einen Prozess anhängen
Wenn Sie Fehler in einem Spiel beheben möchten, das bereits auf einem physischen oder virtuellen Gerät ausgeführt wird können Sie den Debugger von Visual Studio aus an den Prozess anhängen.
Achten Sie darauf, dass in Visual Studio eine Android-Lösung geöffnet ist, und:
- Öffnen Sie das Menü Debug (Fehlerbehebung) und wählen Sie Attach to Process... (An Prozess anhängen...) aus.
- Wählen Sie im Drop-down-Menü Transport die Option Android Game Development Extension aus.
- Wählen Sie im Drop-down-Menü Qualifier (Qualifier) Ihr Android-Gerät aus.
- Wählen Sie den Spielprozess aus der Liste der verfügbaren Prozesse klicken Sie auf Anhängen.
Befehle für LLDB.Shell ausführen
Verwenden Sie bei aktiver Debugging-Sitzung das Befehlsfenster von Visual Studio, um die LLDB.Shell-Befehlen
Befehlsformat:
LLDB.Shell [command]
Beispiel:
>LLDB.Shell expr myIntVariable = 9
Status: Success
Output Message:
(int) $2 = 9
Datenvisualisierung
Formatspezifizierer
Sie können das Format ändern, in dem ein Wert in den Bereichen Autos, Locals-, Watch- und variable DataTip-Fenster mit Formatspezifizierern.
Formatspezifizierer befinden sich am Ende von Ausdrücken. Sie beginnen mit einem Komma.
gefolgt von einem kurzen String. Beispiel: Der ,x
-Spezifizierer in _myInt,x
wird myInt als Hexadezimalwert in Kleinbuchstaben formatiert.
Formatspezifizierer können direkt im Watch-Fenster oder im Autos-, Locals- und DataTip-Fenster, indem Sie sie Natvis hinzufügen. Ausdrücke. Weitere Informationen finden Sie bei Natvis.
Liste der Supportspezifizierer
Formatname | Spezifizierer | Beschreibung |
---|---|---|
boolean | B | zeigen dies als booleschen Wert wahr/falsch an und verwenden dabei die gängige Regel, dass 0 falsch und alles andere wahr ist |
Binärprogramm | b | zeigen dies als Folge von Bits |
binär, keine führende 0b | bb | dies als eine Sequenz von Bits ohne das Präfix 0b zeigen |
Bytes | y | die Byte anzeigen, aber versuchen Sie, sie auch als ASCII-Zeichen anzuzeigen z.B. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
Byte mit ASCII | J | die Byte anzeigen, aber versuchen Sie, sie auch als ASCII-Zeichen anzuzeigen z.B. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
Zeichen | c | Byte als ASCII-Zeichen anzeigen z.B. (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0 |
Druckbares Zeichen | C | Byte als druckbare ASCII-Zeichen anzeigen z.B. (int *) c.sp.x = P.._.... |
komplexe Gleitkommazahl | F | Diesen Wert als reellen und imaginären Teil einer komplexen Gleitkommazahl interpretieren z.B. (int *) c.sp.x = 2.76658e+19 + 4.59163e-41i |
decimal | d, i | Zeigt dies als vorzeichenbehaftete Ganzzahl an (hier wird keine Umwandlung durchgeführt, sondern es werden einfach die Bytes als Ganzzahl mit Vorzeichen angezeigt) |
Aufzählung | E,de | zeigen dies als Aufzählung an und geben den Namen des Werts aus, falls verfügbar, andernfalls den ganzzahligen Wert z.B. (enumType) val_type = eValue2 |
hexadezimal – kleingeschrieben | x, h | Zeigen Sie dies in hexadezimaler Kleinschreibung in Kleinbuchstaben an (hier wird keine Umwandlung durchgeführt, sondern nur die Byte als hexadezimal angezeigt) |
hexadezimal – Großbuchstaben | X, H | zeigen dies in hexadezimaler Großschreibung an (es wird keine Umwandlung durchgeführt, sondern nur die Bytes als hexadezimal) |
hexadezimal – klein, keine vorangestellte 0x | XB, HB | Geben Sie dies in hexadezimaler Notation in Kleinbuchstaben ohne das Präfix 0x an (hier wird keine Umwandlung durchgeführt, sondern nur die Byte als hexadezimal angezeigt) |
hexadezimal – groß, keine vorangestellte 0x | Xb, Hb | Zeigen Sie dies in hexadezimaler Großschreibung ohne Präfix 0x an (hier wird keine Umwandlung durchgeführt, sondern nur die Byte als hexadezimal angezeigt) |
schweben | f | Dies wird als Gleitkommazahl angezeigt (es wird keine Umwandlung durchgeführt, sondern interpretiert nur die Byte als IEEE754-Gleitkommawert) |
Oktal | o | in Oktalschreibweise anzeigen |
Betriebssystemtyp | O | dies als MacOS-OSType anzeigen, z.B. (Gleitkommazahl) x = '\n\x1f\xd7\n' |
string – C-String | s | zeig dies als 0-terminierten C-String an, z.B. „Hello World“ |
string – C-String, keine Anführungszeichen. | sb | zeigen dies als 0-terminierten C-String ohne Anführungszeichen an, z.B. Hello World |
string – UTF-8 | S8 | zeigen dies als 0-terminierten UTF-8-String an, z.B. u8"Hallo Welt ☕" |
String – UTF-8, keine Anführungszeichen | s8b | zeigen dies als 0-terminierten UTF-8-String ohne Anführungszeichen an. z. B. Hallo Welt ☕ |
string – UTF-16 | su | zeigen dies als 0-terminierten UTF-16-String an, z.B. u„Hallo Welt ☕“ |
String – UTF-16, keine Anführungszeichen | sub | zeigen dies als 0-terminierten UTF-16-String ohne Anführungszeichen an. z. B. Hallo Welt ☕ |
string – UTF-32 | S32 | zeigen dies als 0-terminierten UTF-32-String an, z.B. „Hallo Welt ☕“ |
String – UTF-32, keine Anführungszeichen | S32B | zeigen dies als 0-terminierten UTF-32-String ohne Anführungszeichen an. z. B. Hallo Welt ☕ |
unicode16 | U | dies als UTF-16-Zeichen anzeigen, z.B. (Gleitkommazahl) x = 0xd70a 0x411f |
unicode32 | U32 | dies als UTF-32-Zeichen anzeigen, z.B. (Gleitkommazahl) x = 0x411fd70a |
Dezimalzahl ohne Vorzeichen | u | Zeigt dies als vorzeichenlose Ganzzahl an (hier wird keine Umwandlung durchgeführt, sondern nur die Byte als vorzeichenlose Ganzzahl) |
Zeiger | p | Dies wird als nativer Verweis dargestellt (es sei denn, es handelt sich tatsächlich um einen Verweis, ist die resultierende Adresse wahrscheinlich ungültig) |
komplexe Ganzzahl | I | Diesen Wert als reellen und imaginären Teil einer komplexen Ganzzahl interpretieren z.B. (int *) pointer = 1048960 + 1i |
Zeichenarray | a | zeigen dies als Array von Zeichen an, z.B. (char) *c.sp.z = {X} |
Raw | ! | Rohdatenformat, wobei die Anpassungen der Datentypansichten ignoriert werden. |
Natvis
Mit dem Natvis-Framework können Sie die Darstellungsart von Visual Studio native Typen in den Fenstern der Debugger-Variablen. Verwenden Sie beispielsweise Natvis, die Anzeige der Fenster Watch, Locals und Data Tips anpassen.
Die Natvis-Funktion ist standardmäßig aktiviert, kann aber in Visual Studio deaktiviert werden. indem Sie das Menü Tools > Optionen > Erweiterung für Android-Spieleentwicklung > Natvis Flag auf Disabled (Deaktiviert).
Natvis-Dateien werden geladen
Visual Studio lädt Natvis-Dateien aus den drei unten aufgeführten Speicherorten. werden sie bei jedem Start einer Fehlerbehebungssitzung neu geladen. Dateien müssen den Natvis-Schema von Visual Studio 2017
.natvis
-Dateien, die Teil eines geladenen Projekts oder eines übergeordneten Lösungselements sind.- Das nutzerspezifische Verzeichnis
(
%USERPROFILE%\Documents\Visual Studio 2017\Visualizers
) - Das systemweite Verzeichnis
(
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
)
Natvis-Dateien werden neu geladen
Laden Sie Natvis-Dateien während einer Fehlerbehebungssitzung neu, indem Sie .natvisreload
im
Befehls- oder Überwachungsfenster.
Natvis-Beispieldatei
Diese Natvis-Beispieldatei enthält alle Tags und Attribute, die derzeit unterstützt.
<?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>
Natvis-Dateien erstellen
Visual Studio unterstützt das Erstellen eigener Natvis-Dateien. Weitere Informationen zum Anpassen der Fenster für Debugger-Variablen finden Sie unter MSDN:
Debugging von Natvis-Dateien
In einigen Fällen werden Fehler als Wert einer Variablen dargestellt (z.B. in
Automatisch, Ansehen usw.). Beispiel: <error: use of undeclared
identifier 'missingVar'>
Weitere Details zum Fehler finden Sie in der GoogleAndroid.log
aus der Symbolleiste der Erweiterung „Android Game Development Extension“ aus.
Bekannte Einschränkungen
Wenn Ihr Tag oder Attribut nicht in der Beispieldatei oben aufgeführt ist, unterstützt werden. Visual Studio ignoriert nicht unterstützte Tags und Attribute. Sie können sie in einer vorhandenen Natvis-Datei belassen. Die Datei funktioniert, solange sie wird unser Schema verwendet.
Das Attribut
Usage
ist zwar für das Schema erforderlich, wird aber nicht unterstützt für<SmartPointer>
. LLDB schränkt jedoch nicht den Zugriff auf Betreiber ein, die in C++ definiert sind, sodass jeder erforderliche Operator stattdessen in C++ definiert werden kann.