Kilitlenme Dökümü Analizi

Tüm hatalar sürümden önce bulunamaz, bu da özel durum oluşturan tüm hataların sürümden önce bulunabileceği anlamına gelir. Neyse ki Microsoft, platform SDK'sına geliştiricilerin kullanıcılar tarafından bulunan özel durumlar hakkında bilgi toplamasına yardımcı olan bir işlev eklemiştir. MiniDumpWriteDump işlevi, tüm işlem alanından tasarruf etmeden gerekli kilitlenme bilgi dökümü bilgilerini bir dosyaya yazar. Bu kilitlenme bilgi dökümü dosyası minidump olarak adlandırılır. Bu teknik makale, minidump yazma ve kullanma hakkında bilgi sağlar.

MiniDump Yazma

Minidump yazmak için temel seçenekler şunlardır:

  • Hiçbir şey yapma. Bir program işlenmeyen bir özel durum oluşturduğunda Windows otomatik olarak bir minidump oluşturur. Windows XP'den bu yana minidump'un otomatik olarak oluşturulması sağlanır. Kullanıcı izin verirse, minidump Windows Hata Bildirimi (WER) aracılığıyla geliştiriciye değil Microsoft'a gönderilir. Geliştiriciler, Windows Masaüstü Uygulama Programıaracılığıyla bu mini kuklalara erişebilir.

    WER kullanımı şunları gerektirir:

    • Authenticode kullanarak uygulamalarını imzalamak için geliştiriciler
    • Uygulamaların her yürütülebilir dosyada ve DLL'de geçerli VERSIONINFO kaynağı vardır

    İşlenmeyen özel durumlar için özel bir yordam uygularsanız, WER'ye otomatik bir minidump göndermek için özel durum işleyicisinde ReportFault işlevini kullanmanız kesinlikle istenir. ReportFault işlevi, minidump'a bağlanma ve WER'ye gönderme ile ilgili tüm sorunları işler. WER'ye minidum göndermemek, Windows için Oyunlar'ın gereksinimlerini ihlal eder.

    WER hakkında daha fazla bilgi için bkz. Windows Hata Raporlama.

  • Microsoft Visual Studio Ekip Sistemi'nden bir ürün kullanın. Hata Ayıklama menüsünde dökümü Olarak Kaydet'e tıklayarak dökümünün bir kopyasını kaydedin. Yerel olarak kaydedilmiş döküm kullanımı yalnızca şirket içi test ve hata ayıklama için bir seçenektir.

  • Projenize kod ekleyin. MiniDumpWriteDumpişlevini ve bir minidump'ı doğrudan geliştiriciye kaydetmek ve göndermek için uygun özel durum işleme kodunu ekleyin. Bu makalede bu seçeneğin nasıl uygulanacakları gösterilmektedir. Ancak MiniDumpWriteDump şu anda yönetilen kodla çalışmadığını ve yalnızca Windows XP, Windows Vista, Windows 7'de kullanılabildiğini unutmayın.

İş parçacığı güvenliği

MiniDumpWriteDump DBGHELP kitaplığının bir parçasıdır. Bu kitaplık iş parçacığı açısından güvenli olmadığından MiniDumpWriteDump kullanan tüm programlar MiniDumpWriteDumpçağrısı yapmadan önce tüm iş parçacıklarını eşitlemelidir.

Kod ile MiniDump Yazma

Gerçek uygulama basittir. Aşağıda miniDumpWriteDumpkullanmanın basit bir örneği verilmiştir.

#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()))
    {
    }
}

Bu örnekte MiniDumpWriteDump temel kullanımı ve bunu çağırmak için gereken minimum bilgiler gösterilmektedir. Döküm dosyasının adı geliştiriciye ait; ancak, dosya adı çakışmalarını önlemek için, uygulamanın adı ve sürüm numarasından, işlem ve iş parçacığı kimliklerinden ve tarih ve saatten dosya adı oluşturmanız önerilir. Bu, minidump'ların uygulama ve sürüme göre gruplandırılmış olarak tutulmasına da yardımcı olur. Minidump dosya adlarını ayırt etmek için ne kadar bilgi kullanılacağına geliştirici karar verir.

Yukarıdaki örnekteki yol adının, geçici dosyalar için belirlenen dizinin yolunu almak üzere GetTempPathişleviniçağrılarak oluşturulduğu belirtilmelidir. Bu dizinin kullanımı, en az ayrıcalıklı kullanıcı hesaplarıyla bile çalışır ve artık gerekli olmadığında mini dizinin sabit sürücü alanı kaplamasını önler.

Ürünü günlük derleme işleminiz sırasında arşivlerseniz, gerekirse ürünün eski bir sürümünde hata ayıklamak için derleme için semboller eklediğinizden de emin olun. Ayrıca, simgeler oluştururken tam derleyici iyileştirmelerini korumak için de adımlar uygulamanız gerekir. Bu işlem, projenizin özelliklerini geliştirme ortamında açarak ve sürüm yapılandırması için aşağıdakileri yaparak yapılabilir:

  1. Projenin özellik sayfasının sol tarafında C/C++ öğesine tıklayın. Varsayılan olarak, genel ayarları görüntülenir. Projenin özellik sayfasının sağ tarafında Hata Ayıklama Bilgileri Biçimi Program Veritabanı (/Zi)olarak ayarlayın.
  2. Özellik sayfasının sol tarafında Bağlayıcı genişletin ve hata ayıklama öğesine tıklayın. Özellik sayfasının sağ tarafında Hata Ayıklama Bilgisi Oluştur Evet (/HATA AYıKLAMA) olarak ayarlayın.
  3. İyileştirmeöğesine tıklayın ve Başvuruları E olarak ayarlayınBaşvurulmayan Verileri (/OPT:REF).
  4. Yedekli COMDAT'ları Kaldırma (/OPT:ICF) için COMDAT Katlama Etkinleştir'i ayarlayın.

