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.
.
Zaman Yolculuğu Hata Ayıklama (TTD), kullanıcıların bir programın yürütülmesinin kayıtları olan izlemeleri kaydetmesine olanak tanır. Zaman çizelgeleri, yürütme sırasında gerçekleşen olayların görsel bir gösterimidir. Bu olaylar kesme noktalarının, bellek okuma/yazmaların, işlev çağrılarının ve dönüşlerinin ve özel durumların konumları olabilir.
Önemli olayları görüntülemek, göreli konumlarını anlamak ve TTD izleme dosyanızdaki konumlarına kolayca atlamak için Zaman Çizelgeleri penceresini kullanın. Zaman yolculuğu izlemesindeki olayları görsel olarak keşfetmek ve olay bağıntısını keşfetmek için birden çok zaman çizelgesi kullanın.
TTD izleme dosyasını açtığınızda Zaman Çizelgeleri penceresi görüntülenir. Veri modeli sorgularını el ile oluşturmak zorunda kalmadan önemli olayları gösterir. Aynı zamanda, daha karmaşık veri sorguları yapılmasına olanak tanımak için tüm zaman seyahat nesneleri kullanılabilir.
Zaman yolculuğu izleme dosyalarını oluşturma ve bunlarla çalışma hakkında daha fazla bilgi için bkz. Zaman Yolculuğu Hata Ayıklama: Genel Bakış.
Zaman çizelgesi türleri
Zaman Çizelgeleri penceresinde aşağıdaki zaman çizelgelerindeki olaylar gösterilir:
- Özel durumlar: Belirli bir özel durum koduna göre filtreleyebilirsiniz.
- Kesme noktaları: Kesme noktalarının zaman çizelgesine ne zaman isabet ettiğinizi görebilirsiniz.
- Bellek Erişimleri: İki bellek adresi arasında okuma, yazma ve yürütme işlemleri yapabilirsiniz.
-
İşlev Çağrıları: biçiminde
module!functionarama yapabilirsiniz.
Araç ipucu aracılığıyla daha fazla bilgi edinmek için her olayın üzerine gelin. Bir olay seçildiğinde olay için sorgu çalıştırılır ve daha fazla bilgi görüntülenir. Bir olaya çift tıklanması, TTD izleme dosyasında o konuma götürür.
Özel durumlar
bir izleme dosyası yüklediğinizde ve zaman çizelgesi etkin olduğunda, kayıttaki tüm özel durumlar otomatik olarak görüntülenir.
Kesme noktasının üzerine geldiğinizde, özel durum türü ve özel durum kodu gibi bilgiler görüntülenir.
İsteğe bağlı Özel Durum Kodu alanını kullanarak belirli bir özel durum kodunu daha fazla filtreleyebilirsiniz.
Belirli bir özel durum türü için yeni bir zaman çizelgesi de ekleyebilirsiniz.
Kesme nokta -ları
Kesme noktası ekledikten sonra, zaman çizelgesindeki konumlar bu kesme noktasına ne zaman isabet ettiğini gösterir. Örneğin, bp Kesme Noktasını Ayarla komutunu kullanabilirsiniz. Kesme noktasının üzerine geldiğinizde, adres ve kesme noktasıyla ilişkili yönerge işaretçisi görüntülenir.
Kesme noktası temizlendiğinde, ilişkili kesme noktası zaman çizelgesi otomatik olarak kaldırılır.
İşlev çağrıları
zaman çizelgesinde işlev çağrılarının konumlarını görebilirsiniz. Bu adımı gerçekleştirmek için, aramayı module!function biçiminde yapın.
TimelineTestCode!multiplyTwo bunun bir örneğidir. Joker karakterler de belirtebilirsiniz, örneğin, TimelineTestCode!m*.
Bir işlev çağrısının üzerine geldiğinizde işlev adı, giriş parametreleri, değerleri ve dönüş değeri görüntülenir. Bu örnek, arabellek ve boyutun DisplayGreeting!GetCppConGreeting için parametreler olduğunu gösterir.
Bellek erişimi
Belirli bir bellek aralığının ne zaman okunup yazıldığını veya kod yürütmenin nerede gerçekleştiğini görmek için Bellek Erişimleri zaman çizelgesini kullanın. Başlangıç ve durdurma adresleri, iki bellek adresi arasında bir aralık tanımlamak için kullanılır.
Bellek erişim öğesinin üzerine geldiğinizde değer ve yönerge işaretçisi görüntülenir.
Zaman çizelgeleriyle çalışma
Zaman çizelgesinin üzerine geldiğinizde imlecin ardından dikey gri bir çizgi gelir. Dikey mavi çizgi, izlemedeki geçerli konumu gösterir.
Zaman çizelgesini yakınlaştırmak ve uzaklaştırmak için büyüteç simgelerini seçin.
Üst zaman çizelgesi denetim alanında, zaman çizelgesinin görünümünü kaydırmak için dikdörtgeni kullanın. Geçerli zaman çizelgesi görünümünü yeniden boyutlandırmak için dikdörtgenin dış sınırlayıcılarını sürükleyin.
Fare hareketleri
Yakınlaştırmak ve uzaklaştırmak için Ctrl tuşunu seçip kaydırma tekerleğini kullanın.
Yan yana kaydırmak için Shift'i seçin ve kaydırma tekerleğini kullanın.
Zaman çizelgesi hata ayıklama teknikleri
Zaman çizelgesi tekniklerinde hata ayıklamayı göstermek için , Zaman Yolculuğu Hata Ayıklama kılavuzu burada yeniden kullanılır. Bu gösterimde, örnek kodu derlemek için ilk iki adımı tamamladığınız ve burada açıklanan ilk iki adımı kullanarak TTD kaydını oluşturduğunuz varsayılır.
Bu senaryoda ilk adım, zaman yolculuğu izindeki istisnayı bulmaktır. Zaman çizelgesinde gördüğünüz tek özel duruma çift tıklayın.
Komut penceresinde, özel durumu seçtiğinizde aşağıdaki komutun verildiğini görebilirsiniz.
(2dcc.6600): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: CC:0
@$curprocess.TTD.Events.Where(t => t.Type == "Exception")[0x0].Position.SeekTo()
Araştırmanıza başlamak için zaman çizelgesinde bu noktadaki kayıtları görüntülemek içinKayıtları> seçin.
Komut çıkışında, yığın (esp) ve temel işaretçi (ebp) farklı adresleri işaret eder. Bu tutarsızlık yığın bozulmasına işaret edebilir. Büyük olasılıkla, bir işlev döndürülür ve sonra yığını bozar. Bu sorunu doğrulamak için CPU durumu bozulmadan önceki zamana geri dönün ve yığın bozulmasının ne zaman gerçekleştiğini belirleyip belirleyemediğinizi kontrol edin.
Bu işlemi gerçekleştirdiğinizde yerel değişkenlerin ve yığının değerlerini inceleyin:
- Yerel değerleri görüntülemek içinYerel Öğeleri> seçin.
- Kod yürütmeyığınını görüntülemek için > seçin.
Hata noktasında, izleme sırasında hata işleme kodunda gerçek nedenin birkaç adım sonrasına ulaşılması yaygındır. Zaman yolculuğuyla, gerçek kök nedeni bulmak için her seferinde bir yönerge geri gidebilirsiniz.
Giriş şeridinde Geri Adımla komutunu kullanarak üç yönergeyi geri alın. Bu işlemi gerçekleştirdiğinizde Stack, Locals ve Registers pencerelerini incelemeye devam edin.
Komut penceresinde, üç yönerge geriye doğru ilerlediğinizde zaman yolculuğu konumu ve yazmaçlar görüntülenir.
0:000> t-
Time Travel Position: CB:41
eax=00000000 ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299
eip=00540020 esp=003cf7d0 ebp=00520055 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
00540020 ?? ???
0:000> t-
Time Travel Position: CB:40
eax=00000000 ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299
eip=00061767 esp=003cf7cc ebp=00520055 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
DisplayGreeting!main+0x57:
00061767 c3 ret
0:000> t-
Time Travel Position: CB:3A
eax=0000004c ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299
eip=0006175f esp=003cf718 ebp=003cf7c8 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000206
DisplayGreeting!main+0x4f:
0006175f 33c0 xor eax,eax
İzlemenin bu noktasında, yığınınız ve temel işaretçiniz daha anlamlı değerlere sahiptir. Kodda bozulmanın oluştuğu noktaya yaklaşıyorsunuz gibi görünüyor.
esp=003cf718 ebp=003cf7c8
Yerel Ayarlar penceresi, hedef uygulamanızdaki değerleri içerir. Kaynak kodu penceresi, izlemenin bu noktasında kaynak kodunuzda yürütülmeye hazır olan kod satırını vurgular.
Daha fazla araştırma yapmak için, yığın işaretçisi () esp adresinin yanındaki içeriği görüntülemek için bir Bellek penceresi açın. Bu örnekte değeri 003cf7c8'dir. Bu adreste depolanan ASCII metnini görüntülemek için Bellek>Metin>ASCII'yi seçin.
Bellek erişim zaman çizelgesi
İlgi çekici bir bellek konumu belirlendikten sonra, bellek erişim zaman çizelgesi eklemek için bu değeri kullanın.
+ Zaman çizelgesi ekle'yi seçin ve başlangıç adresini doldurun. 4 bayt'a bakın, böylece bunları Başlangıç Adresi değerine 003cf7c8eklediğinizde Bitiş Adresi değerine 003cf7cbsahip olursunuz. Varsayılan değer tüm bellek yazma işlemlerine bakmaktır, ancak bu adreste yalnızca yazma işlemlerine veya kod yürütmeye de bakabilirsiniz.
Artık bellek konumunun yazıldığı noktayı belirlemek amacıyla, bu zamanda seyahat izlemesinin hangi noktasına geri dönüp ne bulabileceğinizi görmek için zaman çizelgesini geriye doğru inceleyebilirsiniz. Zaman çizelgesinde bu konumu seçtiğinizde, yerel ayarların kopyalanan dize için farklı değerlere değerdiğini görebilirsiniz. Hedef değeri eksik görünüyor, sanki dizenizin uzunluğu doğru değilmiş gibi.
Kesme noktası zaman çizelgesi
Kesme noktalarını kullanmak, ilgi çekici bir durumda kod yürütmeyi duraklatmak için yaygın bir yaklaşımdır. TTD ile bir kesme noktası ayarlayabilir ve izleme kaydedildikten sonra bu kesme noktasına ulaşılana kadar zamanda geri gidebilirsiniz. Bir sorun oluştuktan sonra işlem durumunu inceleyebilme özelliği, kesme noktası için en iyi konumu belirlemek için TTD'ye özgü daha fazla hata ayıklama iş akışı sağlar.
Alternatif bir zaman çizelgesi hata ayıklama tekniğini keşfetmek için, zaman çizelgesinde özel durumu seçin ve Giriş şeridindeki Geri Adımla komutunu kullanarak bir kez daha üç adım geri dönün.
Bu küçük örnekte koda kolayca bakabilirsiniz. Yüzlerce kod satırınız ve onlarca alt kodunuz varsa, sorunu bulmak için gereken süreyi azaltmak için burada açıklanan teknikleri kullanın.
Daha önce belirtildiği gibi, temel işaretçi (esp) bir yönergeye işaret etmek yerine ileti metninizi işaret eder.
Bellek erişiminde ba bir kesme noktası ayarlamak için komutunu kullanın. Bu bellek alanının ne zaman yazıldığında görmek için bir w - yazma kesme noktası ayarlarsınız.
0:000> ba w4 003cf7c8
Basit bir bellek erişim kesme noktası kullansanız da, kesme noktalarını daha karmaşık koşullu deyimler olacak şekilde oluşturabilirsiniz. Daha fazla bilgi için bkz. bp, bu, bm (Kesme Noktasını Ayarla).
Giriş menüsünde, kesme noktasına isabet edene kadar zamanda geri gitmek için Geri Git'i seçin.
Bu noktada, hangi kodun etkin olduğunu görmek için program yığınını inceleyebilirsiniz.
Microsoft tarafından sağlanan wscpy_s() işlevinin böyle bir kod hatasına sahip olma olasılığı düşük olduğundan, yığın içinde daha fazla araştırın. Yığın, Greeting!main'ün Greeting!GetCppConGreeting'i çağırdığını gösteriyor. Küçük kod örneğinizde kodu bu noktada açabilir ve büyük olasılıkla hatayı kolayca bulabilirsiniz. Ancak daha büyük, daha karmaşık bir programla kullanabileceğiniz teknikleri göstermek için bir işlev çağrısı zaman çizelgesi eklersiniz.
İşlev çağrısı zaman çizelgesi
+ Zaman çizelgesi ekle'yi seçin ve işlev arama dizesini doldurun.
Başlangıç Konumu ve Bitiş Konumu onay kutuları, izlemedeki bir işlev çağrısının başlangıcını ve sonunu gösterir.
İşlev çağrısının başlangıç konumuna ve bitiş konumuna karşılık gelen ilişkili dx ve TimeStart alanları görmek üzere işlev çağrısı nesnesini görüntülemek için komutunu kullanabilirsinizTimeEnd.
dx @$cursession.TTD.Calls("DisplayGreeting!GetCppConGreeting")[0x0]
EventType : 0x0
ThreadId : 0x6600
UniqueThreadId : 0x2
TimeStart : 6D:BD [Time Travel]
SystemTimeStart : Thursday, October 31, 2019 23:36:05
TimeEnd : 6D:742 [Time Travel]
SystemTimeEnd : Thursday, October 31, 2019 23:36:05
Function : DisplayGreeting!GetCppConGreeting
FunctionAddress : 0x615a0
ReturnAddress : 0x61746
Parameters
Başlangıç Konumu veya Bitiş Konumu onay kutularından biri veya Başlangıç Konumu ve Bitiş Konumu onay kutularının her ikisi de seçilmelidir.
Kodunuz özyinelemeli veya yeniden girilebilir değil, bu yüzden GetCppConGreeting yöntemi çağrıldığında zaman çizelgesinde kolayca bulunabilir.
GetCppConGreeting çağrısı, kesme noktanız ve tanımladığınız bellek erişim olayıyla aynı anda gerçekleşir. Bu nedenle, uygulama kilitlenmesinin kök nedenini dikkatlice incelemek amacıyla belirli bir kod alanına odaklanmış gibisiniz.
Birden çok zaman çizelgesini görüntüleyerek kod yürütmeyi keşfetme
Kod örneğimiz küçük olsa da, birden çok zaman çizelgesi kullanma tekniği, bir zaman yolculuğu izlemesinin görsel keşfini sağlar. İzleme dosyasına bakarak "Kesme noktasına ulaşmadan önce bellek alanına ne zaman erişilir?" gibi sorular sorabilirsiniz.
Daha fazla ilişki görme ve beklenmedik şeyler bulma yeteneği, zaman çizelgesi aracını, komut satırı komutlarını kullanarak zaman yolculuğu izlemesiyle etkileşime girmekten ayırt eder.
Zaman Çizelgesi Yer İşaretleri
Konumu elle kopyalayıp Not Defteri'ne yapıştırmak yerine, WinDbg'de önemli zaman yolculuğu konumlarını işaretleyin. Yer işaretleri, izlemedeki diğer olaylara göre farklı konumları bir bakışta görüntülemeyi ve bunlara ek açıklama eklemeyi kolaylaştırır.
Yer işaretleri için açıklayıcı bir ad sağlayabilirsiniz.
Görüntüle>Zaman Çizelgesini seçerek Zaman Çizelgeleri penceresini açın, böylece Yer İşaretleri zaman çizelgesine erişebilirsiniz. Yer işaretinin üzerine geldiğinizde yer işareti adı görüntülenir.
Yer işareti konumuna gitmek için yer işaretine sağ tıklayın, yer işaretini yeniden adlandırın veya silin.
Uyarı
Yer işareti özelliği WinDbg'nin 1.2402.24001.0 sürümünde kullanılamaz.