Debugger

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:

  1. Öffnen Sie das Menü Debug (Fehlerbehebung) und wählen Sie Attach to Process... (An Prozess anhängen...) aus.
  2. Wählen Sie im Drop-down-Menü Transport die Option Android Game Development Extension aus.
  3. Wählen Sie im Drop-down-Menü Qualifier (Qualifier) Ihr Android-Gerät aus.
  4. Wählen Sie den Spielprozess aus der Liste der verfügbaren Prozesse klicken Sie auf Anhängen.

An Prozess 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&lt;*&gt;">
    <AlternativeType Name="MySimilarVectorType&lt;*&gt;"/>

    <!-- 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 &lt; 4 &amp;&amp; _size &gt;= 1" Optional="true">_items[0]</Item>
      <Item Name="Y" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 2" Optional="true">_items[1]</Item>
      <Item Name="Z" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 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.