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.
Hata ayıklayıcı yükleme ve kurulum
Bazı Uygulama Doğrulayıcı eylemleri özel durum oluşturmayla sonuçlanabilir. Uygulama Doğrulayıcı'nın kendisi ilk şans özel durumlarını işleyecek olduğundan, hata ayıklayıcının ikinci şansta bu özel durumları yakalayacak şekilde ayarlanması gerekir.
Oluşturulan özel durumlar üç türdedir:
Yığın seçeneği yığın arabellek taşması algılarsa erişim ihlali özel durumu (0xC0000005) oluşturulur. Bazı durumlarda, Sistem yolu kullanımını denetle seçeneği de erişim ihlaline neden olabilir.
Geçersiz tanıtıcı kullanımını algıla seçeneği geçersiz tanıtıcı işlemi algıladığında geçersiz tanıtıcı özel durumu (0xC0000008) oluşturulur.
Yeterli yığını denetle seçeneği ilk yığının çok kısa olduğunu algıladığında bir yığın taşması özel durumu (0xC00000FD) oluşturulur.
Bu olaylara hazırlanmanın bir yolu, hata ayıklayıcısını bir komut satırında aşağıdaki gibi başlatmaktır:
windbg -xd av -xd ch -xd sov ApplicationCommandLine
veya
cdb -xd av -xd ch -xd sov ApplicationCommandLine
Hata ayıklayıcıyı zaten başlattıysanız, tüm erişim ihlallerini, geçersiz tanıtıcıları ve yığın taşmalarını ikinci şans özel durumları olarak yakalamak için sxd (Özel Durumları Ayarla) komutunu kullanabilirsiniz:
0:000> sxd av
0:000> sxd ch
0:000> sxd sov 1
Uygulama Doğrulayıcı'yı bir çekirdek hata ayıklayıcısı aracılığıyla teorik olarak denetlemek mümkündür. Ancak bu önerilmez; .process ve .pagein komutlarının sık kullanılmasını gerektirir, ancak kullanıcı modu hata ayıklayıcı kullanmaktan daha fazla güç vermez.
Hata ayıklama araçlarını yükleme
Araçların en son sürümünü indirmek için bkz. Windows için Hata Ayıklama Araçlarını İndirme.
User-Mode Hata Ayıklama için Donanımın Yapılandırılması
Kullanıcı modu hata ayıklaması genellikle tek bir makinede yapılır: hata ayıklayıcı, başarısız olan uygulamayla aynı bilgisayarda çalıştırılır.
Bu durumda, belirli bir donanım kurulumu gerekmez. Bu konu başlığı boyunca, konak bilgisayar ve hedef bilgisayar terimleri bu durumda birbirinin yerine kullanılabilir.
User-Mode Hata Ayıklama için Yazılım Yapılandırma
Temel User-Mode Yapılandırması - Kullanıcı modu hata ayıklamaya başlayabilmeniz için önce gerekli sembol dosyalarını indirmeniz ve belirli ortam değişkenlerini ayarlamanız gerekir.
Sembol Dosyaları
Hata ayıklanan kullanıcı modu işlemi için sembol dosyalarını indirmeniz gerekir. Eğer bu yazdığınız bir uygulamaysa, tüm sembol dosyalarıyla derlenmelidir. Ticari bir uygulamaysa, sembol dosyaları bir web sunucusunda bulunabilir veya indirilebilir, bu durumda üreticiye başvurun.
uzaktan hata ayıklama gerçekleştiriyorsanız, sembol dosyası konumu kullandığınız yönteme bağlıdır:
Hata ayıklayıcı aracılığıyla uzaktan hata ayıklama gerçekleştiriyorsanız, sembol dosyaları hata ayıklama sunucusuyla birlikte bilgisayarda olmalıdır.
remote.exearacılığıyla uzaktan hata ayıklama gerçekleştiriyorsanız, sembol dosyalarının hata ayıklayıcıyla birlikte bilgisayarda olması gerekir.
Bir işlem sunucusu veya KD bağlantı sunucusu aracılığıyla uzaktan hata ayıklama gerçekleştiriyorsanız, sembol dosyaları akıllı istemciye sahip bilgisayarda olmalıdır.
Çekirdek hata ayıklayıcısından kullanıcı modu hata ayıklayıcısını kontrol ediyorsanız, sembol dosyalarının her iki bilgisayarda da olması gerekir.
Ortam Değişkenlerini Yapılandırma
Hata ayıklayıcı, bir dizi önemli ayarı belirtmek için çeşitli ortam değişkenlerini kullanır.
Hata ayıklayıcılar hakkında daha fazla bilgi için bkz. Windows Hata Ayıklama ile Çalışmaya Başlama
Komut satırını kullanarak Hata Ayıklayıcı ile Uygulama Doğrulayıcıyı Yapılandırma
Uygulama Doğrulayıcısı'nı yapılandırmak için CDB veya NTSD komut satırını kullanabilirsiniz.
Aşağıdaki komut satırını kullanın:
cdb OtherOptions -vf:Flags Target
Burada Hedef, hedef uygulamanın adıdır ve Bayraklar bu hedefe uygulanacak istenen Uygulama Doğrulayıcı seçeneklerini belirtir.
Bayraklar, istenen seçenekleri temsil eden bitlerin toplamı olmalıdır. Tek tek bit değerleri aşağıdaki gibidir:
| Bayrak değeri | Anlamı |
|---|---|
| 00000001 | Yığın Denetimleri |
| 00000004 | KONTROLLERİ İŞLEME |
| 00000008 | DÜŞÜK KAYNAKLI SIM DENETİMLERİ |
| 00000020 | TLS DENETIMLERI |
| 00000040 | KIRLI YIĞINLAR |
| 00000200 | TEHLİKELİ API'ler |
| 00001000 | İSTİSNA KONTROLLERİ |
| 00002000 | BELLEK DENETİMİ |
| 00020000 | ÇEŞITLI DENETIMLER |
| 00040000 | KİLİT DENETİMLERİ |
!avrf ile hata ayıklama
!avrf uzantısı, Uygulama Doğrulayıcı ayarlarını denetler ve Uygulama Doğrulayıcı tarafından üretilen çeşitli çıktıları görüntüler. !arvrf uzantısı hakkında ek bilgi için hata ayıklayıcı belgelerindeki !avrf bölümüne bakın.
Sözdizimi
!avrf
Parametre kullanılmadan çalıştırılan !avrf komutu, Uygulama Doğrulayıcı ayarlarını ve varsa geçerli ve önceki Uygulama Doğrulayıcı kesmeleri hakkındaki bilgileri gösterir.
!avrf –vs { Length | -aAddress }
Sanal alan işlem günlüğünü görüntüler. Uzunluk, en son kayıtlardan başlayarak görüntülenecek kayıt sayısını belirtir. Adres, sanal adresi belirtir. Bu sanal adresi içeren sanal işlemlerin kayıtları görüntülenir.
!avrf -hp { Length | -a Address }
Yığın işlemi günlüğünü görüntüler. Adres yığın adresini belirtir. Bu yığın adresini içeren yığın işlemlerinin kayıtları görüntülenecek.
!avrf -cs { Length | -a Address }
Kritik bölüm silme günlüğünü görüntüler. Uzunluk, en son kayıtlardan başlayarak görüntülenecek kayıt sayısını belirtir. Adres, kritik bölüm adresini belirtir. Adres belirtildiğinde, belirli bir kritik bölümün kayıtları görüntülenir.
!avrf -dlls [ Length ]
DLL yükleme/kaldırma günlüğünü görüntüler. Uzunluk, en son kayıtlardan başlayarak görüntülenecek kayıt sayısını belirtir.
!avrf -trm
Sonlandırılan ve askıya alınan tüm iş parçacıklarının izleme kaydını görüntüler.
!avrf -ex [ Length ]
Özel durum günlüğünü görüntüler. Uygulama Doğrulayıcı, uygulamada gerçekleşen tüm özel durumları izler.
!avrf -threads [ ThreadID ]
Hedef işlemdeki iş parçacıkları hakkındaki bilgileri görüntüler. Alt iş parçacıkları için, üst iş parçacığı tarafından belirtilen yığın boyutu ve CreateThread bayrakları da gösterilir. İş parçacığı kimliğinin sağlanması yalnızca söz konusu iş parçacığının bilgilerini görüntüler.
!avrf -tp [ ThreadID ]
İş parçacığı havuzu günlüğünü görüntüler. Bu günlük, iş parçacığı aidiyet maskesini değiştirme, iş parçacığı önceliğini değiştirme, iş parçacığı iletileri gönderme, COM başlatma ve iş parçacığı havuzu geri çağırmasından COM'u sonlandırma gibi çeşitli işlemler için yığın izlemeleri içerebilir. İş parçacığı kimliğinin sağlanması yalnızca söz konusu iş parçacığının bilgilerini görüntüler.
!avrf -srw [ Address | Address Length ] [ -stats ]
İnce Okuyucu/Yazıcı (SRW) günlüğünü görüntüler. Adres belirtilmesi, bu SRW kilit adresiyle ilgili kayıtları görüntüler. Uzunluk, Adres ile birlikte belirtildiğinde, bu adres aralığındaki tüm SRW kilitleri görüntülenir. -stats seçeneği SRW kilit istatistiklerini döküm eder.
!avrf -leak [ -m ModuleName ] [ -r ResourceType ] [ -a Address ] [ -t ]
Açıkta kalan kaynaklar günlüğünü görüntüler. Bu kaynaklar belirli bir noktada sızıntı olabilir veya olmayabilir. ModuleName belirtildiğinde (uzantı dahil) belirtilen modüldeki tüm tamamlanmamış kaynakları görüntüler. ResourceType belirtilmesi, söz konusu kaynak türüne ait belirgin kaynakları görüntüler. Adres Belirtilmesi, o adresle ilgili açık kaynakların kayıtlarını çıkarır. ResourceType aşağıdakilerden biri olabilir:
- Yığın: Win32 Yığın API'lerini kullanarak yığın ayırmalarını görüntüler
- Yerel: Yerel/Genel tahsisatları görüntüler
- CRT: CRT API'lerini kullanarak tahsisatları görüntüler
- Sanal: Sanal rezervasyonları görüntüler
- BSTR: BSTR ayırmalarını görüntüler
- Kayıt Defteri: Kayıt defteri anahtarının açıldığını görüntüler
- Güç: Güç bildirimi nesnelerini görüntüler
- Handle: İş parçacığı, dosya ve olay tanıtıcı ayırmalarını görüntüler
!avrf –trace TraceIndex
Belirtilen izleme dizini için yığın izlemesini görüntüler. Bazı yapılar, yığın izlemesini tanımlamak için bu 16 bit dizin numarasını kullanır. Bu dizin, yığın izleme veritabanındaki bir konuma işaret etmektedir. Böyle bir yapıyı analiz ediyorsanız, bu sözdizimini yararlı bulacaksınız.
!avrf -cnt
Genel sayaçların listesini görüntüler.
!avrf -brk [ BreakEventType ]
Bunun bir break-event komutu olduğunu belirtir.
!avrf -brk Ek parametre olmadan kullanıldığında, kesme olayı ayarları görüntülenir. BreakEventType, kesme olayının tür numarasını belirtir. Olası türlerin listesi için kullanın !avrf -brk.
!avrf -flt [ EventTypeProbability ]
Bunun bir hata enjeksiyonu komutu olduğunu belirtir.
!avrf -flt Ek parametre olmadan kullanıldığında geçerli hata ekleme ayarları görüntülenir. EventType, olayın tür numarasını belirtir. Olasılık, olayın başarısız olma sıklığını belirtir. Bu, 0 ile 1.000.000 (0xF4240) arasındaki herhangi bir tamsayı olabilir.
!avrf -flt break EventType
Uygulama Doğrulayıcı'nın hata ayıklayıcıya her seferinde bu hata enjekte edildiğinde girmesine neden olur.
!avrf -flt stacks Length
En son hata eklenen işlemler için yığın izlemelerinin Uzunluk sayısını görüntüler.
!avrf -trg [ StartEnd | dll Module | all ]
Bunun bir hedef aralık komutu olduğunu belirtir. -trg ek parametre olmadan kullanıldığında geçerli hedef aralıklar görüntülenir. Başlangıç, hedef aralığın veya dışlama aralığının başlangıç adresini belirtir. End, hedef aralığın veya dışlama aralığının bitiş adresini belirtir. Modül, hedeflenecek veya dışlanacak modülün adını belirtir. Modül, .exe veya .dll uzantısı dahil olmak üzere tam modül adını içermelidir. Yol bilgileri dahil edilmemelidir. Tümünün belirtilmesi tüm hedef aralıkların veya dışlama aralıklarının sıfırlanmasına neden olur.
!avrf -skp [ StartEnd | dll Module | all | Time ]
Bunun bir dışlama aralığı komutu olduğunu belirtir. Başlangıç, hedef aralığın veya dışlama aralığının başlangıç adresini belirtir. End, hedef aralığın veya dışlama aralığının bitiş adresini belirtir. Modül, hedeflenecek veya dışlanacak modülün adını belirtir. Modül, .exe veya .dll uzantısı dahil olmak üzere tam modül adını içermelidir. Yol bilgileri dahil edilmemelidir. Tümünün belirtilmesi tüm hedef aralıkların veya dışlama aralıklarının sıfırlanmasına neden olur. Zaman belirtilmesi, yürütme yeniden başlatıldıktan sonra Time milisaniye boyunca tüm hataların bastırılmasını sağlar.
Hata ayıklayıcıda !avrf komutu tarafından sağlanan çıkış aşağıda verilmiştir.
0:000> !avrf
Application verifier settings (816431A7):
- full page heap
- COM
- RPC
- Handles
- Locks
- Memory
- TLS
- Exceptions
- Threadpool
- Leak
- SRWLock
No verifier stop active.
Note: Sometimes bugs found by verifier manifest themselves as raised
exceptions (access violations, stack overflows, invalid handles),
and it is not always necessary to have a verifier stop.
!avrf uzantısı açıklamaları
!avrf uzantısı parametresiz kullanıldığında geçerli Uygulama Doğrulayıcı seçeneklerini görüntüler.
!avrf uzantısı hata ayıklayıcıdaki Exts.dll kullanır.
Bir Uygulama Doğrulayıcı Durağı oluştuysa, parametresiz !avrf uzantısı durdurmanın doğasını ve buna neyin neden olduğunu ortaya çıkaracaktır.
ntdll.dll ve verifier.dll simgeleri eksikse, !avrf uzantısı bir hata iletisi oluşturur.
Devam Eden ve Devam Edilemeyen Duraklar
Devam Edilebilir Durdurmada Hata Ayıklama
Burada, Geçersiz tanıtıcı kullanımını tespit et seçeneği tarafından tetiklenen geçersiz tanıtıcı özel durumu örneği verilmiştir.
İlk olarak aşağıdaki ileti görüntülenir:
Invalid handle - code c0000008 (first chance)
===================================================
VERIFIER STOP 00000300: pid 0x558: invalid handle exception for current stack trace
C0000008 : Exception code.
0012FBF8 : Exception record. Use .exr to display it.
0012FC0C : Context record. Use .cxr to display it.
00000000 :
===================================================
This verifier stop is continuable.
After debugging it use 'go' to continue.
===================================================
Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=6a27c280 ecx=6a226447 edx=0012fa4c esi=00942528 edi=6a27c260
eip=6a22629c esp=0012facc ebp=0012faf0 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
6a22629c cc int 3
İletinin size bu Uygulama Doğrulayıcı Durdurma işleminin devam edilebileceğini bildirdiğini görebilirsiniz. Neler olduğunu anladıktan sonra hedef uygulamayı çalıştırmaya devam edebilirsiniz.
İlk olarak !avrf uzantısını kullanmanız gerekir. Bu ifade, mevcut arıza hakkında bilgi verir.
0:000> !avrf
Global flags: 00000100
Application verifier global flag is set.
Application verifier settings (00000004):
- no heap checking enabled!
- handle checks
Page heap is not active for this process.
Current stop 00000300 : c0000008 0012fbf8 0012fc0c 00000000 .
Using an invalid handle (either closed or simply bad).
Bu ekranın son satırı sorunu özetler.
Bu noktada bazı günlüklere bakmak isteyebilirsiniz. İşiniz bittiğinde g (Go) komutunu kullanarak uygulamayı yeniden başlatın:
0:000> g
## Debugging a Non-Continuable Stop
Here is an example of an access violation that has been raised by the page heap option.
First, the following message appears:
Access violation - code c0000005 (first chance)
===================================================
VERIFIER STOP 00000008: pid 0x504: exception raised while verifying block header
00EC1000 : Heap handle
00F10FF8 : Heap block
00000000 : Block size
00000000 :
===================================================
This verifier stop is not continuable. Process will be terminated when you use the 'go' debugger command.
===================================================
Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=6a226447 edx=0012fab7 esi=00f10ff8 edi=00000008
eip=6a22629c esp=0012fb5c ebp=0012fb80 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
6a22629c cc int 3
Bu durumda, ileti size bu Uygulama Doğrulayıcı Durdurma işleminin devam edemeyeceğini bildirir. Hata, işlemin çalışmaya devam etmesi için çok ciddidir ve Uygulama Doğrulayıcı'nın işlemi kurtarmasının bir yolu yoktur.
!avrf uzantısı geçerli hata hakkında bilgi vermek için kullanılabilir:
0:000> !avrf
Global flags: 02000100
Application verifier global flag is set.
Page heap global flag is set.
Application verifier settings (00000001):
- full page heap
Page heaps active in the process (format: pageheap, lightheap, flags):
00941000 , 00a40000 , 3 (pageheap traces )
00b41000 , 00c40000 , 3 (pageheap traces )
00cb1000 , 00db0000 , 3 (pageheap traces )
00ec1000 , 00fc0000 , 3 (pageheap traces )
Current stop 00000008 : 00ec1000 00f10ff8 00000000 00000000 .
Corrupted heap block.
Bu ekranın son satırı sorunu özetler.
Bu noktada bazı günlüklere de bakmak isteyebilirsiniz. Bu noktada .restart (Hedef Uygulamayı Yeniden Başlat) komutunu kullanmak isteyebilirsiniz. Ya da uygulama doğrulayıcı oturumunuzu sonlandırmayı ve kodunuzdaki hataları düzeltmeye başlamayı tercih edebilirsiniz.
Kritik Bölüm Hatalarını Ayıklama
!cs hata ayıklayıcısı uzantısı
!cs, geçerli işlemdeki kritik bölümler hakkındaki bilgileri görüntülemek için hem kullanıcı modu hata ayıklayıcısında hem de çekirdek hata ayıklayıcısında kullanılabilir. !cs uzantısı hakkında ek bilgi için hata ayıklayıcı belgelerindeki !cs dosyasına bakın.
Özellikle ntdll.dlliçin tür bilgileriyle eşleşen semboller gereklidir.
Bu uzantının söz dizimi şöyledir:
!cs [-s] - Geçerli işlemdeki tüm etkin kritik bölümleri listeler.
!cs [-s] adres - bu adresteki kritik bölümün dökümü.
!cs [-s] -d adresi - bu adreste DebugInfo'ya karşılık gelen kritik bölgeyi dök.
-s, varsa kritik bölüm başlatma yığın izinin dökümünü alır.
Örnekler:
Kritik bölümün adresini kullanarak bilgi dökümü oluşturma
0:001> ! cs 0x7803B0F8
Critical section = 0x7803B0F8 (MSVCRT!__app_type+0x4)
DebugInfo = 0x6A262080
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
Kritik bir bölüm hakkındaki bilgileri adresi kullanılarak ve başlatma yığını izlemesi de dahil olmak üzere döküm yapın.
0:001> !cs -s 0x7803B0F8
Critical section = 0x7803B0F8 (MSVCRT!__app_type+0x4)
DebugInfo = 0x6A262080
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
Stack trace for DebugInfo = 0x6A262080:
0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE5
Hata ayıklama bilgileri adresini kullanarak kritik bir bölümle ilgili bilgi dökümü
0:001> !cs -d 0x6A262080
DebugInfo = 0x6A262080
Critical section = 0x7803B0F8 (MSVCRT!__app_type+0x4)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
Hata ayıklama bilgisi adresini kullanarak, başlatma yığını izleme bilgisi de dahil, kritik bir bölüm hakkında bilgi dökümü.
0:001> !cs -s -d 0x6A262080
DebugInfo = 0x6A262080
Critical section = 0x7803B0F8 (MSVCRT!__app_type+0x4)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
Stack trace for DebugInfo = 0x6A262080:
0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE
Geçerli işlemdeki tüm etkin kritik bölümler hakkında bilgi dökümü
0:001> !cs
-----------------------------------------
DebugInfo = 0x6A261D60
Critical section = 0x6A262820 (ntdll!RtlCriticalSectionLock+0x0)
LOCKED
LockCount = 0x0
OwningThread = 0x460
RecursionCount = 0x1
LockSemaphore = 0x0
SpinCount = 0x0
-----------------------------------------
DebugInfo = 0x6A261D80
Critical section = 0x6A262580 (ntdll!DeferedCriticalSection+0x0)
NOT LOCKED
LockSemaphore = 0x7FC
SpinCount = 0x0
-----------------------------------------
DebugInfo = 0x6A262600
Critical section = 0x6A26074C (ntdll!LoaderLock+0x0)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
.....
Başlatma yığını izleme dahil olmak üzere geçerli işlemdeki tüm etkin kritik bölümler hakkında bilgi dökümü
0:001> !cs -s
...
-----------------------------------------
DebugInfo = 0x6A261EA0
Critical section = 0xA8001C (+0xA8001C)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
No stack trace saved
-----------------------------------------
DebugInfo = 0x6A261EC0
Critical section = 0x6A263560 (ntdll!RtlpDphTargetDllsLock+0x0)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
No stack trace saved
-----------------------------------------
DebugInfo = 0x6A261EE0
Critical section = 0xA90608 (+0xA90608)
NOT LOCKED
LockSemaphore = 0x7EC
SpinCount = 0x0
Stack trace for DebugInfo = 0x6A261EE0:
0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A20B0DC: ntdll!CsrpConnectToServer+0x1BE
0x6A20B2AA: ntdll!CsrClientConnectToServer+0x148
0x77DBE83F: KERNEL32!BaseDllInitialize+0x11F
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE5
-----------------------------------------
DebugInfo = 0x6A261F00
Critical section = 0x77E1AEB8 (KERNEL32!BaseDllRegistryCache+0x18)
NOT LOCKED
LockSemaphore = 0x0
SpinCount = 0x0
Stack trace for DebugInfo = 0x6A261F00:
0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE5
Hata Ayıklama Özel Durum Hataları
Özel durum günlüğü, hedef işlemde oluşan tüm özel durumları kaydeder.
Son birkaç özel durumu görüntülemek için !avrf -ex Length uzantısı komutunu kullanabilirsiniz; Uzunluk, özel durum sayısını belirtir. Uzunluk belirtilmezse, tüm özel durumlar görüntülenir.
Aşağıda bir örnek verilmiştir:
0:000> !avrf -ex 4
=================================
Thread ID: 0000052c
Exception code: c0000008
Exception address: 6a226663
Exception record: 0012fb50
Context record: 0012fb64
Displayed 1 exception log entries.
Hata Ayıklama Hataları Yönetir
!htrace, işlemdeki bir veya tüm tanıtıcıların yığın izleme bilgilerini görüntülemek için hem kullanıcı modu hata ayıklayıcısında hem de çekirdek hata ayıklayıcısında kullanılabilir. Tanıtıcı izleme işlem için etkinleştirilirse bu bilgiler kullanılabilir; uygulama doğrulayıcıda tanıtıcı denetimi etkinleştirilmişse otomatik olarak etkinleştirilir. Yığın izlemeleri, işlem bir tanıtıcıyı her açtığında veya kapattığında ya da geçersiz bir tanıtıcıya başvurduğunda kaydedilir. !htrace uzantısı hakkında ek bilgi için hata ayıklayıcı belgelerindeki !htrace bölümüne bakın.
Bu uzantı için çekirdek hata ayıklayıcısı söz dizimi şöyledir:
!htrace [ handle [process] ]
Tanıtıcı belirtilmezse veya 0 ise, işlemdeki tüm tanıtıcılarla ilgili bilgiler görüntülenir. İşlem belirtilmezse geçerli işlem kullanılır.
Kullanıcı modu hata ayıklayıcısı söz dizimi şöyledir:
!htrace [handle]
Kullanıcı modu hata ayıklayıcısı uzantısı her zaman geçerli hata ayıklama işlemiyle ilgili bilgileri görüntüler.
Örnekler:
815328b0 işlemindeki tanıtıcı 7CC hakkındaki döküm bilgileri
kd> !htrace 7CC 815328b0
Loaded \\...\kdexts extension DLL
Process 0x815328B0
ObjectTable 0xE15ECBB8
--------------------------------------
Handle 0x7CC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x77DBFCD6: KERNEL32!GetLocaleFileInfo+0x3D
0x77DBF942: KERNEL32!NlsProcessInitialize+0x11D
0x77E0C6DF: KERNEL32!NlsDllInitialize+0x35
0x6A20785C: ntdll!LdrpCallInitRoutine+0x14
0x6A205393: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DD80: ntdll!LdrpInitializeProcess+0xAF6
--------------------------------------
Handle 0x7CC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3180: ntoskrnl!ObpCreateHandle+0x304
0x801E1563: ntoskrnl!ObOpenObjectByName+0x1E9
0x77DBFCD6: KERNEL32!GetLocaleFileInfo+0x3D
0x77DBF942: KERNEL32!NlsProcessInitialize+0x11D
0x77E0C6DF: KERNEL32!NlsDllInitialize+0x35
0x6A20785C: ntdll!LdrpCallInitRoutine+0x14
0x6A205393: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DD80: ntdll!LdrpInitializeProcess+0xAF6
--------------------------------------
Parsed 0x1CA stack traces.
Dumped 0x2 stack traces.
815328b0 işlemindeki tüm tanıtıcılar hakkında döküm verileri
kd> !htrace 0 81400300
Process 0x81400300
ObjectTable 0xE10CCF60
--------------------------------------
Handle 0x7CC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7CC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE23B2: KERNEL32!CreateSemaphoreA+0x66
0x010011C5: badhandle!main+0x45
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - BAD REFERENCE:
0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
0x801902BE: ntoskrnl!NtSetEvent+0x6C
0x80154965: ntoskrnl!_KiSystemService+0xC4
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE265C: KERNEL32!CreateEventA+0x66
0x010011A0: badhandle!main+0x20
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Parsed 0x6 stack traces.
Dumped 0x5 stack traces.
Geçerli işlemdeki 7DC tutamacı hakkında bilgi dökümü
kd> !htrace 7DC
Process 0x81400300
ObjectTable 0xE10CCF60
--------------------------------------
Handle 0x7DC - BAD REFERENCE:
0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
0x801902BE: ntoskrnl!NtSetEvent+0x6C
0x80154965: ntoskrnl!_KiSystemService+0xC4
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE265C: KERNEL32!CreateEventA+0x66
0x010011A0: badhandle!main+0x20
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Parsed 0x6 stack traces.
Dumped 0x3 stack traces.
Yığın Hatalarını Ayıklama
Yığın doğrulayıcı hata ayıklama uzantısı
Yığın doğrulayıcı hata ayıklayıcısı uzantısı, !heap uzantısının (NT yığın hata ayıklayıcısı uzantısı) bir parçasıdır. !heap -? ile basit yardım alınabilir veya !heap -p -? ile daha kapsamlı . Geçerli uzantı, bir işlem için sayfa yığınının etkinleştirilip etkinleştirilmediğini algılamaz ve buna göre hareket eder. Şimdilik uzantı kullanıcısının sayfa yığınının etkinleştirildiğini bilmesi ve !heap -p ön ekli komutları kullanması gerekir. !htrace uzantısı hakkında ek bilgi için hata ayıklayıcı belgelerindeki !heap bölümüne bakın.
!heap -p
İşlemde oluşturulan tüm tam sayfa yığınlarının adreslerini döküm eder.
!heap -p -h ADDRESS-OF-HEAP
Tam sayfa yığınının tam dökümü ADDRESS-OF-HEAP'ta.
!heap -p -a ADDRESS
ADRES'te yığın bloğu olup olmadığını anlamaya çalışır. Bu değerin bloğun başlangıcının adresi olması gerekmez. Komut, bir bellek alanının doğası hakkında hiçbir ipucu yoksa kullanışlıdır.
Yığın işlemi günlüğü
Yığın işlemi günlüğü tüm yığın rutinlerini izler. Bunlar HeapAlloc, HeapReAlloc ve HeapFree'dir.
Uzantı komutunu kullanarak !avrf -hp Length son birkaç kaydı görüntüleyebilirsiniz; Uzunluk, kayıt sayısını belirtir.
Belirtilen Adresi etkileyen tüm yığın alanı işlemlerini görüntülemek için kullanabilirsiniz !avrf -hp -a Address . Ayırma işlemi için, Ayrılan yığın bloğunda Address değerinin bulunması yeterlidir. Ücretsiz bir işlem için bloğun başlangıcının tam adresi verilmelidir.
Günlükteki her girdi için aşağıdaki bilgiler görüntülenir:
- adlı yığın işlevi.
- Rutini çağıran iş parçacığının iş parçacığı kimliği.
- Çağrıda yer alan adres — bu, bir ayırma rutini tarafından döndürülen veya bir serbest bırakma rutinine geçirilen adrestir.
- Çağrıda yer alan bölgenin boyutu.
- Çağrının stack trace’i.
En son girdiler önce görüntülenir.
Bu örnekte, en son iki girdi görüntülenir:
0:001> !avrf -hp 2
alloc (tid: 0xFF4):
address: 00ea2fd0
size: 00001030
00403062: Prymes!_heap_alloc_dbg+0x1A2
00402e69: Prymes!_nh_malloc_dbg+0x19
00402e1e: Prymes!_malloc_dbg+0x1E
00404ff3: Prymes!_stbuf+0xC3
00401c23: Prymes!printf+0x43
00401109: Prymes!main+0xC9
00402039: Prymes!mainCRTStartup+0xE9
77e7a278: kernel32!BaseProcessStart+0x23
alloc (tid: 0xFF4):
address: 00ea07d0
size: 00000830
00403062: Prymes!_heap_alloc_dbg+0x1A2
00402e69: Prymes!_nh_malloc_dbg+0x19
00402e1e: Prymes!_malloc_dbg+0x1E
00403225: Prymes!_calloc_dbg+0x25
00401ad5: Prymes!__initstdio+0x45
00401f38: Prymes!_initterm+0x18
00401da1: Prymes!_cinit+0x21
00402014: Prymes!mainCRTStartup+0xC4
77e7a278: kernel32!BaseProcessStart+0x23
Tipik hata ayıklama senaryoları
Karşılaşılabilecek birkaç hata senaryosu vardır. Bazıları bütün resmi elde etmek için biraz dedektiflik işi gerektiriyor.
Erişilebilir olmayan sayfada erişim ihlali
Test edilen uygulama arabelleğin sonunun ötesine erişirse tam sayfa yığını etkinleştirildiğinde bu durum ortaya çıkar. Serbest bir bloğa dokunduğunda da meydana gelebilir. Özel durumun oluştuğu adresin niteliğini anlamak için şunları kullanmanız gerekir:
!heap –p –a ADDRESS-OF-AV
Bozuk blok iletisi
Bir ayırmanın (ayırma, kullanıcı ücretsiz, gerçek ücretsiz) ömrü boyunca birkaç dakika içinde sayfa yığını yöneticisi bloğun tüm dolgu desenlerine sahip olup olmadığını ve blok üst bilgisinin tutarlı verilere sahip olup olmadığını denetler. Bu durum geçerli değilse bir doğrulayıcı hatası alırsınız.
Blok bir tam sayfa yığın bloğuyse (örneğin, tüm ayırmalar için tam sayfa yığının aktif olduğundan eminseniz) bloğa ait özellikleri incelemek için «!heap –p –a ADDRESS» komutunu kullanabilirsiniz.
Eğer blok "hafif sayfa yığını bloğu" ise, blok başlığının başlangıç adresini bulmanız gerekir. Bildirilen adresin 30-40 bayt altına dökümünü alarak başlangıç adresini bulabilir ve blok üst bilgisi (ABCDAAAA, ABCDBBBB, ABCDAAA9, ABCDBBBA) için sihirli başlangıç/bitiş desenlerini arayabilirsiniz.
Başlık, hatayı anlamanız için gereken tüm bilgileri sağlar. Özellikle, sihirli desenler, bloğun allocate edilmiş mi yoksa boşta mı olduğunu, bir hafif sayfa yığını mı yoksa tam sayfa yığını bloğu mu olduğunu gösterir. Buradaki bilgilerin, rahatsız edici çağrıyla dikkatlice eşleşmesi gerekir.
Örneğin, heapFree'ye bir blok ve dört baytlık bir adresle çağrı yapılırsa, bozuk iletiyi alırsınız. Blok üst bilgisi iyi görünecektir, ancak üst bilginin sonundan sonraki ilk baytın (0xDCBAXXXX sihirli değerinden sonraki ilk bayt) çağrıda belirtilen adresten farklı bir adrese sahip olduğunu fark etmelisiniz.
Özel doldurma işaretçileri
Bellek yığını yöneticisi, kullanıcı tahsisini çekirdek işaretçileri olarak görünecek değerlerle doldurur. Bu durum, blok serbest olduğunda (doldurma değeri F0'dır) ve blok ayrıldığında ancak bloğun sıfırlanması istenmediğinde (doldurma değeri hafif sayfa yığını için E0 ve tam sayfa yığını için C0 olur). Sıfırlanmamış ayırmalar, malloc/new kullanıcıları için yaygındır. F0F0F0F0, E0E0E0E0 C0C0C0C0 gibi adreslerde okuma/yazma girişiminde bulunulduğu bir hata (erişim ihlali) varsa, büyük olasılıkla bu durumlardan birine ulaşmış olursunuz.
F0F0F0F0 adresinde yapılan okuma/yazma işlemi, bir bloğun serbest bırakıldıktan sonra kullanıldığı anlamına gelir. Ne yazık ki bu soruna hangi bloğun neden olduğunu bulmak için bazı dedektiflik çalışmalarına ihtiyacınız olacak. Hatanın yığın izlemesini almanız ve ardından yığındaki işlevlerin kodunu incelemeniz gerekir. Bunlardan biri, bir ayırmanın canlı olduğu hakkında yanlış bir varsayımda bulunabilir.
E0E0E0E0/C0C0C0C0 okuma/yazma, uygulamanın ayırmayı düzgün şekilde başlatmadığı anlamına gelir. Bunun için geçerli yığın izlemesindeki işlevlerin kod incelemesi de gerekir. Burada bu tür bir hata için bir örnek verilmiştir. Bir test işleminde, E0E0E0E0 adreste HeapFree kullanılırken erişim ihlali fark edildi. Testin bir yapı ayırdığı, düzgün şekilde başlatmadığı ve ardından nesnenin yıkıcısını çağırdığı ortaya çıktı. Belirli bir alan null olmadığından (içinde E0E0E0E0 olduğundan) üzerinde delete işlevini çağırdı.
Sayfa Yığını Teknik Ayrıntıları
Yığın bozulmalarını (taşmalar veya eksiltmeler) algılamak için AppVerifier, istenen belleği, ayrılan bellekten önce ve sonra ya yüksek korumalı sayfalarla ya da özel etiketlerle doldurarak belleğin tahsis biçimini değiştirir. AppVerifier bunu, doğrulanan işleme Verifier.dll'ı ekleyerek ve uygulamanın çağırdığı bazı Win32 Yığın API'lerini ilgili Verifier.dll API'lerine yönlendirerek yapar.
İstenen belleği tamamen yazılabilir olmayan sayfalarla doldurduğunda (TAM ayarı sayfa yığını özellikleri bölümünde etkinleştirilmiştir ve varsayılan ayardır), AppVerifier büyük miktarda sanal bellek kullanır, ancak taşma veya altına taşma oluştuğunda yığın bozulması olaylarının gerçek zamanlı olarak önbelleğe alınmasının avantajına sahiptir. Bu moddaki belleğin şu şekilde görüneceğini unutmayın: [AppVerifier Read-Only Yığın Sayfası (4k)] [Test altındaki Uygulama tarafından istenen bellek miktarı] veya bu [Test altındaki Uygulama tarafından istenen bellek miktarı] [AppVerifier Read-Only Yığın Sayfası (4k)].
Yığın denetimi, Backward özelliğine bağlı olarak ayırmanın başına veya sonuna bir koruma sayfası yerleştirir. Geri ayarı varsayılan değerde, yani False (Yanlış) olarak ayarlanırsa, arabellek taşmalarını yakalamak için tahsisin sonuna bir koruma sayfası yerleştirir. True olarak ayarlanırsa, arabellek alt sınır ihlallerini yakalamak için ayırmanın başına bir koruma sayfası yerleştirilir.
İstenen belleğe özel etiketler eklediğinizde (yığın özelliklerindeki "Tam" onay kutusunu temizleyerek etkinleştirildiğinde), AppVerifier bu belleği kontrol eder ve serbest bırakıldığını size bildirir. Bu tekniğin kullanılmasındaki temel sorun, bellek bozulmasının yalnızca bellek serbest bırakıldığında algılanacağı bazı durumlar olmasıdır (en az bellek bloğu miktarı 8 bayttır), bu nedenle 3 baytlık bir değişkende veya 5 baytlık bir taşma oluştuğunda hemen algılanmamasıdır.
Bir yetersiz akış olayında, Read-Only bir sayfaya yazma girişiminde bulunulacaktır. Bu bir özel durum tetikler. Bu özel durumun yalnızca hedef uygulama bir hata ayıklayıcı altında yürütülüyorsa yakalanabileceğini unutmayın. Tam sayfa yığın modunun, dolgu ve koruyucu sayfaları kullandığından bu hataları da algılayacağını aklınızda bulundurun. Hafif sayfa yığınını kullanmanızın nedeni, bilgisayarınızın tam sayfa yığınının yüksek bellek kısıtlamalarını tolere edememesidir.
Yoğun bellek kullanan uygulamalar için veya AppVerifier'ı uzun süreler (örneğin stres testi) kullanmak gerektiğinde performans düşüşü nedeniyle tam mod yerine normal (hafif) yığın testleri çalıştırmak daha iyidir. Ancak, bir sorunla karşılaşırsanız daha fazla araştırmak için tam sayfa yığınını açın.
Özel yığınlar (işletim sisteminin yığını uygulamasını atlayan bir yığın) kullanan uygulamalar, sayfa yığınının avantajlarından tam olarak yararlanamayabilir ve etkinleştiğinde düzgün çalışmayabilir.
Bellek Hatalarını Ayıklama
Bellek doğrulayıcı hata ayıklayıcısı uzantısı
Sanal alan işlem günlüğü, bir işlemin sanal alanını herhangi bir şekilde değiştiren tüm yordamları izler. Bunlar VirtualAlloc, VirtualFree, MapViewOfFile ve UnmapViewOfFile'dır.
Uzantı komutunu kullanarak !avrf -vs Length son birkaç kaydı görüntüleyebilirsiniz; Uzunluk, kayıt sayısını belirtir.
Belirtilen Adresi etkileyen tüm sanal alan işlemlerini görüntülemek için !avrf -vs -a Address kullanabilirsiniz. Bir tahsis için, ayrılan blokta Adres'in bulunması yeterlidir. Ücretsiz olarak, bölgenin başlangıcının tam adresi verilmelidir.
Günlükteki her girdi için aşağıdaki bilgiler görüntülenir:
- adlı işlev
- Rutini çağıran iş parçacığının kimliği
- Çağrıda yer alan adres — bu, bir ayırma işlevi tarafından döndürülen veya serbest bir işlevine geçirilen adrestir.
- Çağrıda yer alan bölgenin boyutu
- Bellek işleminin türü (AllocationType parametresi)
- İstenen koruma türü
- Çağrının yığın izlemesi
Örnekler
En son girdiler önce görüntülenir.
Aşağıdaki örnekte, en son iki girdi görüntülenir:
0:001> !avrf -vs 2
VirtualFree (tid: 0xB4): addr:04bb0000 sz:00400000 op:8000 prot:0
00aa1ac2: verifier!VsLogCall+0x42
00aa19c1: verifier!AVrfpNtFreeVirtualMemory+0x30
68925d17: kernel32!VirtualFreeEx+0x35
6892611c: kernel32!VirtualFree+0x13
75ef6525: mshtml+0x116525
75ef68af: mshtml+0x1168AF
6a20787c: ntdll!LdrpCallInitRoutine+0x14
6a211c6f: ntdll!LdrUnloadDll+0x39A
689275c1: kernel32!FreeLibrary+0x3B
77b22d69: ole32!CoQueryReleaseObject+0x1E6
77b02bd2: ole32!SetErrorInfo+0x1ED
VirtualFree (tid: 0xB4): addr:04bb0000 sz:00001000 op:4000 prot:0
00aa1ac2: verifier!VsLogCall+0x42
00aa19c1: verifier!AVrfpNtFreeVirtualMemory+0x30
68925d17: kernel32!VirtualFreeEx+0x35
6892611c: kernel32!VirtualFree+0x13
75ef65ae: mshtml+0x1165AE
75ef68af: mshtml+0x1168AF
6a20787c: ntdll!LdrpCallInitRoutine+0x14
6a211c6f: ntdll!LdrUnloadDll+0x39A
689275c1: kernel32!FreeLibrary+0x3B
77b22d69: ole32!CoQueryReleaseObject+0x1E6
77b02bd2: ole32!SetErrorInfo+0x1ED
Çıkışın gösterdiği gibi, 0xB4 iş parçacığı önce bir sayfayı devre dışı bırakmış, ardından tüm sanal bölgeyi serbest bırakmıştır.
Adres 0x4BB1000 etkileyen tüm işlemlerin bir görüntüsü aşağıdadır:
0:001> !avrf -vs -a 4bb1000
Searching in vspace log for address 04bb1000 ...
VirtualFree (tid: 0xB4): addr:04bb0000 sz:00400000 op:8000 prot:0
00aa1ac2: verifier!VsLogCall+0x42
00aa19c1: verifier!AVrfpNtFreeVirtualMemory+0x30
68925d17: kernel32!VirtualFreeEx+0x35
6892611c: kernel32!VirtualFree+0x13
75ef6525: mshtml+0x116525
75ef68af: mshtml+0x1168AF
6a20787c: ntdll!LdrpCallInitRoutine+0x14
6a211c6f: ntdll!LdrUnloadDll+0x39A
689275c1: kernel32!FreeLibrary+0x3B
77b22d69: ole32!CoQueryReleaseObject+0x1E6
77b02bd2: ole32!SetErrorInfo+0x1ED
VirtualFree (tid: 0xB4): addr:04bb1000 sz:00001000 op:4000 prot:0
00aa1ac2: verifier!VsLogCall+0x42
00aa19c1: verifier!AVrfpNtFreeVirtualMemory+0x30
68925d17: kernel32!VirtualFreeEx+0x35
6892611c: kernel32!VirtualFree+0x13
75ef65ae: mshtml+0x1165AE
75ef68af: mshtml+0x1168AF
6a20787c: ntdll!LdrpCallInitRoutine+0x14
6a211c6f: ntdll!LdrUnloadDll+0x39A
689275c1: kernel32!FreeLibrary+0x3B
77b22d69: ole32!CoQueryReleaseObject+0x1E6
77b02bd2: ole32!SetErrorInfo+0x1ED
VirtualAlloc (tid: 0xB4): addr:04bb0000 sz:00010000 op:1000 prot:4
00aa1ac2: verifier!VsLogCall+0x42
00aa1988: verifier!AVrfpNtAllocateVirtualMemory+0x37
68925ca3: kernel32!VirtualAllocEx+0x61
68926105: kernel32!VirtualAlloc+0x16
75ef63f3: mshtml+0x1163F3
VirtualAlloc (tid: 0xB4): addr:04bb0000 sz:00400000 op:2000 prot:4
00aa1ac2: verifier!VsLogCall+0x42
00aa1988: verifier!AVrfpNtAllocateVirtualMemory+0x37
68925ca3: kernel32!VirtualAllocEx+0x61
68926105: kernel32!VirtualAlloc+0x16
75ef63d9: mshtml+0x1163D9
Bu veri çıktısını okumak için, girdilerin en son olandan başlayarak döküldüğünü unutmayın. Bu nedenle, bu günlük, 0xB4 iş parçacığının bir sayfa işlemekte olduğu büyük bir bölge ayırdığını gösterir. Daha sonra sayfayı açıp tüm sanal bölgeyi serbest bıraktı.
Ayrıca Bkz.
Uygulama Doğrulayıcı - Genel Bakış
Uygulama Doğrulayıcı - Test Uygulamaları
Uygulama Doğrulayıcı - Uygulama Doğrulayıcı içindeki testler