Android Oyun Geliştirme Uzantısı'nı kullanırken Visual Studio Debugger (LLDB) ile projenizde hata ayıklayın.
Hata ayıklayıcıyı çalıştırma
Hata ayıklayıcıyı çalıştırmadan önce oyununuzu Android'de derleyip dağıtabiliyor ve çalıştırabilmeniz gerekir. Ayrıntılar için Örneği çalıştırma bölümüne bakın.
Oyununuzu hata ayıklayıcı olmadan çalıştırabildiğinizden emin olduktan sonra, F5 tuşuna basarak veya Hata Ayıklama menüsünden Hata Ayıklamayı Başlat öğesini seçerek hata ayıklayıcıyı kullanabilirsiniz. Hata ayıklayıcı oyuna eklenirken bir iletişim kutusu görürsünüz.
Uygulamanızın boyutuna ve başlangıçta yüklenmesi gereken simge miktarına bağlı olarak hata ayıklayıcının başlatılması 10 saniye ila 1 dakika veya daha uzun sürer. Hata ayıklayıcının, cihazdan bazı Android kitaplıklarını ana makineye indirmesi gerektiğinden ilk kez yeni bir cihaza bağlama işlemi daha uzun sürer. Yeni bir cihazla ilk birkaç denemenizde 1 dakikadan uzun sürüyorsa hata ayıklama oturumunu iptal edip yeniden başlatmayı düşünün.
Hata ayıklayıcıyı bu şekilde çalıştırdığınızda, oyun Hata Ayıklayıcı Bekleniyor modunda başlatılır ve hata ayıklayıcı bağlanana kadar oyununuzun kodlarının hiçbirini yürütmez. Böylece oyununuzun başlatma bölümünde de hata ayıklayabilirsiniz.
Visual Studio Belgeleri'ni okuyarak belirli Visual Studio hata ayıklayıcı özellikleri hakkında daha fazla bilgi edinebilirsiniz.
İşleme ekleme
Fiziksel veya sanal cihazda çalıştırılmakta olan bir oyundaki hataları ayıklamak isterseniz hata ayıklayıcıyı işleme Visual Studio'dan ekleyebilirsiniz.
Visual Studio'da bir Android çözümünün açık olduğundan emin olun ve:
- Hata Ayıklama menüsüne gidin ve İşleme Ekle... seçeneğini belirleyin.
- Taşıma açılır menüsünden Android Oyun Geliştirme Uzantısı'nı seçin.
- Kalifiye açılır menüsünden Android cihazınızı seçin.
- Kullanılabilir işlemler listesinden oyun işlemini seçin ve Ekle'yi tıklayın.
LLDB.Shell komutlarını yürütme
Bir hata ayıklama oturumu etkin durumdayken LLDB.Shell komutlarını çalıştırmak için Visual Studio'nun Komut Penceresi'ni kullanın.
Komut biçimi:
LLDB.Shell [command]
Örnek:
>LLDB.Shell expr myIntVariable = 9
Status: Success
Output Message:
(int) $2 = 9
Veri görselleştirme
Biçim Belirticiler
Biçim belirleyicileri kullanarak Autos, Locals, Watch ve değişken DataTip pencerelerinde bir değerin görüntülendiği biçimi değiştirebilirsiniz.
Biçim belirleyiciler, ifadelerin sonunda bulunur. Bir virgülle başlar,
ardından kısa bir dize gelir. Örneğin, _myInt,x
ifadesindeki ,x
belirteci, myInt değerini küçük harf on altılı olarak biçimlendirir.
Biçim belirleyiciler, doğrudan İzle penceresinde veya Natvis ifadelerinize eklenerek Autos, Locals ve DataTip pencerelerinde kullanılabilir. Daha fazla bilgi için Natvis sayfasını inceleyin.
Destek belirteçlerinin listesi
Biçim Adı | Belirteçler | Açıklama |
---|---|---|
Boole | B | 0'ın yanlış ve diğer her şeyin doğru olduğu geleneksel kuralı kullanarak bunu doğru/yanlış boole değeri olarak gösterin. |
ikili | b | bunu bir bit dizisi olarak göster |
ikili, başında 0b yok | bb | bunu 0b öneki olmayan bit dizisi olarak göster |
bayt | y | baytları gösterir, ancak bunları ASCII karakterleri olarak da görüntülemeye çalışın ör. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
ASCII ile bayt | Y | baytları gösterir, ancak bunları ASCII karakterleri olarak da görüntülemeye çalışın ör. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._.... |
karakter | c | baytları ASCII karakterleri olarak gösterir ör. (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0 |
yazdırılabilir karakter | C | baytları yazdırılabilir ASCII karakterleri olarak gösterir ör. (int *) c.sp.x = P.._.... |
karmaşık bolluk | F | bu değeri karmaşık bir kayan nokta sayısının gerçek ve sanal kısmı olarak yorumlar ör. (int *) c.sp.x = 2.76658e+19 + 4.59163e-41i |
ondalık sayı | d, i | bunu işaretli bir tam sayı olarak gösterin (bu işlem bir yayın gerçekleştirmez, sadece baytları işaretli bir tam sayı olarak gösterir) |
numaralandırma | E,en | bunu bir numaralandırma olarak gösterin.Varsa değerin adını, aksi takdirde tam sayı değerini yazdırır ör. (enum enumType) val_type = eValue2 |
onaltılık - küçük harf | x, y | bunu küçük harf onaltılı gösterimle göster (bu işlem yayın gerçekleştirmez, yalnızca baytları onaltılık olarak gösterir) |
onaltılık - büyük harfli | X, Y | bunu büyük harfli onaltılı gösterimle göster (bu işlem yayın gerçekleştirmez, yalnızca baytları onaltılık olarak gösterir) |
onaltılık - küçük harf, başında 0x yok | xb, hb | bunu 0x öneki olmadan küçük harfli onaltılı gösterimle göster (bu işlem yayın gerçekleştirmez, yalnızca baytları onaltılık olarak gösterir) |
onaltılık - büyük harfli, başında 0x yok | Xb, Hb | bunu 0x öneki olmadan büyük harfli onaltılı gösterimle göster (bu işlem yayın gerçekleştirmez, yalnızca baytları onaltılık olarak gösterir) |
kayan | f | bunu bir kayan noktalı sayı olarak gösterin (bu işlem yayın gerçekleştirmez, yalnızca baytları bir IEEE754 kayan nokta değeri olarak yorumlar) |
sekizlik | o | bunu sekizlik gösterimle göster |
OS türü | O | bunu bir MacOS OSType olarak gösterin ör. (float) x = '\n\x1f\xd7\n' |
string - C dizesi | sn. | bunu 0 sona ermiş C dizesi olarak gösterebilirsiniz Ör. "merhaba dünya" |
string - C dizesi, tırnak işareti yok | sb | bunu tırnak işareti olmadan 0 sona eren C dizesi olarak gösterin, ör. merhaba dünya |
string - UTF-8 | E8 | bunu 0 sona ermiş UTF-8 dizesi olarak gösterir ör. u8"merhaba dünya ☕" |
string - UTF-8, tırnak işareti yok | S8b | bunu tırnak işareti olmadan, 0 sona erimli bir UTF-8 dizesi olarak gösterin ör. merhaba dünya ☕ |
string - UTF-16 | su | bunu 0 sona ermiş UTF-16 dizesi olarak göster ör. u"hello world ☕" |
string - UTF-16, tırnak işareti yok | alt | bunu tırnak işareti olmadan, 0 sona ermiş UTF-16 dizesi olarak gösterin ör. merhaba dünya ☕ |
string - UTF-32 | s32 | bunu 0 bitişli bir UTF-32 dizesi olarak gösterir ör. U"hello world ☕" |
string - UTF-32, tırnak işareti yok | s32b | bunu tırnak işareti olmadan, 0 sona eren bir UTF-32 dizesi olarak gösterin ör. merhaba dünya ☕ |
Unicode16 | U | bunu UTF-16 karakterleri olarak gösterin ör. (kayan) x = 0xd70a 0x411f |
Unicode32 | U32 | bunu UTF-32 karakterleri olarak gösterin ör. (kayan) x = 0x411fd70a |
işaretsiz ondalık | u | bunu imzasız bir tam sayı olarak gösterin (Bu işlem yayın gerçekleştirmez, sadece baytları imzasız tam sayı olarak gösterir) |
işaretçi | p | bunu yerel işaretçi olarak göster (bu gerçekten bir işaretçi değilse sonuçta ortaya çıkan adres muhtemelen geçersiz olacaktır) |
karmaşık tam sayı | İ | bu değeri karmaşık bir tam sayının gerçek ve sanal kısmı olarak yorumlar örneğin, (int *) işaretçi = 1048960 + 1i |
karakter dizisi | CANNOT TRANSLATE | bunu bir karakter dizisi olarak gösterin ör. (karakter) *c.sp.z = {X} |
İşlenmemiş | ! | ham biçim (veri türü görünümlerinin özelleştirilmesi yok sayılır) |
Natvis
Natvis çerçevesi, Visual Studio'nun hata ayıklayıcı değişken pencerelerinde yerel türleri görüntüleme şeklini özelleştirmenize olanak tanır. Örneğin, İzleyin, Yereller ve Veri İpuçları pencereleri için ekranları özelleştirmek üzere Natvis'i kullanın.
Natvis özelliği varsayılan olarak etkindir ancak Araçlar > Seçenekler > Android Oyun Geliştirme Uzantısı > Natvis işareti Devre dışı olarak ayarlanarak Visual Studio'dan devre dışı bırakılabilir.
Natvis dosyaları yükleniyor
Visual Studio, aşağıda listelenen üç konumdan Natvis dosyalarını yükler ve hata ayıklama oturumu her başlattığınızda bu dosyaları yeniden yükler. Dosyalar, Visual Studio 2017 Natvis şemasına uygun olmalıdır.
- Yüklenmiş bir projenin veya üst düzey çözüm öğesinin parçası olan
.natvis
dosyaları. - Kullanıcıya özel dizin
(
%USERPROFILE%\Documents\Visual Studio 2017\Visualizers
) - Sistem genelindeki dizin
(
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
)
Natvis dosyalarını yeniden yükleme
Hata ayıklama oturumu sırasında Komut Penceresi veya İzleme penceresinde .natvisreload
komutunu değerlendirerek Natvis dosyalarını yeniden yükleyin.
Örnek Natvis dosyası
Bu örnek Natvis dosyası, şu anda desteklenen tüm etiketleri ve özellikleri içerir.
<?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 dosyalarını yazma
Visual Studio, kendi Natvis dosyalarınızı yazmayı destekler. Hata ayıklayıcı değişken pencerelerini özelleştirme hakkında daha fazla bilgi edinmek için MSDN bölümüne bakın.
Natvis dosyalarında hata ayıklama
Bazı durumlarda hatalar, değişkenin Değer'i olarak sunulur (ör. Otomatik, İzle vb. pencerelerde). Örneğin: <error: use of undeclared
identifier 'missingVar'>
Hatayla ilgili daha fazla ayrıntıya Android Game Development Extension araç çubuğundan GoogleAndroid.log
dosyasını açarak erişebilirsiniz.
Bilinen sınırlamalar
Etiketiniz veya özelliğiniz yukarıdaki örnek dosyada listelenmiyorsa bu özellik şu anda desteklenmemektedir. Visual Studio, desteklenmeyen etiketleri ve özellikleri yok sayar. Böylece bunları mevcut bir Natvis dosyasında bırakabilirsiniz. Dosya, şemamızı kullandığı sürece çalışmaya devam eder.
Şemada gerekli olsa da
Usage
özelliği<SmartPointer>
için desteklenmiyor. Ancak LLDB, C++'ta tanımlanan operatörlere erişimi kısıtlamaz. Böylece, gerekli herhangi bir operatör C++'ta tanımlanabilir.