WinDbg: Zaman Çizelgeleri

Bitleri inceleyen bir büyüteç içeren WinDbg logosu, .

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.

Özel durumları, bellek erişimini, kesme noktalarını ve işlev çağrılarını görüntüleyen hata ayıklayıcıdaki zaman çizelgelerinin ekran görüntüsü.

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

Hata ayıklayıcıda belirli bir özel durum koduyla ilgili bilgiler içeren özel durumları görüntüleyen zaman çizelgesinin ekran görüntüsü.

İsteğe bağlı Özel Durum Kodu alanını kullanarak belirli bir özel durum kodunu daha fazla filtreleyebilirsiniz.

Özel Durumlar olarak ayarlanmış Zaman Çizelgesi Türü ve 0xC0000004 olarak ayarlanmış Özel Durum Kodu ile zaman çizelgesi hata ayıklayıcısı özel durum diyalog kutusunun ekran görüntüsü.

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.

Hata ayıklayıcıda yaklaşık 30 kesme noktası göstergesi görüntüleyen zaman çizelgesinin ekran görüntüsü.

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

Hata ayıklayıcıya işlev çağrısı adı girilmiş bir zaman çizelgesi ekleme işleminin ekran görüntüsü.

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.

Bir hata ayıklayıcıda işlev çağrılarını ve Yazmaçlar penceresini gösteren bir zaman çizelgesinin ekran görüntüsü.

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.

Yazma seçeneğinin seçili olduğu Bellek Erişimleri iletişim kutusu ekleme işleminin ekran görüntüsü.

Bellek erişim öğesinin üzerine geldiğinizde değer ve yönerge işaretçisi görüntülenir.

Hata ayıklayıcıda bellek erişim olaylarını görüntüleyen zaman çizelgesinin ekran görüntüsü.

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.

Etkin görünümü seçmek için kullanılan üst alanı gösteren hata ayıklayıcıdaki zaman çizelgesinin ekran görüntüsü.

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.

Debugger'daki zaman çizelgesinin ekran görüntüsü, demo laboratuvarı hatasını ve Yazmaçlar penceresini gösteriyor.

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.

Yazmaçlar, Yığın ve Bellek pencerelerini görüntüleyen hata ayıklayıcının ekran görüntüsü.

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.

Yazma seçeneği seçili ve başlangıç değeri 003cf7c8 olan bir zaman çizelgesi bellek erişimi iletişim kutusu ekleme işleminin ekran görüntüsü.

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.

Farklı kaynak ve hedef değerlerine sahip yerel değerleri görüntüleyen bellek erişim zaman çizelgesinin ve Yereller penceresinin ekran görüntüsü.

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.

Hata ayıklayıcıda Bellek erişim zaman çizelgelerini ve Yığın pencerelerini gösteren zaman çizelgesinin ekran görüntüsü.

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.

DisplayGreeting!GetCppConGreeting işlev arama dizesiyle İşlev Çağrıları zaman çizelgesinin eklenmesini gösteren Yeni Zaman Çizelgesi Ekle iletişim kutusunun ekran görüntüsü.

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.

Hata ayıklayıcıda bellek erişim zaman çizelgesini ve farklı dize değerleri içeren bir ileti ve arabelleğe sahip Yereller penceresini görüntüleyen zaman çizelgesinin ekran görüntüsü.

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.

Bellek Erişimleri zaman çizelgesini ve Yerel Ayarlar penceresini görüntüleyen hata ayıklayıcıdaki zaman çizelgesinin ekran görüntüsü.

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.

Selamlama Ekranı uygulamasındaki ilk API çağrısı için örnek adın gösterildiği Yeni Yer İmi iletişim kutusunun ekran görüntüsü.

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.

Zaman çizelgesinde üç yer işaretinin görüntülendiği ekran görüntüsü ve imleç, yer işareti adını göstermek için birinin üzerine geliyor.

Yer işareti konumuna gitmek için yer işaretine sağ tıklayın, yer işaretini yeniden adlandırın veya silin.

Konuma git, düzenle ve kaldır seçeneklerini gösteren Yer İşaretleri sağ tıklama açılır menüsünün ekran görüntüsü.

Uyarı

Yer işareti özelliği WinDbg'nin 1.2402.24001.0 sürümünde kullanılamaz.