Windows Sistemlerde Crash Dump Analizi – Bölüm 4: Dump Analizi

Windows Debugging Tools’u başlattıktan sonra  File -> Open Crash Dump ile dump dosyamızı açıyoruz:

Ben bu yazımda bir Remote Desktop (Terminal) Sunucuda aldığım çekirdek bellek crash dump (kernel memory dump) dosyasını kullandım. Crash dump açılırken daha önce yaptığım sembol ve executable search tanımlamalarını görüyorum:

Analizin ilk verileri benim için çok değerli bilgileri veriyor:

”Page xxxxx not present in the dump file” hatasını almamın sebebi analiz yaptığım dump dosyasının full dump değil, çekirdek bellek dump dosyası olması. Eğer full dump dosyası alabilmiş olsaydım, o anda bellekte olan tüm page’ler dump dosyasında olacaktı.

“Bugcheck BE” bilgisi bana ilk etapta sorunun ne olduğunu gösteriyor. Help -> Contents altında Bug Checks (Blue Screens) -> Bug Check Code Reference altında Bugcheck 0xBE ile başlayan girdiye baktığımda “ATTEMPTED_TO_WRITE_TO_READONLY_MEMORY” bilgisini, yani çökme sebebinin, bir uygulamanın salt-okunur (Read Only) bir bellek alanına yazmaya çalıştığı bilgisini alıyorum (komut satırından !analyze –show BE ile de Help dosyasını açmadan aynı bilgiye ulaşabilirim). Bu uygulamanın hangi uygulama olabileceğini (“olduğunu” değil, kesin olarak söylemek mümkün değil) de “Probably caused by” satırından öğreniyorum (RDPWD.SYS). Örneğimizde RDPWD.SYS dosyasının salt-okunur bir bellek alanına yazmaya çalışmasından dolayı Remote Desktop (Terminal) sunucumun çöktüğünü anlıyorum.

RDPWD.SYS dosyasının çökmeye sebep olup olmadığını doğrulamak için Windbg komut satırında kL komutu ile çökmeye doğrudan sebep olan thread’in stack bilgisini alıyorum (stack, bellekte thread’lere özel olarak ayrılmış, geçici veri depolama, fonksiyonlar arası veri akışı gibi birçok işlem için kullanılan alandır):

6: kd> kL
Child-SP          RetAddr           Call Site
 fffff880`156476f8 fffff800`016355d2 nt!KeBugCheckEx
 fffff880`15647700 fffff800`01687d6e nt! ?? ::FNODOBFM::`string'+0x45c6e
 fffff880`15647860 fffff880`08891ff6 nt!KiPageFault+0x16e
 fffff880`156479f8 fffff880`0887e896 RDPWD!memcpy+0xd6
 fffff880`15647a00 fffff880`08878967 RDPWD!ShareClass::SDGSendSDARectWorker+0x796
 fffff880`15647b20 fffff880`0887297c RDPWD!ShareClass::SDG_SendScreenDataArea+0x1af
 fffff880`15647d50 fffff880`08874e5d RDPWD!ShareClass::UP_SendUpdates+0x2ac
 fffff880`15647de0 fffff880`0886b374 RDPWD!ShareClass::DCS_TimeToDoStuff+0x155
 fffff880`15647e70 fffff880`088688e8 RDPWD!WDLIB_DDOutputAvailable+0x248
 fffff880`15647ef0 fffff880`0388967f RDPWD!WDSYS_Ioctl+0x28
 fffff880`15648750 fffff880`038894c0 termdd!IcaCallSd+0x43
 fffff880`15648780 fffff880`038880a9 termdd!IcaCallStack+0x68
 fffff880`156487b0 fffff880`0388a8a1 termdd!IcaCallDriver+0x145
 fffff880`15648820 fffff880`03884793 termdd!IcaDeviceControlVirtual+0x2dd
 fffff880`156488e0 fffff880`038869e9 termdd!IcaDeviceControlChannel+0xeb
 fffff880`156489c0 fffff880`03886689 termdd!IcaDeviceControl+0x75
 fffff880`15648a10 fffff960`0023c966 termdd!IcaDispatch+0x215
 fffff880`15648a50 fffff960`00af125f win32k!EngFileIoControl+0xe2
 fffff880`15648ae0 fffff960`00af139c RDPDD!SCH_DDOutputAvailable+0x24b
 fffff880`15648bc0 fffff960`00b032a0 RDPDD!SCH_DDOutputAvailable+0x2c
 fffff880`15648bf0 fffff960`00b063b0 RDPDD!OA_AllocOrderMem+0x54
 fffff880`15648c20 fffff960`00b06046 RDPDD!SBCCacheBits+0x280
 fffff880`15648d50 fffff960`00aff2b9 RDPDD!SBC_CacheBitmapTile+0x2f2
 fffff880`15648e70 fffff960`00aff618 RDPDD!OETileBitBltOrder+0x3dd
 fffff880`15649250 fffff960`00af5798 RDPDD!OEEncodeMemBlt+0x188
 fffff880`156492b0 fffff960`00af62e3 RDPDD!DrvBitBlt+0x710
 fffff880`15649420 fffff960`002e0c17 RDPDD!DrvCopyBits+0x8f
 fffff880`156494a0 fffff960`00225a00 win32k!OffCopyBits+0xc7
 fffff880`15649500 fffff960`00225e94 win32k!SpBitBlt+0x418
 fffff880`156498f0 fffff960`00096068 win32k!SpCopyBits+0x44
 fffff880`15649960 fffff960`002e12c9 win32k!EngAlphaBlend+0x5a0
 fffff880`15649c20 fffff960`00227090 win32k!OffAlphaBlend+0xe9
 fffff880`15649ca0 fffff960`0021250f win32k!SpAlphaBlend+0x2a0
 fffff880`1564a030 fffff800`01688ed3 win32k!NtGdiAlphaBlend+0x15ff
 fffff880`1564a430 00000000`7526059a nt!KiSystemServiceCopyEnd+0x13
 00000000`03bfcc18 fffff800`01681210 0x7526059a
 fffff880`1564a880 00000000`00000000 nt!KiCallUserMode

Stack detayından RDPWD.SYS dosyasının çökme anında bellekte olduğunu görüyorum. nt!KeBugCheckEx satırından itibaren çökme ile ilgili bilgiler başlıyor:

fffff880`156476f8 fffff800`016355d2 nt!KeBugCheckEx
fffff880`15647700 fffff800`01687d6e nt! ?? ::FNODOBFM::`string'+0x45c6e
fffff880`15647860 fffff880`08891ff6 nt!KiPageFault+0x16e