Daha fazla bilgi için bkz. MINIDUMP_EXCEPTION_INFORMATION yapısı ve MiniDumpWriteDump işlevi.

Dumpchk.exe kullanma

Dumpchk.exe, döküm dosyasının doğru oluşturulduğunu doğrulamak için kullanılabilecek bir komut satırı yardımcı programıdır. Dumpchk.exe bir hata oluşturursa döküm dosyası bozuktur ve çözümlenemez. Dumpchk.exekullanma hakkında bilgi için bkz. Dumpchk.exe Kullanarak Bellek Dökümü Dosyasını Denetleme.

Dumpchk.exe, Windows XP ürün CD'sinde bulunur ve Windows XP ürün CD'sindeki Support\Tools\ klasöründeki System Drive\Program Files\Support Tools\ by running Setup.exe yüklenebilir. Ayrıca Windows Donanım Geliştirici MerkeziWindows Hata Ayıklama Araçları'nden sağlanan hata ayıklama araçlarını indirip yükleyerek de Dumpchk.exe en son sürümünü alabilirsiniz.

MiniDump'ları Analiz Etme

Bir minidump'ı analiz için açmak, bir tane oluşturmak kadar kolaydır.

Minidump analiz etmek için

  1. Visual Studio'yu açın.
  2. Dosya menüsünde Proje Aç 'tıklayın.
  3. türündeki Dosyaları döküm dosyaları olarak ayarlayın, döküm dosyasına gidin, dosyayı seçin ve Aç'ı tıklayın.
  4. Hata ayıklayıcısını çalıştırın.

Hata ayıklayıcı bir sanal işlem oluşturur. Sanal işlem kilitlenmeye neden olan yönergeyle durdurulacaktır.

Microsoft Genel Sembol Sunucusu'nu kullanma

Sürücü veya sistem düzeyinde kilitlenme yığınını almak için Visual Studio'yu Microsoft genel sembol sunucusuna işaret eden şekilde yapılandırmak gerekebilir.

Microsoft sembol sunucusu yolunu ayarlamak için

  1. Hata Ayıklama menüsünde Seçenekleröğesine tıklayın.
  2. Seçenekleri iletişim kutusunda Hata Ayıklama düğümünü açın ve simgeler tıklayın.
  3. Yukarıdaki konumlarda yalnızca simgeler el ile yüklendiğinde ara seçeneğinin belirlenmediğinden emin olun, hata ayıklarken simgeleri el ile yüklemek istemiyorsanız.
  4. Uzak simge sunucusunda semboller kullanıyorsanız, simgelerin kopyalanabileceği yerel bir dizin belirterek performansı geliştirebilirsiniz. Bunu yapmak için, Cache sembolleri için sembol sunucusundanbu dizine bir yol girin. Microsoft ortak sembol sunucusuna bağlanmak için bu ayarı etkinleştirmeniz gerekir. Uzak bilgisayardaki bir programda hata ayıklarken önbellek dizininin uzak bilgisayardaki bir dizine başvurduğunu unutmayın.
  5. tamam tıklayın.
  6. Microsoft genel simge sunucusunu kullandığınızdan, bir Son Kullanıcı Lisans Sözleşmesi iletişim kutusu görüntülenir. Sözleşmeyi kabul etmek ve simgeleri yerel önbelleğinize indirmek için Evet 'e tıklayın.

WinDbg ile MiniDump'ta Hata Ayıklama

Mini hata ayıklama için Windows Hata Ayıklama Araçları'nın parçası olan bir hata ayıklayıcısı olan WinDbg'yi de kullanabilirsiniz. WinDbg, Visual Studio'yu kullanmak zorunda kalmadan hata ayıklamanıza olanak tanır. Windows Hata Ayıklama Araçları'nı indirmek için bkz. Windows Donanım Geliştirici Merkeziüzerinde Windows Hata Ayıklama Araçları .

Windows Hata Ayıklama Araçları'nı yükledikten sonra WinDbg'de simge yolunu girmeniz gerekir.

WinDbg simge yolu girmek için

  1. Dosya menüsünde simge yolu öğesine tıklayın.

  2. Simgesi Arama Yolu penceresinde aşağıdakileri girin:

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

MiniDumps ile Copy-Protection Araçları Kullanma

Geliştiricilerin, kopyalama koruma düzenlerinin mini belgeyi nasıl etkileyebileceğini de bilmesi gerekir. Çoğu kopya koruma şemasının kendi descramble araçları vardır ve bu araçların MiniDumpWriteDumpile nasıl kullanılacağını öğrenmek geliştiriciye aittir.

Özet

MiniDumpWriteDumpişleviürün piyasaya sürüldükten sonra hataları toplamak ve çözmek için son derece yararlı bir araç olabilir. MiniDumpWriteDump kullanan özel bir özel durum işleyicisi yazmak, geliştiricinin bilgi koleksiyonunu özelleştirmesine ve hata ayıklama işlemini geliştirmesine olanak tanır. İşlev, C++tabanlı herhangi bir projede kullanılacak kadar esnektir ve herhangi bir projenin kararlılık sürecinin parçası olarak kabul edilmelidir.