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.
Bu kılavuzda, kullanıcı modu uygulamalarında hata ayıklamak için WinDbg'nin nasıl kullanılacağı gösterilmektedir. Çalışmakta olan bir işleme bağlanarak, kesme noktaları belirleyerek ve uygulama çöküşlerini teşhis ederek temel hata ayıklama becerilerini uygularsınız.
Bu makalede:
- Not Defteri'ne WinDbg ekleme ve temel hata ayıklamayı keşfetme
- Kendi uygulamanızda hata ayıklayın ve bir kilitlenmeyi analiz edin.
- Ana temel hata ayıklama komutları
Öğrendikleriniz
- Çalışan bir işleme WinDbg ekleme
- Okunabilir hata ayıklama çıktısı için sembol dosyalarını yapılandırma
- Kesme noktalarını ayarlama ve program yürütmeyi denetleme
- Uygulama kilitlenmelerini analiz et
- İş parçacıklarında ve çağrı yığınlarında gezin
Önkoşullar
- WinDbg bilgisayarınızda yüklü. Yükleme yönergeleri için bkz. WinDbg Windows hata ayıklayıcısını indirme ve yükleme.
- Komut satırı arabirimleri hakkında temel bilgiler
- (İsteğe bağlı) İkinci alıştırma için hata ayıklama simgeleri içeren derlenmiş bir uygulama
Tahmini tamamlanma süresi: 30 dakika
Not Defteri'ne açma ve WinDbg ekleme
Yükleme dizininize gidin ve WinDbg.exeaçın.
Dosya menüsünde Yürütülebilir Dosyayı Başlat'ıseçin. Yürütülebilir Dosyayı Başlat iletişim kutusunda ,notepad.exeiçeren klasöre gidin. (notepad.exe dosyası genellikle içindedir
C:\Windows\System32.) Dosya adı alanınanotepad.exegirin. Aç'ıseçin.
WinDbg'nin okunabilir işlev ve değişken adlarını görüntüleyebilmesi için sembol dosyalarını yapılandırın.
WinDbg penceresinin alt kısmındaki komut satırına şu komutu girin:
Çıktı aşağıdaki örneğe benzer:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRVSimgeler nedir? Sembol (PDB) dosyaları, işlev adları ve değişken adları gibi kod modülleri hakkında bilgi içerir. Simgeler olmadan yalnızca bellek adreslerini görürsünüz.
Ardından şu komutu girin:
.reloadkomutu, WinDbg'ye sembol dosyalarını bulmak ve yüklemek için ilk aramasını gerçekleştirmesini söyler.notepad.exe modülünün simgelerini görmek için şu komutu girin:
Not
Herhangi bir çıkış görünmüyorsa, simgenin yüklenmesini zorlamak için
.reload /fgirin. Ek sembol yükleme bilgilerini görüntülemek için !sym gürültülü komutunu kullanın.içerennotepad.exe modülündeki
mainsimgeleri görmek için, maskeyle eşleşen modülleri listelemek için simgeleri incele komutunu kullanın:x notepad!wWin*Çıktı aşağıdaki örneğe benzer:
00007ff6`6e76b0a0 notepad!wWinMain (wWinMain) 00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)Bir kesme noktasını
notepad!wWinMain'da koymak için şu komutu girin:Kesme noktanızı ayarladığınızı doğrulamak için şu komutu girin:
Çıktı aşağıdaki örneğe benzer:
0 e Disable Clear 00007ff6`6e76b0a0 0001 (0001) 0:**** notepad!wWinMainNot Defteri işlemini başlatmak için şu komutu girin:
Notepad,
WinMainişlevine gelene kadar çalışır ve ardından hata ayıklayıcıya girer.Breakpoint 0 hit notepad!wWinMain: 00007ff6`6e76b0a0 488bc4 mov rax,rspNot Defteri işleminde yüklü olan kod modüllerinin listesini görmek için şu komutu girin:
Çıktı aşağıdaki örneğe benzer:
0:000> lm start end module name 00007ff6`6e760000 00007ff6`6e798000 notepad (pdb symbols) C:\ProgramData\Dbg\sym\notepad.pdb\BC04D9A431EDE299D4625AD6201C8A4A1\notepad.pdb 00007ff8`066a0000 00007ff8`067ab000 gdi32full (deferred) 00007ff8`067b0000 00007ff8`068b0000 ucrtbase (deferred) 00007ff8`06a10000 00007ff8`06aad000 msvcp_win (deferred) 00007ff8`06ab0000 00007ff8`06ad2000 win32u (deferred) 00007ff8`06b40000 00007ff8`06e08000 KERNELBASE (deferred) 00007ff8`07220000 00007ff8`072dd000 KERNEL32 (deferred) 00007ff8`07420000 00007ff8`07775000 combase (deferred) 00007ff8`07820000 00007ff8`079c0000 USER32 (deferred) 00007ff8`079c0000 00007ff8`079f0000 IMM32 (deferred) 00007ff8`07c00000 00007ff8`07c2a000 GDI32 (deferred) 00007ff8`08480000 00007ff8`085ab000 RPCRT4 (deferred) 00007ff8`085b0000 00007ff8`0864e000 msvcrt (deferred) 00007ff8`08c40000 00007ff8`08cee000 shcore (deferred) 00007ff8`08db0000 00007ff8`08fa5000 ntdll (pdb symbols) C:\ProgramData\Dbg\sym\ntdll.pdb\53F12BFE149A2F50205C8D5D66290B481\ntdll.pdb 00007fff`f8580000 00007fff`f881a000 COMCTL32 (deferred)Yığın izlemesini görmek için şu komutu girin:
Çıktı aşağıdaki örneğe benzer:
0:000> k 00 000000c8`2647f708 00007ff6`6e783d36 notepad!wWinMain 01 000000c8`2647f710 00007ff8`07237034 notepad!__scrt_common_main_seh+0x106 02 000000c8`2647f750 00007ff8`08e02651 KERNEL32!BaseThreadInitThunk+0x14 03 000000c8`2647f780 00000000`00000000 ntdll!RtlUserThreadStart+0x21Not Defteri'ni yeniden başlatmak için şu komutu girin:
Önümüzdeki: Yürütmeyi kesecek ve yüklenen modülleri keşfedeceksiniz.
Not Defteri'ne erişmek için, Dosya menüsünde Kırseçin.
ZwWriteFile'da bir kesme noktası ayarlamak ve doğrulamak için şu komutları kullanın:Not Defteri'ni yeniden başlatmak için g girin. Not Defteri penceresinde metin girin. Dosya menüsünde Kaydetseçin. Çalışan kod,
ZwCreateFilesöz konusu olduğunda sorun çıkarır. Yığın izlemesini görmek için k komutunu girin.
WinDbg penceresinde, komut satırının solunda işlemci ve iş parçacığı numaraları gösterilir. Bu örnekte, geçerli işlemci numarası 0 ve geçerli iş parçacığı numarası 11 (
0:011>). Pencerede, işlemci 0 üzerinde çalışan iş parçacığı 11 için yığın izlemesi görüntülenir.Not Defteri işlemindeki tüm iş parçacıklarının listesini görmek için şu komutu (tilde) girin:
Çıktı aşağıdaki örneğe benzer:
0:011> ~ 0 Id: 5500.34d8 Suspend: 1 Teb: 000000c8`262c4000 Unfrozen 1 Id: 5500.3960 Suspend: 1 Teb: 000000c8`262c6000 Unfrozen 2 Id: 5500.5d68 Suspend: 1 Teb: 000000c8`262c8000 Unfrozen 3 Id: 5500.4c90 Suspend: 1 Teb: 000000c8`262ca000 Unfrozen 4 Id: 5500.4ac4 Suspend: 1 Teb: 000000c8`262cc000 Unfrozen 5 Id: 5500.293c Suspend: 1 Teb: 000000c8`262ce000 Unfrozen 6 Id: 5500.53a0 Suspend: 1 Teb: 000000c8`262d0000 Unfrozen 7 Id: 5500.3ca4 Suspend: 1 Teb: 000000c8`262d4000 Unfrozen 8 Id: 5500.808 Suspend: 1 Teb: 000000c8`262da000 Unfrozen 10 Id: 5500.3940 Suspend: 1 Teb: 000000c8`262dc000 Unfrozen . 11 Id: 5500.28b0 Suspend: 1 Teb: 000000c8`262de000 Unfrozen 12 Id: 5500.12bc Suspend: 1 Teb: 000000c8`262e0000 Unfrozen 13 Id: 5500.4c34 Suspend: 1 Teb: 000000c8`262e2000 UnfrozenBu örnekte 14 iş parçacığında 0 ile 13 arasında dizinler vardır.
İş parçacığı 0'ın yığın izlemesine bakmak için şu komutları girin:
Çıktı aşağıdaki örneğe benzer:
0:011> ~0s 0:011> ~0s win32u!NtUserGetProp+0x14: 00007ff8`06ab1204 c3 ret 0:000> k # Child-SP RetAddr Call Site 00 000000c8`2647bd08 00007ff8`07829fe1 win32u!NtUserGetProp+0x14 01 000000c8`2647bd10 00007fff`f86099be USER32!GetPropW+0xd1 02 000000c8`2647bd40 00007ff8`07d12f4d COMCTL32!DefSubclassProc+0x4e 03 000000c8`2647bd90 00007fff`f8609aba SHELL32!CAutoComplete::_EditWndProc+0xb1 04 000000c8`2647bde0 00007fff`f86098b7 COMCTL32!CallNextSubclassProc+0x9a 05 000000c8`2647be60 00007ff8`0782e858 COMCTL32!MasterSubclassProc+0xa7 06 000000c8`2647bf00 00007ff8`0782de1b USER32!UserCallWinProcCheckWow+0x2f8 07 000000c8`2647c090 00007ff8`0782d68a USER32!SendMessageWorker+0x70b 08 000000c8`2647c130 00007ff8`07afa4db USER32!SendMessageW+0xdaHata ayıklamadan çıkmak ve Not Defteri işleminden ayırmak için şu komutu girin:
Kendi uygulamanızı açma ve WinDbg ekleme
Örneğin, bu küçük konsol uygulamasını yazdığınızı ve oluşturduğunuzu varsayalım:
...
void MyFunction(long p1, long p2, long p3)
{
long x = p1 + p2 + p3;
long y = 0;
y = x / p2;
}
void main ()
{
long a = 2;
long b = 0;
MyFunction(a, b, 5);
}
Bu alıştırmada, oluşturulan uygulamanın (MyApp.exe) ve simge dosyasının (MyApp.pdb) C:\MyApp\x64\Debug içinde olduğunu varsayalım. Ayrıca, uygulama kaynak kodunun C:\MyApp\MyApp and that the target machine compiled MyApp.exeiçinde olduğunu varsayalım.
WinDbg'i açın.
Dosya menüsünde Yürütülebilir Dosyayı Başlat'ıseçin. Yürütülebilir Dosyayı Başlat iletişim kutusunda C:\Uygulamam\x64\Debug'a gidin. Dosya adıiçin MyApp.exegirin. Aç'ı
seçin. Şu komutları girin:
.sympath+ C:\MyApp\x64\Debug
Bu komutlar WinDbg'ye uygulamanızın sembollerini ve kaynak kodunu nerede bulacağını bildirir. Bu durumda, . srcpath kullanarak kaynak kod konumunu ayarlamanız gerekmez çünkü semboller kaynak dosyaların tam yollarına sahiptir.
Şu komutları girin:
Uygulamanız kendi
mainişlevine ulaştığında hata ayıklayıcıyı başlatır.WinDbg kaynak kodunuzu ve Komut penceresini görüntüler.
Hata Ayıklama menüsünde İçine Adım At'ı seçin (ya da F11'i seçin).
MyFunctionkonumuna ulaşana kadar adım adım ilerleyin.y = x / p2satırına adımladığınızda uygulamanız çöker ve hata ayıklayıcıda durur.Çıktı aşağıdaki örneğe benzer:
(1450.1424): Integer divide-by-zero - code c0000094 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. MyApp!MyFunction+0x44: 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] ss:00000063`2036f808=00000000Şu komutu girin:
WinDbg sorunun analizini görüntüler (bu örnekte 0'a bölme).
FAULTING_IP: MyApp!MyFunction+44 [c:\myapp\myapp\myapp.cpp @ 7] 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00007ff63be11064 (MyApp!MyFunction+0x0000000000000044) ExceptionCode: c0000094 (Integer divide-by-zero) ExceptionFlags: 00000000 NumberParameters: 0 ... STACK_TEXT: 00000063`2036f7e0 00007ff6`3be110b8 : ... : MyApp!MyFunction+0x44 00000063`2036f800 00007ff6`3be1141d : ... : MyApp!main+0x38 00000063`2036f840 00007ff6`3be1154e : ... : MyApp!__tmainCRTStartup+0x19d 00000063`2036f8b0 00007ffc`b1cf16ad : ... : MyApp!mainCRTStartup+0xe 00000063`2036f8e0 00007ffc`b1fc4629 : ... : KERNEL32!BaseThreadInitThunk+0xd 00000063`2036f910 00000000`00000000 : ... : ntdll!RtlUserThreadStart+0x1d STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ;dt ntdll!LdrpFailureData ;.cxr 0x0 ;kb FOLLOWUP_IP: MyApp!MyFunction+44 [c:\myapp\myapp\myapp.cpp @ 7] 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] FAULTING_SOURCE_LINE: c:\myapp\myapp\myapp.cpp FAULTING_SOURCE_FILE: c:\myapp\myapp\myapp.cpp FAULTING_SOURCE_LINE_NUMBER: 7 FAULTING_SOURCE_CODE: 3: void MyFunction(long p1, long p2, long p3) 4: { 5: long x = p1 + p2 + p3; 6: long y = 0; > 7: y = x / p2; 8: } 9: 10: void main () 11: { 12: long a = 2; ...
Sonraki Adımlar
Hem sistem uygulamasında hem de kendi kodunuzda hata ayıkladıktan sonra, daha gelişmiş hata ayıklama senaryolarını keşfetmeye hazır olursunuz:
- WinDbg ile çalışmaya başlama (çekirdek modu) - Windows çekirdeğinde ve sürücülerde hata ayıklama
- Hata ayıklayıcı çalışması - Hata ayıklayıcısının çalışma konseptleri hakkında bilgi edinin
- Hata ayıklama teknikleri - Gelişmiş hata ayıklama yöntemlerini keşfetme
Komutların özeti
Bu öğreticide kullandığınız temel komutlar şunlardır:
Kurulum ve simgeler:
- .sympath (Simge Yolunu Ayarla) - WinDbg'nin sembol dosyalarını bulduğu yeri yapılandırma
- .reload (Modülü Yeniden Yükle) - Sembol dosyalarını yükleme
Yürütmeyi denetleme:
- g (Go) - Program yürütmeye devam et
- bu (Kesme Noktasını Ayarla) - Belirli bir işlevde yürütmeyi duraklatma
-
Step Into(F11) - Bir yönerge yürüterek işlevlere adımlayın
Programınızı inceleme:
- x (Simgeleri İncele) - İşlevleri ve değişkenleri listeleme
- lm (Yüklenen Modülleri Listele) - Tüm yüklenen DLL'leri ve yürütülebilir dosyaları göster
- k (Yığın Trazesi Görüntüleme) - Çağrı yığınını görüntüleme
- ~ (İş Parçacığı Durumu) - Tüm iş parçacıklarını listeleme
- !analyze -v - Kilitlenmeleri otomatik olarak analiz etme
Başvuru:
- bl (Kesme Noktası Listesi)
- ~s (Geçerli İş Parçacığını Ayarla)
- .sympath+
- .srcpath (Kaynak Yolunu Ayarla)
- qd (Çık ve Ayır)
Ayrıca bkz.
WinDbg (çekirdek modu) kullanmaya başlama