Hata Ayıklayıcı

Android Oyun Geliştirme Uzantısı.

Hata ayıklayıcıyı çalıştırma

Hata ayıklayıcıyı çalıştırabilmeniz için öncelikle oyuna dönüştü. Ayrıntılar için Örneği çalıştırma bölümüne bakın.

Oyununuzu hata ayıklayıcı olmadan çalıştırabileceğinizden emin olduktan sonra F5'e basarak veya Hata Ayıklamayı Başlat öğesini seçerek hata ayıklayıcı Hata ayıkla. Hata ayıklayıcı yüklenirken bir iletişim kutusu gösterilir bir seçimdir.

Hata ayıklayıcının başlatılması 10 saniye ila 1 dakika veya daha uzun sürer uygulamanızın boyutuna ve gereken sembol sayısına bağlı olarak başlangıçta yüklenecek. Yeni bir cihaza takmak daha fazla zaman alır. bazı Android kitaplıklarını indirmek zorunda olduğundan ana makineye bağlamalısınız. İlk görüşmenizde 1 dakikadan uzun sürüyorsa yeni bir cihazla birkaç deneme yapılıyorsa hata ayıklama oturumunu iptal edebilir ve ardından yeniden başlatmayı deneyin.

Hata ayıklayıcıyı bu şekilde çalıştırdığınızda oyun, Bekleyenler Hata Ayıklayıcı modundaki herhangi bir oyununuzun kodunu hata ayıklayıcı bağlanır. Bu şekilde, kontrol panelinin başlatma bölümünde de hata ayıklayabilirsiniz. gösterir.

Belirli Visual Studio hata ayıklayıcı özellikleri hakkında daha fazla bilgiyi şu şekilde bulabilirsiniz: Visual Studio Dokümanları'nı okuyun.

İşleme ekleme

Fiziksel veya sanal makinede çalışan bir oyunda hata ayıklamak istiyorsanız 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 gidip İşleme ekle... seçeneğini belirleyin.
  2. Taşıma açılır listesinden Android Oyun Geliştirme Uzantısı'nı seçin.
  3. Niteleyici açılır listesinden Android cihazınızı seçin.
  4. Mevcut işlemler listesinden oyun sürecini seçin ve Ekle'yi tıklayın.

İşleme ekle

LLDB.Shell komutlarını yürütme

Etkin bir hata ayıklama oturumu varken Visual Studio'nun Komut Penceresini kullanarak LLDB.Kabuk komutları.

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 Belirticileri

Bir değerin görüntülenme biçimini Otomobiller, Biçim tanımlayıcıları kullanan Locals, Watch ve değişken DataTip pencereleri.

Biçim tanımlayıcıları, ifadelerin sonunda bulunur. Virgülle başlarlar. ve ardından kısa bir dize gelir. Örneğin, _myInt,x içindeki ,x tanımlayıcısı ifade, myInt değerini küçük harfli onaltılık değer olarak biçimlendirir.

Biçim belirleyiciler doğrudan İzle penceresinde veya Autos, Locals ve DataTip pencerelerini Natvis dosyanıza ekleyerek ifade eder. Daha fazla bilgi için Natvis'e göz atın.

Destek tanımlayıcı listesi

