Debuguj projekt za pomocą Visual Studio Debugger (LLDB), gdy korzystasz z Rozszerzenie Android Game Development.
Uruchamianie debugera
Zanim uruchomisz debuger, musisz być w stanie skompilować, wdrożyć i uruchomić gry na Androida. Więcej informacji znajdziesz w sekcji Uruchamianie przykładu.
Gdy upewnisz się, że grę można uruchomić bez debugera, za pomocą parametru debugera, naciskając F5 lub wybierając element Rozpocznij debugowanie. w menu Debuguj. Podczas podłączania debugera powinno się pojawić okno do gry.
Uruchomienie debugera może potrwać od 10 sekund do 1 minuty w zależności od rozmiaru aplikacji i liczby potrzebnych symboli ładowany podczas uruchamiania. Podłączenie do nowego urządzenia trwa dłużej przez ponieważ debuger musi pobrać niektóre biblioteki Androida z z komputerem hosta. Jeśli podczas pierwszego na nowym urządzeniu, rozważ anulowanie sesji debugowania, a następnie i uruchomię go z powrotem.
Po uruchomieniu debugera w ten sposób gra uruchamia się w trybie Czekam na w trybie debugera. Nie będzie on wykonywać kodu gry do czasu nawiązywane jest połączenie z debugerem. Pozwala to również debugować sekcję inicjowania funkcji Twojej gry.
Więcej informacji o konkretnych funkcjach debugera Visual Studio znajdziesz w tych sekcjach: znajdziesz w dokumentacji Studio Visual Studio.
Dołączanie do procesu
jeśli chcesz debugować grę, która jest już uruchomiona w trybie fizycznym lub wirtualnym; urządzenia, możesz podłączyć debuger do procesu z poziomu Visual Studio.
W Visual Studio upewnij się, że rozwiązanie na Androida jest otwarte, a następnie:
- Otwórz menu Debugowanie i wybierz Attach to Process (Dołącz do procesu).
- W menu Transport wybierz Android Game Development Extension (Rozszerzenie do tworzenia gier na Androida).
- Z menu Kwalifikator wybierz swoje urządzenie z Androidem.
- Wybierz proces gry z listy dostępnych procesów kliknij Dołącz.
Wykonywanie poleceń LLDB.Shell
Gdy sesja debugowania jest aktywna, uruchom polecenie w oknie poleceń Visual Studio Polecenia LLDB.Powłoka.
Format polecenia:
LLDB.Shell [command]
Przykład:
>LLDB.Shell expr myIntVariable = 9
Status: Success
Output Message:
(int) $2 = 9
Wizualizacja danych
Specyfikatory formatu
Możesz zmienić format wyświetlania wartości w sekcji Auto, Okna Locals, Watch i zmiennych DataTip, korzystając ze specyfikacji formatu.
Specyfikacje formatu znajdują się na końcu wyrażeń. Zaczynają się od przecinka,
a po nim krótki ciąg znaków. Na przykład specyfikator ,x
w parametrze _myInt,x
wyrażenie będzie formatować myInt jako małe litery szesnastkowe.
Specyfikacji formatu można użyć bezpośrednio w oknie Obejrzyj lub Autos, Locals i DataTip, dodając je do Natvis wyrażeń. Więcej informacji znajdziesz na stronie Natvis.
Lista specyfikacji pomocy
Nazwa formatu | Specyfikatory | Opis |
---|---|---|
Wartość logiczna | B | pokaż to jako wartość logiczną prawda/fałsz, używając niestandardowej reguły, w której wartość 0 to fałsz, a wszystkie pozostałe wartości są prawdziwe |
plik binarny | B | pokaż to jako sekwencję bitów, |
binarny, brak początkowego 0b | bb | pokaż to jako sekwencję bitów bez prefiksu 0b |
B | Y | ale staraj się wyświetlać je również w postaci znaków ASCII np. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
bajty z ASCII | Y | ale staraj się wyświetlać je również w postaci znaków ASCII np. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
znak | C | wyświetlać bajty jako znaki ASCII np. (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0 |
znak do druku | C | pokazują bajty jako możliwe do wydrukowania znaki ASCII np. (int *) c.sp.x = P.._.... |
złożona liczba zmiennoprzecinkowa | F | zinterpretuj tę wartość jako prawdziwą i urojoną część złożonej liczby zmiennoprzecinkowej, np. (int *) c.sp.x = 2.76658e+19 + 4.59163e-41i |
separator dziesiętny | d, i | pokaż to jako liczbę całkowitą ze znakiem (nie jest to rzutowanie, a jedynie wyświetlane bajty w postaci liczby całkowitej ze znakiem). |
wyliczenie | E,ang. | pokaż to jako wyliczenie, drukując nazwę wartości, jeśli jest dostępna, lub w innym przypadku wartość będącą liczbą całkowitą. np. (typ wyliczenia) val_type = eValue2 |
szesnastkowy – małe litery | x, wys | pokaż to w notacji szesnastkowej małymi literami (nie jest to rzutowanie, ale wyświetlane są bajty w postaci szesnastkowej) |
szesnastkowy system szesnastkowy (wielkie litery) | X, H | pokaż to w notacji szesnastkowej wielkimi literami (nie jest to rzutowanie, ale wyświetlane są bajty w postaci szesnastkowej) |
szesnastkowy system liczbowy – małe litery, bez poprzedzającego 0x | xb, HB | pokaż to w notacji szesnastkowej pisane małymi literami bez prefiksu 0x (nie jest to rzutowanie, a jedynie wyświetlane bajty w postaci szesnastkowej) |
szesnastkowy system liczbowy – duże litery, bez początkowego 0x | Xb, Hb | pokaż to w notacji szesnastkowej pisanej wielkimi literami bez prefiksu 0x (nie jest to rzutowanie, tylko wyświetla bajty jako wartości szesnastkowe) |
liczba zmiennoprzecinkowa | F | pokaż to jako liczbę zmiennoprzecinkową (nie przeprowadza to rzutowania, tylko interpretuje bajty jako wartość zmiennoprzecinkową IEEE754). |
ósemkowy | o | pokaż to w zapisie ósemkowym |
Typ systemu operacyjnego | O | jest to typ systemu operacyjnego MacOS, np. (liczba zmiennoprzecinkowa) x = '\n\x1f\xd7\n' |
string – C-string | s | pokaż to jako ciąg znaków C z zakończeniem 0 np. „witaj świecie” |
string – ciąg znaków C, bez cudzysłowów. | sb | jako ciąg znaków C z zakończeniem 0 bez cudzysłowów, np. witaj świecie |
ciąg znaków – UTF-8 | S8 | jako ciąg znaków UTF-8 z zakończeniem 0 np. u8"witaj świecie ☕" |
ciąg znaków – UTF-8, bez cudzysłowów; | S8B | pokaż to jako ciąg UTF-8 z zakończeniem 0 bez cudzysłowu. np. witaj świecie ☕ |
ciąg znaków – UTF-16 | nd. | pokaż to jako ciąg znaków UTF-16 z zakończeniem 0 np. u"witaj świecie ☕" |
ciąg znaków – UTF-16, bez cudzysłowów; | subskrypcja | pokaż to jako ciąg UTF-16 z zakończeniem 0, bez cudzysłowów. np. witaj świecie ☕ |
ciąg znaków – UTF-32 | S32 | jako ciąg znaków UTF-32 z zakończeniem 0 np. "Witaj świecie ☕" |
ciąg znaków – UTF-32, bez cudzysłowów; | S32B | pokaż to jako ciąg UTF-32 z zakończeniem 0, bez cudzysłowów. np. witaj świecie ☕ |
kod unicode16 | U | pokaż to jako znaki UTF-16. np. (liczba zmiennoprzecinkowa) x = 0xd70a 0x411f |
kod unicode32 | U32 | pokaż to jako znaki UTF-32. np. (liczba zmiennoprzecinkowa) x = 0x411fd70a |
liczba dziesiętna bez znaku | U | pokaż to jako niepodpisaną liczbę całkowitą (nie powoduje to rzutowania, ale wyświetlane bajty jako niepodpisana liczba całkowita) |
wskaźnik | P | pokaż to jako natywny wskaźnik (chyba że jest to naprawdę wskaźnik, wynikowy adres będzie prawdopodobnie nieprawidłowy) |
zespolona liczba całkowita | I | zinterpretuj tę wartość jako prawdziwą i urojoną część złożonej liczby całkowitej, np. (int *) wskaźnik = 1048960 + 1i |
tablica znaków | a | pokaż to w postaci tablicy znaków np. (znak) *c.sp.z = {X} |
Nieprzetworzony | ! | format nieprzetworzony, ignorowanie wszelkich dostosowań widoków typów danych |
Natvis
Platforma Natvis umożliwia dostosowanie sposobu wyświetlania zawartości do Visual Studio. natywne w oknach zmiennych debugera. Użyj na przykład Natvis, aby dostosować ekrany w oknach Watch, Locals i Data Guidelines (Wskazówki dotyczące danych).
Funkcja Natvis jest domyślnie włączona, ale można ją wyłączyć w Visual Studio przez ustawienie menu Narzędzia > Opcje > Rozszerzenie Android Game Development > Natvis ustaw na Wyłączono.
Wczytuję pliki Natvis
Visual Studio wczytuje pliki Natvis z 3 lokalizacji wymienionych poniżej, ładują się ponownie po każdym rozpoczęciu sesji debugowania. Pliki muszą być zgodne z Schemat Visual Studio 2017 Natvis.
.natvis
pliki, które są częścią wczytanego projektu lub elementu rozwiązania najwyższego poziomu.- W katalogu specyficznym dla użytkownika
(
%USERPROFILE%\Documents\Visual Studio 2017\Visualizers
) - W katalogu systemowym
(
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
)
Ponownie ładuję pliki Natvis
Załaduj ponownie pliki Natvis podczas sesji debugowania, oceniając .natvisreload
w
Okno poleceń lub Watch.
Przykładowy plik Natvis
Ten przykładowy plik Natvis zawiera wszystkie tagi i atrybuty obsługiwane.
<?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>
Tworzenie plików Natvis
Visual Studio umożliwia tworzenie własnych plików Natvis. Więcej informacji na temat konfiguracji o dostosowywaniu okien zmiennych debugera znajdziesz w artykule MSDN.
Debugowanie plików Natvis
W niektórych przypadkach błędy będą przedstawiane jako Wartość zmiennej (np. w polu
Auto, Zegarek itp.). Przykład: <error: use of undeclared
identifier 'missingVar'>
Aby uzyskać więcej informacji o błędzie, otwórz GoogleAndroid.log
na pasku narzędzi rozszerzenia Android Game Development Extension.
Znane ograniczenia
Jeśli Twojego tagu lub atrybutu nie ma na liście w przykładowym pliku powyżej, nie są obecnie obsługiwane. Visual Studio ignoruje nieobsługiwane tagi i atrybuty, więc możesz zostawić je w istniejącym pliku Natvis. Plik będzie działać, korzysta z naszego schematu.
Atrybut
Usage
, choć jest wymagany przez schemat, nie jest obsługiwany w przypadku<SmartPointer>
LLDB nie ogranicza jednak dostępu do operatorów w języku C++, tak aby dowolny wymagany operator można było zdefiniować w C++.