Hata Ayıklayıcı

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:

  1. Hata Ayıklama menüsüne gidin ve İşleme Ekle... seçeneğini belirleyin.
  2. Taşıma açılır menüsünden Android Oyun Geliştirme Uzantısı'nı seçin.
  3. Kalifiye açılır menüsünden Android cihazınızı seçin.
  4. Kullanılabilir işlemler listesinden oyun işlemini seçin ve Ekle'yi tıklayın.

İşleme ekleyin

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&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 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.