Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows 8 için hata ayıklayıcı ve Windows derleyicisi iyileştirilmiş kodda hata ayıklama ve satır içi işlevlerin hatalarını ayıklama amacıyla geliştirilmiştir. Hata ayıklayıcı, yazmaçlarda veya yığında depolanmış olmalarına bakılmaksızın parametreleri ve yerel değişkenleri görüntüler. Hata ayıklayıcısı, çağrı yığınında satır içi işlevleri de görüntüler. Satır içi işlevler için hata ayıklayıcı yerel değişkenleri görüntüler, ancak parametreleri görüntülemez.
Kod iyileştirildiğinde, daha hızlı çalışacak ve daha az bellek kullanacak şekilde dönüştürülür. Bazen işlev, geçersiz kod kaldırma, kodun birleştirilmesi veya işlevlerin satır içine yerleştirilmesi sonucu kaldırılır. Yerel değişkenler ve parametreler de kaldırılabilir. Birçok kod iyileştirmesi, gerekli olmayan veya kullanılmayan yerel değişkenleri kaldırır; diğer iyileştirmeler döngülerdeki indüksiyon değişkenlerini kaldırır. Yaygın alt ifade eleme, yerel değişkenleri birleştirir.
Windows'un perakende derlemeleri iyileştirilmiştir. Bu nedenle Windows'un perakende derlemesini çalıştırıyorsanız, iyileştirilmiş kodla iyi çalışacak şekilde tasarlanmış bir hata ayıklayıcısına sahip olmak özellikle yararlıdır. İyileştirilmiş kodun hata ayıklamasını etkili hale getirmek için iki birincil özellik gerekir: 1) yerel değişkenlerin doğru görüntülenmesi ve 2) çağrı yığınındaki satır içi işlevlerin görüntülenmesi.
Yerel değişkenlerin ve parametrelerin doğru görüntülenmesi
Yerel değişkenlerin ve parametrelerin doğru görüntülenmesini kolaylaştırmak için derleyici, yerel değişkenlerin ve parametrelerin konumları hakkındaki bilgileri sembol (PDB) dosyalarına kaydeder. Bu konum kayıtları değişkenlerin depolama konumlarını ve bu konumların geçerli olduğu belirli kod aralıklarını izler. Bu kayıtlar yalnızca değişkenlerin konumlarını (yazmaçlarda veya yığın yuvalarında) değil, aynı zamanda değişkenlerin hareketini de izlemeye yardımcı olur. Örneğin, bir parametre önce RCX kaydında olabilir, ancak RCX'i boşaltmak için bir yığın yuvasına taşınır, ardından bir döngüde yoğun olarak kullanıldığında R8 kaydına taşınır ve ardından kod döngünün dışındayken farklı bir yığın yuvasına taşınır. Windows hata ayıklayıcısı PDB dosyalarındaki zengin konum kayıtlarını kullanır ve yerel değişkenler ve parametreler için uygun konum kayıtlarını seçmek için geçerli yönerge işaretçisini kullanır.
Visual Studio'daki Yereller penceresinin bu ekran görüntüsü, iyileştirilmiş bir 64 bit uygulamadaki bir işlevin parametrelerini ve yerel değişkenlerini gösterir. İşlev satır içi olmadığından hem parametreleri hem de yerel değişkenleri görüyoruz.
Parametrelerin ve yerel değişkenlerin konumlarını görmek için dv -v komutunu kullanabilirsiniz.
Yerel Ayarlar penceresinde, yazmaçlarda depolanmış olsalar bile parametrelerin doğru şekilde görüntülendiğini göreceksiniz.
Konum kayıtları, ilkel türlerle değişkenleri izlemeye ek olarak yerel yapıların ve sınıfların veri üyelerini izler. Aşağıdaki hata ayıklayıcısı çıkışı yerel yapıları görüntüler.
0:000> dt My1
Local var Type _LocalStruct
+0x000 i1 : 0n0 (edi)
+0x004 i2 : 0n1 (rsp+0x94)
+0x008 i3 : 0n2 (rsp+0x90)
+0x00c i4 : 0n3 (rsp+0x208)
+0x010 i5 : 0n4 (r10d)
+0x014 i6 : 0n7 (rsp+0x200)
0:000> dt My2
Local var @ 0xefa60 Type _IntSum
+0x000 sum1 : 0n4760 (edx)
+0x004 sum2 : 0n30772 (ecx)
+0x008 sum3 : 0n2 (r12d)
+0x00c sum4 : 0n0
Yukarıdaki hata ayıklayıcısı çıkışıyla ilgili bazı gözlemler aşağıdadır.
- My1 yerel yapısı, derleyicinin yerel yapı veri üyelerini kayıtlara ve bitişik olmayan yığın yuvalarına yayabildiğini gösterir.
-
dt My2 komutunun çıkışı, dt _IntSum 0xefa60 komutunun çıkışından farklı olacaktır. Yerel yapının bitişik bir yığın belleği bloğunu kapsayacağını varsayamazsınız.
My2 söz konusu olduğunda yalnızca
sum4özgün yığın bloğunda kalır; diğer üç veri üyesi kayıtlara taşınır. - Bazı veri üyelerinin birden çok konumu olabilir. Örneğin, My2.sum2'nin iki konumu vardır: biri ECX kayıt yeri (Windows hata ayıklayıcısının seçtiği) ve diğeri 0xefa60+0x4 (orijinal yığın yuvası). Bu durum ilkel tür yerel değişkenler için de meydana gelebilir ve Windows hata ayıklayıcısı kullanılacak konumu belirlemek için dayanağı olan heuristikler uygular. Örneğin, kayıt konumları her zaman yığın konumlarından önceliklidir.
Çağrı yığınında satır içi işlevleri görüntüleme
Kod iyileştirme sırasında bazı işlevler hizaya yerleştirilir. Diğer bir ifadeyle, işlevin gövdesi, makro genişletmesi gibi doğrudan koda yerleştirilir. İşlev çağrısı yok ve çağırana dönüş yok. Derleyici, satır içi işlevlerin görüntülenmesini kolaylaştırmak için verileri PDB dosyalarında depolar ve bu dosyalar satır içi işlevlerin kod öbeklerinin (yani, satır içine yerleştirilmiş çağrılan işlevlere ait çağıran işlevlerdeki kod bloklarının dizileri) ve yerel değişkenlerin (bu kod bloklarındaki kapsamlı yerel değişkenler) kodunu çözmesine yardımcı olur. Bu veriler, hata ayıklayıcının yığın geri sarma işleminin bir parçası olarak satır içi işlevleri içermesine yardımcı olur.
Diyelim ki bir uygulama derliyorsunuz ve func1 adlı bir işlevi satır içi hale gelmeye zorluyorsunuz.
__forceinline int func1(int p1, int p2, int p3)
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
...
}
bm komutunu kullanarak konumunda func1bir kesme noktası ayarlayabilirsiniz.
0:000> bm MyApp!func1
1: 000007f6`8d621088 @!"MyApp!func1" (MyApp!func1 inlined in MyApp!main+0x88)
0:000> g
Breakpoint 1 hit
MyApp!main+0x88:
000007f6`8d621088 488d0d21110000 lea rcx,[MyApp!`string' (000007f6`8d6221b0)]
func1 içine bir adım attıktan sonra, çağrı yığınında func1 görmek için k komutunu kullanabilirsiniz.
için yerel değişkenleri görmek için func1dv komutunu kullanabilirsiniz. Yerel değişkenin num3 kullanılamaz olarak gösterildiğine dikkat edin. Bir yerel değişken, iyileştirilmiş kodda çeşitli nedenlerle kullanılamıyor olabilir. Değişkenin iyileştirilmiş kodda mevcut olmaması olabilir. Değişkenin henüz başlatılmamış olması veya değişkenin artık kullanılmaması olabilir.
0:000> p
MyApp!func1+0x7:
000007f6`8d62108f 8d3c33 lea edi,[rbx+rsi]
0:000> knL
# Child-SP RetAddr Call Site
00 (Inline Function) --------`-------- MyApp!func1+0x7
01 00000000`0050fc90 000007f6`8d6213f3 MyApp!main+0x8f
02 00000000`0050fcf0 000007ff`c6af0f7d MyApp!__tmainCRTStartup+0x10f
03 00000000`0050fd20 000007ff`c7063d6d KERNEL32!BaseThreadInitThunk+0xd
04 00000000`0050fd50 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
0:000> dv -v
00000000`0050fcb0 num1 = 0n0
00000000`0050fcb4 num2 = 0n0
<unavailable> num3 = <value unavailable>
Yığın izlemesindeki 1. kareye bakarsanız main işlevinin yerel değişkenlerini görebilirsiniz. Değişkenlerden ikisinin yazmaçlarda depolandığına dikkat edin.
0:000> .frame 1
01 00000000`0050fc90 000007f6`8d6213f3 MyApp!main+0x8f
0:000> dv -v
00000000`0050fd08 c = 0n7
@ebx b = 0n13
@esi a = 0n6
Windows hata ayıklayıcısı, belirli bir işlevin satır içine yerleştirildiği tüm yerleri bulmak için PDB dosyalarından verileri toplar. Satır içi işlevin tüm arayan sitelerini listelemek için x komutunu kullanabilirsiniz.
0:000> x simple!MoreCalculate
00000000`ff6e1455 simple!MoreCalculate = (inline caller) simple!wmain+8d
00000000`ff6e1528 simple!MoreCalculate = (inline caller) simple!wmain+160
0:000> x simple!Calculate
00000000`ff6e141b simple!Calculate = (inline caller) simple!wmain+53
Windows hata ayıklayıcısı bir satır içi işlevin tüm arayan sitelerini numaralandırabildiğinden, çağıran sitelerden uzaklıkları hesaplayarak satır içi işlevin içinde kesme noktaları ayarlayabilir. Satır içi işlevlerin kesme noktalarını ayarlamak için bm komutunu (normal ifade desenleriyle eşleşen kesme noktalarını ayarlamak için kullanılır) kullanabilirsiniz.
Windows hata ayıklayıcısı, belirli bir satır içi işlev için ayarlanan tüm kesme noktalarını kesme noktası kapsayıcısında gruplandırır. Be, bd, bc gibi komutları kullanarak kesme noktası kapsayıcısını bir bütün olarak işleyebilirsiniz. Aşağıdaki bd 3 ve bc 3 komut örneklerine bakın. Ayrı kesme noktalarını da işleyebilirsiniz. Aşağıdaki be 2 komut örneğine bakın.
0:000> bm simple!MoreCalculate
2: 00000000`ff6e1455 @!"simple!MoreCalculate" (simple!MoreCalculate inlined in simple!wmain+0x8d)
4: 00000000`ff6e1528 @!"simple!MoreCalculate" (simple!MoreCalculate inlined in simple!wmain+0x160)
0:000> bl
0 e 00000000`ff6e13c8 [n:\win7\simple\simple.cpp @ 52] 0001 (0001) 0:**** simple!wmain
3 e <inline function> 0001 (0001) 0:**** {simple!MoreCalculate}
2 e 00000000`ff6e1455 [n:\win7\simple\simple.cpp @ 58] 0001 (0001) 0:**** simple!wmain+0x8d (inline function simple!MoreCalculate)
4 e 00000000`ff6e1528 [n:\win7\simple\simple.cpp @ 72] 0001 (0001) 0:**** simple!wmain+0x160 (inline function simple!MoreCalculate)
0:000> bd 3
0:000> be 2
0:000> bl
0 e 00000000`ff6e13c8 [n:\win7\simple\simple.cpp @ 52] 0001 (0001) 0:**** simple!wmain
3 d <inline function> 0001 (0001) 0:**** {simple!MoreCalculate}
2 e 00000000`ff6e1455 [n:\win7\simple\simple.cpp @ 58] 0001 (0001) 0:**** simple!wmain+0x8d (inline function simple!MoreCalculate)
4 d 00000000`ff6e1528 [n:\win7\simple\simple.cpp @ 72] 0001 (0001) 0:**** simple!wmain+0x160 (inline function simple!MoreCalculate)
0:000> bc 3
0:000> bl
0 e 00000000`ff6e13c8 [n:\win7\simple\simple.cpp @ 52] 0001 (0001) 0:**** simple!wmain
Satır içi işlevler için açık çağrı veya dönüş yönergeleri olmadığından, kaynak düzeyinde adımlama özellikle hata ayıklayıcı için zordur. Örneğin, bir satır içi işleve istemeden adım atabilirsiniz (sonraki yönerge bir satır içi işlevin parçasıysa) veya aynı satır içi işleve birden çok kez girip çıkabilirsiniz (satır içi işlevin kod blokları derleyici tarafından bölündüğü ve taşındığından). Tanıdık adımlama deneyimini korumak için, Windows hata ayıklayıcı, her kod yönerge adresi için küçük bir konseptüel çağrı yığını korur ve adım-atla, adım-geç ve adım-çık işlemlerini yürütmek için bir iç durum makinesi oluşturur. Bu, satır içi olmayan fonksiyonlar için adım izleme deneyimini makul ölçüde doğru bir şekilde yansıtır.
Ek Bilgiler
Not Satır içi işlev hata ayıklamasını devre dışı bırakmak için .inline 0 komutunu kullanabilirsiniz. .inline 1 komutu satır içi işlev hata ayıklamasını etkinleştirir. Standart Hata Ayıklama Teknikleri