Biçim Adı Belirticiler Açıklama
Boole B 0'ın yanlış, diğer her şeyin doğru olduğu genel kuralı kullanarak bunu bir doğru/yanlış boole değeri olarak gösterin
ikili b bunu bir bit dizisi olarak göster
ikilik, başında 0b yok bb bunu, 0b öneki olmayan bir 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österin
(ö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österin
ör. (int *) c.sp.x = P.._....
karmaşık kayan noktalı C bu değeri, karmaşık bir kayan nokta sayısının gerçek ve sanal bölümü olarak yorumlayın
ör. (int *) c.sp.x = 2.76658e+19 + 4,59163e-41i
ondalık sayı d, i bunu işaretli bir tam sayı olarak gösterir (bu işlem yayınlama yapmaz, sadece baytları işaretli bir tam sayı olarak gösterir)
numaralandırma E,tr bunu bir numaralandırma olarak gösterin, varsa değerin adını, aksi takdirde tam sayı değerini yazdırın
ör. (enum enumType) val_type = eValue2
onaltılık - küçük harf x, h bunu küçük onaltılık gösterimle göster (bu, yayın yapmaz, sadece baytları onaltılık olarak gösterir)
onaltılık - büyük harf X, Y bunu büyük harflerle onaltılık gösterimde gösterir (bu, yayınlama işlemi yapmaz, 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 onaltılık gösterimle göster (yayınlama işlemi gerçekleştirilmez, yalnızca baytları onaltılık olarak gösterir)
onaltılık - büyük harf, başında 0x yok Xb, Hb bunu 0x öneki olmadan büyük harflerle onaltılık gösterimde gösterir (bu, yayınlama işlemi yapmaz, yalnızca baytları onaltılık olarak gösterir)
kayan f bunu kayan nokta sayısı olarak gösterin (bu işlem yayın yapmaz, sadece baytları bir IEEE754 kayan nokta değeri olarak yorumlar)
sekizlik o bunu sekizlik gösterimle göster
İşletim sistemi türü O bunu bir MacOS OSType olarak göster
ör. (kayan) x = '\n\x1f\xd7\n'
dize - C-dizesi s bunu 0 sonlu bir C dizesi olarak gösterin
ör. "merhaba dünya"
dize - C-dizesi, tırnak işareti yok sb bunu tırnak işaretleri olmadan, 0 sonlu C dizesi olarak gösterin,
ör. merhaba dünya
dize - UTF-8 s8 bunu 0 sonlu bir UTF-8 dizesi olarak gösterin
ör. u8"merhaba dünya ☕"
dize - UTF-8, tırnak işareti yok s8b bunu tırnak işareti olmadan 0 ile sonlandırılmış bir UTF-8 dizesi olarak gösterin
ör. merhaba dünya ☕
dize - UTF-16 su bunu 0 sonlu bir UTF-16 dizesi olarak gösterin
ör. u"merhaba dünya ☕"
dize - UTF-16, tırnak işareti yok abone bunu tırnak işaretleri olmadan, 0 sonlu bir UTF-16 dizesi olarak gösterin
ör. merhaba dünya ☕
dize - UTF-32 s32 bunu 0 sonlu bir UTF-32 dizesi olarak gösterin
ör. "Merhaba dünya ☕"
dize - UTF-32, tırnak işareti yok s32b bunu tırnak işaretleri olmadan, 0 sonlu 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 sayı u bunu işaretsiz bir tam sayı olarak gösterir (bu, yayın yapmaz, yalnızca baytları işaretsiz tam sayı olarak gösterir)
işaretçi p bunu yerel bir işaretçi olarak gösterin (bu gerçekten bir işaretçi değilse elde edilen adres muhtemelen geçersiz olacaktır)
karmaşık tam sayı İ bu değeri karmaşık bir tam sayı sayısının gerçek ve sanal bölümü olarak yorumlayın
ör. (int *) işaretçi = 1048960 + 1i
karakter dizisi a 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ştirmesi göz ardı edilir

Natvis

Natvis çerçevesi, Visual Studio'nun görüntülenme şeklini özelleştirmenizi sağlar. yerel türleri kontrol edin. Örneğin, Natvis'i kullanarak İzle, Yereller ve Veri İpuçları pencereleri için ekranları özelleştirebilirsiniz.

Natvis özelliği varsayılan olarak etkindir ancak Visual Studio'dan devre dışı bırakılabilir. Araçlar > Seçenekler > Android Oyun Geliştirme Uzantısı > Natvis Devre dışı olarak işaretleyin.

Natvis dosyaları yükleniyor

Visual Studio, aşağıda listelenen üç konumdan Natvis dosyalarını yükler ve her hata ayıklama oturumu başlattığınızda bunları yeniden yükler. Dosyalar Visual Studio 2017 Natvis şeması.

  • 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 genelinde dizin (%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers)
Natvis dosyalarını yeniden yükleme

.natvisreload öğesini Komut Penceresi veya İzleme penceresi.

Örnek Natvis dosyası

Bu örnek Natvis dosyası şu anda mevcut tüm etiketleri ve özellikleri içerir desteklenir.

<?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. Okuyucu Gelirleri Yöneticisi'ni hata ayıklayıcı değişken pencerelerini özelleştirme hakkında bilgi için bkz. MSDN ile kullanılabilir.

Natvis dosyalarında hata ayıklama

Bazı durumlarda hatalar bir değişkenin Değeri olarak sunulur (ör. Otomatik, Saat vb. pencerelerde) yer alır. Örnek: <error: use of undeclared identifier 'missingVar'>

GoogleAndroid.log öğesini açarak hatayla ilgili daha fazla ayrıntıya erişebilirsiniz. dosyasını seçin.

Bilinen sınırlamalar

  • Etiketiniz veya özelliğiniz yukarıdaki örnek dosyada listelenmiyorsa şu anda destekleniyor. Visual Studio, desteklenmeyen etiketleri ve özellikleri yoksayar. bunları mevcut bir Natvis dosyasında bırakabilirsiniz. Dosya, şemamızı kullanıyor.

  • Usage özelliği, şema için gerekli olsa da, <SmartPointer>. Ancak LLDB, operatörlerle erişimi kısıtlamaz. Böylece, gerekli herhangi bir operatörün yerine C++ dilinde tanımlanabilir.