Penyederhanaan analisis dump memori windows atau tweak lain dari menu konteks

Banyak pengguna sistem operasi windows, cepat atau lambat, dihadapkan dengan kebutuhan untuk mencari tahu mengapa OS favorit mereka "jatuh ke BSOD."

Banyak yang telah ditulis tentang bagaimana mencari alasan dan bagaimana menghilangkannya (tergantung situasi) di Internet, tetapi apa yang harus saya lakukan jika saya perlu mengetahui alasannya secepat mungkin dan harus melakukannya secara teratur, seperti pekerja layanan atau pelanggan tetap di forum komputer?



Tweak menu konteks terkenal dapat menyederhanakan tugas, karena mereka dibuat cukup sederhana.

Persiapan
Pertama, Anda perlu menginstal paket dengan debugger windbg.exe, versi konsol kd.exe dan konten lain yang diperlukan.

Ini adalah paket X64 Debuggers And Tools-x64_en-us.msi atau X86 Debuggers And Tools-x86_en-us.msi untuk dipilih tergantung pada kedalaman bit OS yang digunakan dan / atau preferensi pribadi.

Anda tidak akan menemukan tautan individual di situs web microsoft, tetapi paket-paket ini adalah bagian dari Windows Driver Kit , Anda dapat mengunduhnya tanpa menginstalnya dengan memilih mode pemasang yang sesuai, paket-paket tersebut akan berada di folder \ Windows Kits \ 10 \ WDK \ Installers ketika unduhan selesai.

Jika seseorang membutuhkannya, maka saya mengunggahnya secara terpisah ke I. Disk:

X64 Debuggers And Tools-x64_en-us.msi
X86 Debuggers And Tools-x86_en-us.msi

Saya memutuskan untuk tidak menginstal debugger, tetapi hanya membongkar msi:

msiexec /a "D:\Desktop\X64 Debuggers And Tools-x64_en-us.msi" /qb targetdir="D:\Desktop\Temp" 

Opsi "portabel" ini lebih dari cukup. Setelah, untuk kenyamanan saya sendiri, saya memindahkan konten yang diinginkan dari beberapa subfolder ke C: \ Portable \ Debug , sehingga ternyata :

C:\Portable\Debug\windbg.exe
C:\Portable\Debug\kd.exe


+ yang lainnya. Kami akan membangun jalur ini di masa mendatang (ditambah saya menambahkannya ke% PATH% lagi, untuk kenyamanan).

Pada saat ini, langkah-langkah persiapan dapat dianggap selesai dan berlanjut untuk menggambarkan proses pembuatan tweak.

Karena tugas saya berasumsi bahwa ada banyak dan sering dump, saya perlu mempercepat proses sebanyak mungkin, sambil membuatnya cukup informatif untuk analisis cepat.

Berurusan dengan kunci dan perintah debugger


Sebagai dasar untuk tweak di masa depan, mari kita ambil file batch seperti itu, yang cukup untuk menyeret dump yang diinginkan.

Untuk persepsi informasi yang lebih baik, dalam pemahaman saya, saya membalikkan warna konsol dan mengatur ukuran jendela konsol lebih besar.

 @echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c ^ "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q"" pause exit /b 

Di sini Anda dapat melihat parameter yang dikirimkan oleh kd.exe, seperti -y , -i dan, pada kenyataannya, -z , yang dilihat oleh semua orang yang tahu tentang kdfe.cmd, yang dikenal luas dalam lingkaran sempit.

 -i !ImagePath! specifies the location of the executables that generated the fault (see _NT_EXECUTABLE_IMAGE_PATH) -y !SymbolsPath! specifies the symbol search path (see _NT_SYMBOL_PATH) -z !CrashDmpFile! specifies the name of a crash dump file to debug 

Jika kita menganalogikannya dengan instruksi umum, ada sedikit perbedaan: -nosqm dan -sup ditambahkan sebagai argumen.

 -nosqm disables SQM data collection/upload. -sup enables full public symbol searches 

Sebagai tim:

 !cpuid !sysinfo cpuinfo !sysinfo cpuspeed !sysinfo machineid 

Saya tidak akan mengecatnya, karena terlalu banyak copy-paste akan keluar. Mereka yang tertarik akan dapat menemukan bantuan terperinci dari debugger.chm di salah satu dari dua * .msi yang disebutkan di atas atau di docs.microsoft.com -cpuid -sysinfo . Singkatnya, informasi dasar tentang kelenjar korban.

Keluaran skrip menggunakan kd.exe akan berubah menjadi hampir sama dengan yang akan diperoleh ketika bekerja langsung melalui windbg, tetapi hasilnya dicapai lebih cepat karena Anda tidak perlu membuka apa pun, mengkonfigurasi folder, membuka dump melalui menu dan memasukkan perintah ke debugger.

Memfilter keluaran sampah dari konsol


Untuk contoh pertama, mari kita lakukan dump memori dari pengguna acak. Ada masalah kecil dengan sampah di output:

Cuplikan layar dari keluaran konsol

Ini ditemukan, misalnya, dalam dump pengguna yang menggunakan aktivator odin, yang kita lihat dalam contoh ini.

Output lengkapnya cukup besar, karena tautan ke pastebin .

Diperlukan untuk "menyaring" garis yang tidak perlu hanya menyisakan informasi yang berguna.
Saya menggunakan findstr , ternyata solusi yang jelek tapi bekerja:

 findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Di sini findstr menggunakan dua pelanggan tetap: satu mencari garis yang dimulai dengan tiga tanda bintang, satu spasi dan berakhir dengan spasi dan tiga tanda bintang. Pencarian kedua untuk baris dimulai dengan 14 bintang. Saya tidak dapat melakukan sesuatu yang lebih dimengerti dengan findstr.

