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.
Kilitlenen hedef bilgisayarda veya uygulamada hata ayıklamanın ilk adımı !analyze extension komutunu kullanmaktır. Bu uzantı büyük miktarda otomatik analiz gerçekleştirir. Bu çözümlemenin sonuçları Hata Ayıklayıcı Komut penceresinde görüntülenir.
Verilerin tam olarak ayrıntılı bir şekilde görüntülenmesi için -v seçeneğini kullanmanız gerekir. Diğer seçeneklerle ilgili ayrıntılar için !analyze reference sayfasına bakın.
User-Mode !çözümle -v Örneği
Bu örnekte hata ayıklayıcı, özel durumla karşılaşan bir kullanıcı modu uygulamasına eklenmiştir.
0:000> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
Debugger SolutionDb Connection::Open failed 80004005
İnternet'e bağlıysanız, hata ayıklayıcı Microsoft tarafından tutulan kilitlenme çözümleri veritabanına erişmeye çalışır. Bu durumda, makinenizin İnternet'e erişemediğini veya web sitesinin çalışmadığını belirten bir hata iletisi görüntülendi.
FAULTING_IP:
ntdll!PropertyLengthAsVariant+73
77f97704 cc int 3
FAULTING_IP alanı, hata sırasında yönerge işaretçisini gösterir.
EXCEPTION_RECORD: ffffffff -- (.exr ffffffffffffffff)
ExceptionAddress: 77f97704 (ntdll!PropertyLengthAsVariant+0x00000073)
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 00000000
Parameter[1]: 00010101
Parameter[2]: ffffffff
EXCEPTION_RECORD alanında bu kilitlenme için özel durum kaydı gösterilir. Bu bilgiler .exr (Özel Durum Kaydını Görüntüle) komutu kullanılarak da görüntülenebilir.
BUGCHECK_STR: 80000003
BUGCHECK_STR alanında özel durum kodu gösterilir. Bu isim yanıltıcıdır; hata denetimi terimi aslında çekirdek modundaki bir çökme anlamına gelir. Kullanıcı modunda hata ayıklamada özel durum kodu görüntülenir; bu örnekte 0x80000003.
DEFAULT_BUCKET_ID: APPLICATION_FAULT
DEFAULT_BUCKET_ID alanı, bu hatanın ait olduğu hataların genel kategorisini gösterir.
PROCESS_NAME: MyApp.exe
PROCESS_NAME alanı, özel durumu tetikleyen işlemin adını belirtir.
LAST_CONTROL_TRANSFER: from 01050963 to 77f97704
LAST_CONTROL_TRANSFER alanı yığındaki son çağrıyı gösterir. Adresindeki kod 0x01050963, 0x77F97704 adresindeki bir işlevi çağırdı. Bu adreslerin hangi modüllerde ve işlevlerde yer aldığını belirlemek için bu adresleri ln (En Yakın Simgeleri Listele) komutuyla kullanabilirsiniz.
STACK_TEXT:
0006b9dc 01050963 00000000 0006ba04 000603fd ntdll!PropertyLengthAsVariant+0x73
0006b9f0 010509af 00000002 0006ba04 77e1a449 MyApp!FatalErrorBox+0x55 [D:\source_files\MyApp\util.c @ 541]
0006da04 01029f4e 01069850 0000034f 01069828 MyApp!ShowAssert+0x47 [D:\source_files\MyApp\util.c @ 579]
0006db6c 010590c3 000e01ea 0006fee4 0006feec MyApp!SelectColor+0x103 [D:\source_files\MyApp\colors.c @ 849]
0006fe04 77e11d0a 000e01ea 00000111 0000413c MyApp!MainWndProc+0x1322 [D:\source_files\MyApp\MyApp.c @ 1031]
0006fe24 77e11bc8 01057da1 000e01ea 00000111 USER32!UserCallWinProc+0x18
0006feb0 77e172b4 0006fee4 00000001 010518bf USER32!DispatchMessageWorker+0x2d0
0006febc 010518bf 0006fee4 00000000 01057c5d USER32!DispatchMessageA+0xb
0006fec8 01057c5d 0006fee4 77f82b95 77f83920 MyApp!ProcessQCQPMessage+0x3b [D:\source_files\MyApp\util.c @ 2212]
0006ff70 01062cbf 00000001 00683ed8 00682b88 MyApp!main+0x1e6 [D:\source_files\MyApp\MyApp.c @ 263]
0006ffc0 77e9ca90 77f82b95 77f83920 7ffdf000 MyApp!mainCRTStartup+0xff [D:\source_files\MyApp\crtexe.c @ 338]
0006fff0 00000000 01062bc0 00000000 000000c8 KERNEL32!BaseProcessStart+0x3d
STACK_TEXT alanında hataya neden olan bileşenin yığın izlemesi gösterilir.
FOLLOWUP_IP:
MyApp!FatalErrorBox+55
01050963 5e pop esi
FOLLOWUP_NAME: dbg
SYMBOL_NAME: MyApp!FatalErrorBox+55
MODULE_NAME: MyApp
IMAGE_NAME: MyApp.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 383490a9
!analyze büyük olasılıkla hataya neden olan yönergeyi belirlediğinde, FOLLOWUP_IP alanında görüntüler. SYMBOL_NAME, MODULE_NAME, IMAGE_NAME ve DEBUG_FLR_IMAGE_TIMESTAMP alanları bu yönergeye karşılık gelen simge, modül, görüntü adı ve görüntü zaman damgasını gösterir.
STACK_COMMAND: .ecxr ; kb
STACK_COMMAND alanı, STACK_TEXT almak için kullanılan komutu gösterir. Bu komutu kullanarak bu yığın izleme görüntüsünü yineleyebilir veya ilgili yığın bilgilerini almak için değiştirebilirsiniz.
BUCKET_ID: 80000003_MyApp!FatalErrorBox+55
BUCKET_ID alanı, geçerli hatanın ait olduğu belirli hata kategorisini gösterir. Bu kategori, hata ayıklayıcının analiz çıkışında görüntülenecek diğer bilgileri belirlemesine yardımcı olur.
Followup: dbg
---------
FOLLOWUP_NAME ve İzleme alanları hakkında bilgi için bkz. İzleme Alanı ve triage.ini Dosyası.
Görünebilecek çeşitli başka alanlar da vardır:
Denetim geçersiz bir adrese aktarıldıysa, FAULTING_IP alanı bu geçersiz adresi içerir. FOLLOWUP_IP alanı yerine, FAILED_INSTRUCTION_ADDRESS alanı bu adresten ayrıştırılmış kodu gösterir, ancak bu ayrıştırma büyük olasılıkla anlamsız olacaktır. Bu durumda, SYMBOL_NAME, MODULE_NAME, IMAGE_NAME ve DEBUG_FLR_IMAGE_TIMESTAMP alanları bu yönergeyi çağırana başvurur.
İşlemci yanlış ateş ederse SINGLE_BIT_ERROR, TWO_BIT_ERROR veya POSSIBLE_INVALID_CONTROL_TRANSFER alanlarını görebilirsiniz.
Bellek bozulması oluşmuş gibi görünüyorsa, CHKIMG_EXTENSION alanı araştırmak için kullanılması gereken !chkimg uzantısı komutunu belirtir.
Kernel-Mode !çözümle -v Örneği
Bu örnekte, hata ayıklayıcısı yeni çökmüş bir bilgisayara bağlandığı durumda kullanılır.
kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pagable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Ekranın ilk öğesi, hata denetimi kodunu ve bu tür bir hata denetimi hakkındaki bilgileri gösterir. Görüntülenen metnin bazıları bu örneğe uygulanamayabilir. Her hata denetimi hakkında daha fazla ayrıntı için Hata Denetimi Kod Başvurusu bölümüne bakın.
Arguments:
Arg1: 00000004, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, value 0 = read operation, 1 = write operation
Arg4: f832035c, address which referenced memory
Hata denetimi parametreleri daha sonra görüntülenir. Her birinin ardından bir açıklama eklenir. Örneğin, üçüncü parametre 1'dir ve bunu izleyen açıklama bir yazma işleminin başarısız olduğunu gösterir.
## Debugging Details:
WRITE_ADDRESS: 00000004 Nonpaged pool
CURRENT_IRQL: 2
Bir sonraki birkaç alan, çökmenin niteliğine bağlı olarak değişir. Bu durumda, WRITE_ADDRESS ve CURRENT_IRQL alanları görürüz. Bunlar yalnızca hata kontrolü parametrelerinde gösterilen bilgileri yeniden ifade etmektir. "Sayfalanmamış havuz" ifadesini, "sayfalanabilir (veya tamamen geçersiz) bir adrese erişilmeye çalışıldı" hata denetimi metniyle karşılaştırarak, adresin geçersiz olduğunu görebiliriz. Bu örnekte geçersiz adres 0x00000004.
FAULTING_IP:
USBPORT!USBPORT_BadRequestFlush+7c
f832035c 894204 mov [edx+0x4],eax
FAULTING_IP alanı, hata sırasında yönerge işaretçisini gösterir.
DEFAULT_BUCKET_ID: DRIVER_FAULT
DEFAULT_BUCKET_ID alanı, bu hatanın ait olduğu hataların genel kategorisini gösterir.
BUGCHECK_STR: 0xD1
BUGCHECK_STR alanında daha önce gördüğümüz hata denetimi kodu gösterilir. Bazı durumlarda ek önceliklendirme bilgileri eklenir.
TRAP_FRAME: f8950dfc -- (.trap fffffffff8950dfc)
.trap fffffffff8950dfc
ErrCode = 00000002
eax=81cc86dc ebx=81cc80e0 ecx=81e55688 edx=00000000 esi=81cc8028 edi=8052cf3c
eip=f832035c esp=f8950e70 ebp=f8950e90 iopl=0 nv up ei pl nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010216
USBPORT!USBPORT_BadRequestFlush+7c:
f832035c 894204 mov [edx+0x4],eax ds:0023:00000004=????????
.trap
Resetting default context
TRAP_FRAME alanı bu kilitlenme için yakalama çerçevesini gösterir. Bu bilgiler .trap (Görüntü Yakalama Çerçevesi) komutu kullanılarak da görüntülenebilir.
LAST_CONTROL_TRANSFER: from f83206e0 to f832035c
LAST_CONTROL_TRANSFER alanı yığındaki son çağrıyı gösterir. Bu durumda, 0xF83206E0 adresindeki kod, 0xF832035C adresindeki bir işlevi çağırdı. Bu adreslerin hangi modülde ve işlevde yer aldığını belirlemek için ln (En Yakın Simgeleri Listele) komutunu kullanabilirsiniz.
STACK_TEXT:
f8950e90 f83206e0 024c7262 00000000 f8950edc USBPORT!USBPORT_BadRequestFlush+0x7c
f8950eb0 804f5561 81cc8644 81cc8028 6d9a2f30 USBPORT!USBPORT_DM_TimerDpc+0x10c
f8950fb4 804f5644 6e4be98e 00000000 ffdff000 nt!KiTimerListExpire+0xf3
f8950fe0 8052c47c 8053cf20 00000000 00002e42 nt!KiTimerExpiration+0xb0
f8950ff4 8052c16a efdefd44 00000000 00000000 nt!KiRetireDpcList+0x31
STACK_TEXT alanında hataya neden olan bileşenin yığın izlemesi gösterilir.
FOLLOWUP_IP:
USBPORT!USBPORT_BadRequestFlush+7c
f832035c 894204 mov [edx+0x4],eax
FOLLOWUP_IP alanında, büyük olasılıkla hataya neden olan yönergenin ayrıştırılması gösterilir.
FOLLOWUP_NAME: usbtri
SYMBOL_NAME: USBPORT!USBPORT_BadRequestFlush+7c
MODULE_NAME: USBPORT
IMAGE_NAME: USBPORT.SYS
DEBUG_FLR_IMAGE_TIMESTAMP: 3b7d868b
SYMBOL_NAME, MODULE_NAME, IMAGE_NAME ve DBG_FLR_IMAGE_TIMESTAMP alanları, bu talimata (geçerliyse) veya bu talimatın çağırıcısına (geçerli değilse) karşılık gelen simge, modül, görüntü ve görüntü zaman damgasını gösterir.
STACK_COMMAND: .trap fffffffff8950dfc ; kb
STACK_COMMAND alanı, STACK_TEXT almak için kullanılan komutu gösterir. Bu komutu kullanarak bu yığın izleme görüntüsünü yineleyebilir veya ilgili yığın bilgilerini almak için değiştirebilirsiniz.
BUCKET_ID: 0xD1_W_USBPORT!USBPORT_BadRequestFlush+7c
BUCKET_ID alanı, geçerli hatanın ait olduğu belirli hata kategorisini gösterir. Bu kategori, hata ayıklayıcının analiz çıkışında görüntülenecek diğer bilgileri belirlemesine yardımcı olur.
FOLLOWUP_NAME ve İzleme alanları hakkında bilgi için bkz. İzleme Alanı ve triage.ini Dosyası.
Görünebilecek çeşitli başka alanlar da vardır:
Denetim geçersiz bir adrese aktarıldıysa, FAULTING_IP alanı bu geçersiz adresi içerir. FOLLOWUP_IP alanı yerine, FAILED_INSTRUCTION_ADDRESS alanı bu adresten ayrıştırılmış kodu gösterir, ancak bu ayrıştırma büyük olasılıkla anlamsız olacaktır. Bu durumda, SYMBOL_NAME, MODULE_NAME, IMAGE_NAME ve DBG_FLR_IMAGE_TIMESTAMP alanları bu yönergeyi çağırana başvurur.
İşlemci doğru çalışmazsa SINGLE_BIT_ERROR, TWO_BIT_ERROR veya POSSIBLE_INVALID_CONTROL_TRANSFER alanlarını görebilirsiniz.
Bellek bozulması oluşmuş gibi görünüyorsa, CHKIMG_EXTENSION alanı araştırmak için kullanılması gereken !chkimg uzantısı komutunu belirtir.
Bir cihaz sürücüsünün kodunda bir hata denetimi oluştuysa, adı BUGCHECKING_DRIVER alanında görüntülenebilir.
Takip Alanı ve triage.ini Dosyası
Hem kullanıcı modunda hem de çekirdek modunda, görüntüdeki İzleme alanı, geçerli yığın çerçevesinin sahibi hakkında bilgi (bu belirlenebiliyorsa) gösterir. Bu bilgiler aşağıdaki şekilde belirlenir:
!analyze uzantısı kullanıldığında, hata ayıklayıcısı yığındaki üst çerçeveyle başlar ve hatadan sorumlu olup olmadığını belirler. Değilse, sonraki çerçeve analiz edilir. Bu işlem, hatalı olabilecek bir çerçeve bulunana kadar devam eder.
Hata ayıklayıcısı bu çerçevedeki modülün ve işlevin sahibini belirlemeye çalışır. Sahip belirlenebiliyorsa, bu çerçevenin hatalı olduğu kabul edilir.
Sahip belirlenemezse, sahibi belirlenene (veya yığın tamamen incelenene) kadar hata ayıklayıcı sonraki yığın çerçevesine geçer ve bu şekilde devam eder. Bu aramada sahibi bulunan ilk çerçevenin kusurlu olduğu kabul edilir. Yığın, herhangi bir bilgi bulunmadan tükenirse İzleme alanı görüntülenmez.
Hatalı çerçevenin sahibi Takip alanında görüntülenir. !analyze -v kullanılırsa, FOLLOWUP_IP, SYMBOL_NAME, MODULE_NAME, IMAGE_NAME ve DBG_FLR_IMAGE_TIMESTAMP alanları bu çerçeveye başvurur.
İzleme alanının yararlı bilgileri görüntülemesi için önce modülün ve işlev sahiplerinin adlarını içeren bir triage.ini dosyası oluşturmanız gerekir.
triage.ini dosyası, hataları olabilecek tüm modüllerin sahiplerini tanımlamalıdır. Gerçek sahip yerine bilgilendirici bir dize kullanabilirsiniz, ancak bu dize boşluk içeremez. Bir modülün hatalı olmadığından eminseniz, bu modülü atlayabilir veya atlanması gerektiğini belirtebilirsiniz. Tek tek işlevlerin sahiplerini belirtmek de mümkündür ve triyaj sürecine daha ince bir ayrıntı düzeyi verir.
triage.ini dosyasının söz dizimi hakkında ayrıntılı bilgi için bkz. Modül ve İşlev Sahiplerini Belirtme.
Ek !analyze Teknikleri
Kilitlenme veya istisna oluşmadıysa !analyze hedefin geçerli durumunu veren çok kısa bir metin görüntüler. Bazı durumlarda, bir kilitlenme olmuş gibi analizin gerçekleşmesini zorlamak isteyebilirsiniz. Bu görevi gerçekleştirmek için !analyze -f kullanın.
Kullanıcı modunda bir özel durum oluştuysa ancak temel sorunun askıda bir iş parçacığı olduğunu düşünüyorsanız, araştırdığınız iş parçacığını geçerli iş parçacığı olarak ayarlayın ve ardından !analyze -hang komutunu kullanın. Bu uzantı, herhangi bir iş parçacığının diğer iş parçacıklarını engelleyip engellemediğini belirlemek için bir iş parçacığı yığını analizi gerçekleştirir.
Çekirdek modunda, bir hata denetimi oluştuysa ancak temel sorunun kilitlenen bir iş parçacığı olduğuna inanıyorsanız !analyze -hang komutunu kullanın. Bu uzantı, sistem tarafından tutulan kilitleri inceleyecek ve DPC kuyruk zincirini tarayacak ve asılı iş parçacıklarının tüm göstergelerini görüntüleyecektir. Sorunun çekirdek modu kaynak kilitlenmesi olduğunu düşünüyorsanız, Sürücü Doğrulayıcı'nın Kilitlenme Algılama seçeneğiyle birlikte !kilitlenme uzantısını kullanın.
Ayrıca bilinen sorunları otomatik olarak yoksayabilirsiniz. Bunu yapmak için, önce bilinen sorunların biçimlendirilmiş listesini içeren bir XML dosyası oluşturmanız gerekir. Bu dosyayı yüklemek için !analyze -c -loadKnownIssuesFile uzantısını kullanın. Ardından bir özel durum veya kesme oluştuğunda !analyze -c uzantısını kullanın. İstisna, bilinen sorunlardan biriyle eşleşiyorsa, hedef sistem çalışmasına devam eder. Hedef yürütmeyi sürdürmezse sorunun nedenini belirlemek için !analyze -v kullanabilirsiniz.
Ayrıca bkz.
Ek bilgi için bu konulara bakın.
Windows hata ayıklayıcılarını (WinDbg) kullanarak çökme dökümü analizi