Bagikan melalui


Analisis Crash Dump

Tidak semua bug dapat ditemukan sebelum rilis, yang berarti tidak semua bug yang melemparkan pengecualian dapat ditemukan sebelum rilis. Untungnya, Microsoft telah menyertakan dalam Platform SDK fungsi untuk membantu pengembang mengumpulkan informasi tentang pengecualian yang ditemukan oleh pengguna. Fungsi MiniDumpWriteDump menulis informasi crash dump yang diperlukan ke file tanpa menyimpan seluruh ruang proses. File informasi crash dump ini disebut minidump. Artikel teknis ini menyediakan info tentang cara menulis dan menggunakan minidump.

Menulis Minidump

Opsi dasar untuk menulis minidump adalah sebagai berikut:

  • Tidak melakukan apa pun. Windows secara otomatis menghasilkan minidump setiap kali program melemparkan pengecualian yang tidak tertangani. Pembuatan otomatis minidump tersedia sejak Windows XP. Jika pengguna mengizinkannya, minidump akan dikirim ke Microsoft, dan bukan ke pengembang, melalui Pelaporan Galat Windows (WER). Pengembang dapat memperoleh akses ke minidump ini melalui Program Aplikasi Desktop Windows.

    Penggunaan WER memerlukan:

    • Pengembang untuk menandatangani aplikasi mereka menggunakan Authenticode
    • Aplikasi memiliki sumber daya VERSIONINFO yang valid di setiap executable dan DLL

    Jika Anda menerapkan rutinitas kustom untuk pengecualian yang tidak tertangani, Anda sangat didesak untuk menggunakan fungsi ReportFault di handler pengecualian untuk juga mengirim minidump otomatis ke WER. Fungsi ReportFault menangani semua masalah saat menyambungkan dan mengirim minidump ke WER. Tidak mengirim minidump ke WER melanggar persyaratan Permainan untuk Windows.

    Untuk informasi selengkapnya tentang WER, lihat Pelaporan Galat Windows.

  • Gunakan produk dari Sistem Tim Microsoft Visual Studio. Pada menu Debug , klik Simpan Cadangan Sebagai untuk menyimpan salinan cadangan. Penggunaan cadangan yang disimpan secara lokal hanya merupakan opsi untuk pengujian dan penelusuran kesalahan internal.

  • Tambahkan kode ke proyek Anda. Tambahkan fungsi MiniDumpWriteDump dan kode penanganan pengecualian yang sesuai untuk menyimpan dan mengirim minidump langsung ke pengembang. Artikel ini menunjukkan cara menerapkan opsi ini. Namun, perhatikan bahwa MiniDumpWriteDump saat ini tidak berfungsi dengan kode terkelola dan hanya tersedia di Windows XP, Windows Vista, Windows 7.

Keamanan utas

MiniDumpWriteDump adalah bagian dari pustaka DBGHELP. Pustaka ini tidak aman untuk alur, sehingga program apa pun yang menggunakan MiniDumpWriteDump harus menyinkronkan semua utas sebelum mencoba memanggil MiniDumpWriteDump.

Menulis Minidump dengan Kode

Implementasi aktual mudah. Berikut ini adalah contoh sederhana tentang cara menggunakan MiniDumpWriteDump.

#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>

int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
{
    BOOL bMiniDumpSuccessful;
    WCHAR szPath[MAX_PATH]; 
    WCHAR szFileName[MAX_PATH]; 
    WCHAR* szAppName = L"AppName";
    WCHAR* szVersion = L"v1.0";
    DWORD dwBufferSize = MAX_PATH;
    HANDLE hDumpFile;
    SYSTEMTIME stLocalTime;
    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

    GetLocalTime( &stLocalTime );
    GetTempPath( dwBufferSize, szPath );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
    CreateDirectory( szFileName, NULL );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s\\%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", 
               szPath, szAppName, szVersion, 
               stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, 
               stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, 
               GetCurrentProcessId(), GetCurrentThreadId());
    hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, 
                FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

    ExpParam.ThreadId = GetCurrentThreadId();
    ExpParam.ExceptionPointers = pExceptionPointers;
    ExpParam.ClientPointers = TRUE;

    bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 
                    hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);

    return EXCEPTION_EXECUTE_HANDLER;
}


void SomeFunction()
{
    __try
    {
        int *pBadPtr = NULL;
        *pBadPtr = 0;
    }
    __except(GenerateDump(GetExceptionInformation()))
    {
    }
}

Contoh ini menunjukkan penggunaan dasar MiniDumpWriteDump dan informasi minimum yang diperlukan untuk menyebutnya. Nama file cadangan terserah pengembang; namun, untuk menghindari tabrakan nama file, disarankan untuk menghasilkan nama file dari nama aplikasi dan nomor versi, proses dan ID utas, serta tanggal dan waktu. Ini juga akan membantu menjaga minidump dikelompokkan menurut aplikasi dan versi. Terserah pengembang untuk memutuskan berapa banyak informasi yang digunakan untuk membedakan nama file minidump.

Perlu dicatat bahwa nama jalur dalam contoh sebelumnya dihasilkan dengan memanggil fungsi GetTempPath untuk mengambil jalur direktori yang ditunjuk untuk file sementara. Penggunaan direktori ini berfungsi bahkan dengan akun pengguna yang paling tidak istimewa, dan juga mencegah minidump mengambil ruang hard drive setelah tidak lagi diperlukan.