(Saya tidak merekomendasikan menggunakan karakter terminasi baris dalam rutinitas findst pada knalpot kd.exe, mungkin ada masalah dengan tipe akhiran yang ditampilkan oleh kd.exe. Alih-alih \ r \ n, Anda bisa mendapatkan \ n bahwa findstr tidak mempertimbangkan akhir baris. Rake untuk diri sendiri.)

Seluruh kode dari file batch awal dengan "filter" ternyata adalah:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b 

Output penuh dari versi yang difilter juga ada di pastebin .

Hasilnya mirip, tetapi tanpa "sampah". 290 baris teks versus 894. Sudah lebih baik, tetapi tidak semua.

Pembuatan log debugger cepat


Langkah selanjutnya adalah menambahkan log, yang dapat diposting atau dikirim ke suatu tempat.

Untuk melakukan ini, berikan argumen kd.exe -loga <"P: \ to the \ log.log">
Kode tersebut mengambil bentuk berikut:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b 

Log 102516-21949-01.LOG akan dibuat untuk file 102516-21949-01.dmp di folder yang sama dengan dump itu sendiri.

Dalam hal ini, output "sampah" ke log tidak disaring, hanya output ke konsol yang difilter, tetapi dalam kasus saya ini tidak penting, meskipun Anda dapat memperbaikinya dan menghapus log setelah pembuatan:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" set CL=%L:.LOG=_CLEAN.LOG% type "%L%" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" >> "%CL%" del /f /q "%L%" pause exit /b 

Membuka tempat sampah di windbg


Sekarang langkah terakhir secara berurutan, tetapi tidak penting: Anda harus dapat mentransfer dump langsung ke windbg.exe dan segera mengirimkan perintah kepadanya yang kemungkinan besar harus Anda masukkan. Semuanya dilakukan dengan analogi dengan kd.exe, argumen dan perintah yang diterima oleh windbg.exe hampir identik dengan kd.exe

 @echo off windbg.exe -z "%1" -sup -y ^ "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid" exit /b 

Akibatnya, dump akan langsung terbuka di debugger dan perintah yang tercantum di kunci -c akan secara otomatis dieksekusi di dalamnya.

Kesimpulannya mirip dengan opsi pertama dengan perbedaan bahwa dump dibuka segera di windbg, dimungkinkan untuk memasukkan perintah untuk analisis lebih lanjut karena tidak adanya perintah q dalam daftar perintah yang dikirimkan.

(Omong-omong, jika dalam versi skrip sebelumnya dengan kd.exe Anda menghapus perintah q yang diteruskan dalam daftar perintah melalui argumen -c , maka kemampuan untuk terus bekerja dengan dump akan muncul di sana, termasuk merekam log langsung dalam proses.)

Tweak Creation


Sekarang semua ini perlu dimodifikasi sehingga Anda dapat mengikat file * .dmp ke menu konteks. Sebenarnya, untuk apa itu.

Berikut adalah "one-liners" berikut:

Untuk opsi dengan penyaringan keluaran konsol

 cmd /d /k mode con: cols=170 & color F0 & title "%1" & kd.exe -nosqm -sup -z "%1" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Untuk opsi dengan memfilter keluaran konsol dan membuat file log
(harus menggunakan ekstensi variabel yang ditangguhkan )

 cmd /d /v /k mode con: cols=170 & color F0 & title "%1" & set "D=%1"& set L=!D:.dmp=.LOG! & kd.exe -nosqm -sup -loga "!L!" -z "!D!" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Untuk membuka dump langsung di windbg.exe

 "C:\Portable\Debug\windbg.exe" -z "%1" -sup -y "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid" 

Dalam registri, saya membuat struktur partisi berikut:



Jenis file dmp_geek yang terpisah dibuat di kunci registri yang perubahannya dibuat. File dengan ekstensi * .dmp telah diberi file jenis dmp_geek .

Di setiap bagian perintah, garis-tunggal + prettiness yang sesuai dalam bentuk ikon dan nama yang mudah untuk nama item yang ditampilkan dalam menu konteks ditambahkan ke parameter string secara default.



Ternyata tweak yang menambahkan kemampuan untuk secara besar-besaran membuka dump yang dipilih di folder baik di konsol dan di debugger dengan menyaring "sampah" dan membuat log untuk setiap dump sesuai kebutuhan. Menghemat banyak waktu.

Setelah menyisir registri, mengekspor semuanya ke file REG final yang siap digunakan.

Isi file REG
 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.dmp] @="dmp_geek" [HKEY_CLASSES_ROOT\dmp_geek] @="dmp_geek" "FriendlyTypeName"=" " [HKEY_CLASSES_ROOT\dmp_geek\DefaultIcon] @="imageres.dll,142" [HKEY_CLASSES_ROOT\dmp_geek\shell] [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe] "MUIVerb"="Kd.exe" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe\command] @="cmd /d /k mode con: cols=170 & color F0 & title \"%1\" & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -z \"%1\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga] "MUIVerb"="Kd.exe -loga" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga\command] @="cmd /d /v /k mode con: cols=170 & color F0 & title \"%1\" & set \"D=%1\"& set L=!D:.dmp=.LOG! & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -loga \"!L!\" -z \"!D!\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open] "MUIVerb"="Windbg" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open\command] @="\"C:\\Portable\\Debug\\windbg.exe\" -z \"%1\" -sup -y \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -i \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid\"" 

→ Unduh dari Ya.Disk GEEK_DMP.reg

Itu saja. Sekarang Anda dapat dengan cepat, meskipun secara dangkal, segera menganalisis sekelompok dump.

Source: https://habr.com/ru/post/id409397/


All Articles