Ardından komut satırından r komutu ile işlemcideki register bilgilerini alıyorum:

rax=000000019e981863 rbx=000000003b662121 rcx=00000000000000be
rdx=fffff8a012284000 rsi=0000000000000002 rdi=0000000000000000
rip=fffff80001689c40 rsp=fffff880156476f8 rbp=fffff88015647780
r8=000000003b662121  r9=fffff88015647860 r10=0000000000000000
r11=0000000000000001 r12=fffffa80142eeb10 r13=fffff8a012284000
r14=fffff800018bf5c0 r15=00000000000001f1
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
nt!KeBugCheckEx:
fffff800`01689c40 48894c2408      mov     qword ptr [rsp+8],rcx ss:0018:fffff880`15647700=be00000000000000

fffff800`01689c40 adresi çökmenin olduğu anda bize işlemci register’ında işlenmeyi bekleyen komutu gösteriyor. Stack bilgilerinde bu adres, bekleyeceğimiz üzere nt!KiPageFault adresinden (fffff880`15647860) hemen sonraki adres.

Son olarak komut satırından lmvm rdpwd komutu ile RDPWD.SYS dosyası ile ilgili detaylı bilgi alıyorum:

start             end                 module name
fffff880`08867000 fffff880`088a0000   RDPWD      (pdb symbols)          c:symbols cacheRDPWD.pdb744C609DB42B4C8AB83DE2F2F5B17D941RDPWD.pdb
    Loaded symbol image file: RDPWD.SYS
    Image path: SystemRootSystem32DriversRDPWD.SYS
    Image name: RDPWD.SYS
    Timestamp:        Fri Feb 17 06:58:23 2012 (4F3DDE6F)
    CheckSum:         0003698F
    ImageSize:        00039000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

RDPWD.SYS dosyasının başlangıç (fffff880`08867000) ve bitiş adresleri (fffff880`088a0000) de bana çökme sırasında RDPWD.SYS’nin bellekte bulunduğu adresleri gösteriyor.

Bütün bu bilgileri birleştirdiğimde çökme anında RDPWD.SYS dosyasının salt okunur bir bellek bölgesine yazmaya çalıştığını doğruluğa çok yakın bir şekilde gösteriyor. Çökme ile ilgili ilk elde ettiğimiz bilgiler her ne kadar RDPWD.SYS dosyasına işaret etmiş olsa da, o anda bellekte neler olduğu, çökme sırasındaki stack durumu ve RDPWS.SYS dosyası ile ilgili detay bilgiler benim bulgularımı destekliyor ve daha doğru bir karar vermemi sağlıyor.

Aslında işletim sistemi dosyalarından birisinin neden olduğu bir çökmeninin analizi için ne yazık ki küçük dump veya çekirdek bellek dump dosyası %99 durumda yeterli olmuyor. Ancak tam dump dosyası elimizde olsa bile bu gibi durumlarda dump analizimiz bizi bir bug bulma ve Windows güncellemeleri ile sonuçlanabiliyor (açıkçası ben bu dump dosyasının analizinden sonra Windows güncellemeleri ile bu sorunun üstesinden geldim ve bir daha bu sebepten bir sorun yaşamadım).

Eğer sorun aygıt sürücülerinden kaynaklanıyor ise DEFAULT_BUCKET_ID değeri karşılığında WIN7_DRIVER_FAULT (ya da kullandığınız Windows sürümüne gore DRIVER_FAULT) ibaresi görürüz.

Eğer Microsoft’un çökme ile ilgili yayınlanmış bir çözümü varsa INTERNAL_SOLUTION_TEXT değeri olarak erişebileceğiniz bir web sayfası URL’si gösterilir. Bu web sayfasını ziyaret ederek çökme ve çözümü ile ilgili detaylı bilgi alabilirsiniz. Microsoft’un yayınladığı bu çökme bilgileri Windows Hata Raporlama’dan (Windows Error Reporting) gelen bilgiler ile oluşturulur.

Windows Sistemlerde Crash Dump Analizi

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s