Jika Anda mengarsipkan produk selama proses build harian, pastikan juga untuk menyertakan simbol untuk build sehingga Anda dapat men-debug versi lama produk, jika perlu. Anda juga perlu mengambil langkah-langkah untuk mempertahankan pengoptimalan kompilator penuh sambil menghasilkan simbol. Ini dapat dilakukan dengan membuka properti proyek Anda di lingkungan pengembangan dan, untuk konfigurasi rilis, lakukan hal berikut:

  1. Di sisi kiri halaman properti proyek, klik C/C++. Secara default, ini menampilkan pengaturan Umum . Di sisi kanan halaman properti proyek, atur Format Informasi Debug ke Database Program (/Zi).
  2. Di sisi kiri halaman properti, perluas Linker, lalu klik Debugging. Di sisi kanan halaman properti, atur Hasilkan Info Debug ke Ya (/DEBUG).
  3. Klik Pengoptimalan, dan atur Referensi ke Emencabut Data Tidak Direferensikan (/OPT:REF).
  4. Atur Aktifkan Lipatan COMDAT untuk Menghapus COMDAT Redundan (/OPT:ICF).

Untuk informasi selengkapnya, lihat struktur MINIDUMP_EXCEPTION_INFORMATION dan fungsi MiniDumpWriteDump.

Menggunakan Dumpchk.exe

Dumpchk.exe adalah utilitas baris perintah yang dapat digunakan untuk memverifikasi bahwa file cadangan dibuat dengan benar. Jika Dumpchk.exe menghasilkan kesalahan, maka file cadangan rusak dan tidak dapat dianalisis. Untuk informasi tentang menggunakan Dumpchk.exe, lihat Cara Menggunakan Dumpchk.exe untuk Memeriksa File Cadangan Memori.

Dumpchk.exe disertakan pada CD produk Windows XP dan dapat diinstal ke System Drive\Program Files\Support Tools\ dengan menjalankan Setup.exe di folder Support\Tools\ pada CD produk Windows XP. Anda juga bisa mendapatkan versi terbaru Dumpchk.exe dengan mengunduh dan menginstal alat penelusuran kesalahan yang tersedia dari Windows Debugging Tools di Windows Hardware Developer Central.

Menganalisis Minidump

Membuka minidump untuk analisis semampu pembuatannya.

Untuk menganalisis minidump

  1. Buka Visual Studio.
  2. Pada menu File , klik Buka Proyek.
  3. Atur File bertipe ke File Cadangan, navigasikan ke file cadangan, pilih file tersebut, dan klik Buka.
  4. Jalankan debugger.

Debugger akan membuat proses yang disimulasikan. Proses yang disimulasikan akan dihentikan pada instruksi yang menyebabkan crash.

Menggunakan Server Simbol Publik Microsoft

Untuk mendapatkan tumpukan untuk crash tingkat driver atau sistem, mungkin perlu untuk mengonfigurasi Visual Studio untuk menunjuk ke server simbol publik Microsoft.

Untuk mengatur jalur ke server simbol Microsoft

  1. Pada menu Debug , klik Opsi.
  2. Dalam kotak dialog Opsi , buka simpul Penelusuran Kesalahan , dan klik Simbol.
  3. Pastikan Cari lokasi di atas hanya ketika simbol dimuat secara manual tidak dipilih, kecuali Anda ingin memuat simbol secara manual saat Anda men-debug.
  4. Jika Anda menggunakan simbol pada server simbol jarak jauh, Anda dapat meningkatkan performa dengan menentukan direktori lokal tempat simbol dapat disalin. Untuk melakukan ini, masukkan jalur untuk simbol Cache dari server simbol ke direktori ini. Untuk menyambungkan ke server simbol publik Microsoft, Anda perlu mengaktifkan pengaturan ini. Perhatikan bahwa jika Anda men-debug program di komputer jarak jauh, direktori cache mengacu pada direktori pada komputer jarak jauh.
  5. Klik OK.
  6. Karena Anda menggunakan server simbol publik Microsoft, kotak dialog Perjanjian Lisensi Pengguna Akhir muncul. Klik Ya untuk menerima perjanjian dan mengunduh simbol ke cache lokal Anda.

Men-debug Minidump dengan WinDbg

Anda juga dapat menggunakan WinDbg, debugger yang merupakan bagian dari Windows Debugging Tools, untuk men-debug minidump. WinDbg memungkinkan Anda melakukan debug tanpa harus menggunakan Visual Studio. Untuk mengunduh Windows Debugging Tools, lihat Windows Debugging Tools di Windows Hardware Developer Central.

Setelah menginstal Windows Debugging Tools, Anda harus memasukkan jalur simbol di WinDbg.

Untuk memasukkan jalur simbol di WinDbg

  1. Pada menu File , klik Jalur Simbol.

  2. Di jendela Jalur Pencarian Simbol, masukkan yang berikut ini:

    "srv\*c:\\cache\*https://msdl.microsoft.com/download/symbols;"

Menggunakan Alat Perlindungan Salin dengan Minidumps

Pengembang juga perlu menyadari bagaimana skema perlindungan salinan mereka dapat memengaruhi minidump. Sebagian besar skema perlindungan salin memiliki alat descramble mereka sendiri, dan terserah pengembang untuk mempelajari cara menggunakan alat tersebut dengan MiniDumpWriteDump.

Ringkasan

Fungsi MiniDumpWriteDump dapat menjadi alat yang sangat berguna dalam mengumpulkan dan memecahkan bug setelah produk dirilis. Menulis handler pengecualian kustom yang menggunakan MiniDumpWriteDump memungkinkan pengembang untuk menyesuaikan pengumpulan informasi dan meningkatkan proses debugging. Fungsi ini cukup fleksibel untuk digunakan dalam proyek berbasis C++dan harus dianggap sebagai bagian dari proses stabilitas proyek apa pun.