Yönetilen Hata Ayıklama Yardımcılarıyla Hataları Tanılama

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilen hata ayıklama yardımcıları (MDA) çalışma zamanı durumu hakkında bilgi sağlamak için ortak dil çalışma zamanı (CLR) ile çalışan hata ayıklama yardımcılarıdır. Yardımcılar, aksi takdirde yakalayamayacağınız çalışma zamanı olayları hakkında bilgi iletileri oluşturur. Yönetilen ve yönetilmeyen kod arasında geçiş yaparken ortaya çıkan bulması zor uygulama hatalarını yalıtmak için MDA'leri kullanabilirsiniz.

Windows kayıt defterine bir anahtar ekleyerek veya bir ortam değişkeni ayarlayarak tüm MDA'ları etkinleştirebilir veya devre dışı bırakabilirsiniz. Uygulama yapılandırma ayarlarını kullanarak belirli MDA'leri etkinleştirebilirsiniz. Uygulamanın yapılandırma dosyasındaki bazı tek MDA'ler için ek yapılandırma ayarları ayarlayabilirsiniz. Çalışma zamanı yüklendiğinde bu yapılandırma dosyaları ayrıştırıldığı için yönetilen uygulama başlamadan önce MDA'i etkinleştirmeniz gerekir. Zaten başlatılmış uygulamalar için MDA'i etkinleştiremezsiniz.

Aşağıdaki tabloda .NET Framework ile birlikte gelen MDA'lar listelenmektedir:

MDA
asynchronousThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Varsayılan olarak, .NET Framework yönetilen tüm hata ayıklayıcıları için bir MDA alt kümesini etkinleştirir. Hata Ayıklama menüsünde Windows>Özel Durum Ayarları'nıseçip Yönetilen Hata Ayıklama Yardımcıları listesini genişleterek Visual Studio'da varsayılan kümeyi görüntüleyebilirsiniz.

Visual Studio'da Özel Durum Ayarları penceresi

MDA'ları Etkinleştirme ve Devre Dışı Bırakma

Bir kayıt defteri anahtarını, bir ortam değişkenini ve uygulama yapılandırma ayarlarını kullanarak MDA'leri etkinleştirebilir ve devre dışı bırakabilirsiniz. Uygulama yapılandırma ayarlarını kullanmak için kayıt defteri anahtarını veya ortam değişkenini etkinleştirmeniz gerekir.

İpucu

MDA'ları devre dışı bırakmak yerine, MDA bildirimi alındığında Visual Studio'nun MDA iletişim kutusunu görüntülemesini engelleyebilirsiniz. Bunu yapmak için, Hata Ayıkla menüsünde Windows>Özel Durum Ayarları'nıseçin, Yönetilen Hata Ayıklama Yardımcıları listesini genişletin ve ardından tek tek MDA için Oluşturulurken Kes onay kutusunu seçin veya temizleyin.

Kayıt Defteri Anahtarı

MDA'ları etkinleştirmek için HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ ekleyin . Windows kayıt defterindeki NETFramework\MDA alt anahtarı (REG_SZ, değer 1 yazın). Aşağıdaki örneği MDAEnable.reg adlı bir metin dosyasına kopyalayın. Windows Kayıt Defteri Düzenleyicisi'ni (RegEdit.exe) açın ve Dosya menüsünden İçeri Aktar'ı seçin. O bilgisayarda MDA'ları etkinleştirmek için MDAEnable.reg dosyasını seçin. Alt anahtarın 1 dize değerine ayarlanması (DWORD değerinin 1 olmaması) ApplicationName.suffix.mda.config dosyasından MDA ayarlarının okunmasını sağlar. Örneğin, Not Defteri için MDA yapılandırma dosyası notepad.exe.mda.config olarak adlandırılabilir.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Bilgisayar 64 bit işletim sisteminde 32 bit bir uygulama çalıştırıyorsa MDA anahtarı aşağıdaki gibi ayarlanmalıdır:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

Daha fazla bilgi için bkz . Uygulamaya Özgü Yapılandırma Ayarları . Kayıt defteri ayarı ortam değişkeni tarafından COMPLUS_MDA geçersiz kılınabilir. Daha fazla bilgi için bkz . Ortam Değişkeni .

MDA'ları devre dışı bırakmak için Windows Kayıt Defteri Düzenleyicisi'ni kullanarak MDA alt anahtarını 0 (sıfır) olarak ayarlayın.

Bir hata ayıklayıcıya bağlı bir uygulamayı çalıştırdığınızda kayıt defteri anahtarı bile eklemeden bazı MDA'ler varsayılan olarak etkinleştirilir. Bu bölümde daha önce açıklandığı gibi MDADisable.reg dosyasını çalıştırarak bu yardımcıları devre dışı bırakabilirsiniz.

Ortam değişkeni

MDA etkinleştirmesi, kayıt defteri anahtarını geçersiz kılan ortam değişkeni COMPLUS_MDAtarafından da denetlenebilir. Dize COMPLUS_MDA , MDA adlarının veya diğer özel denetim dizelerinin büyük/küçük harfe duyarlı olmayan, noktalı virgülle ayrılmış bir listesidir. Yönetilen veya yönetilmeyen hata ayıklayıcı altında başlamak varsayılan olarak bir MDA kümesini etkinleştirir. Bu, varsayılan olarak hata ayıklayıcılarda etkinleştirilen, noktalı virgülle ayrılmış MDA listesini ortam değişkeninin veya kayıt defteri anahtarının değerine açıkça ekleyerek yapılır. Özel denetim dizeleri şunlardır:

  • 0 - Tüm MDA'leri devre dışı bırakır.

  • 1- ApplicationName.mda.config dosyasından MDA ayarlarını okur.

  • managedDebugger - Yönetilen bir yürütülebilir dosya hata ayıklayıcı altında başlatıldığında dolaylı olarak etkinleştirilmiş tüm MDA'leri açıkça etkinleştirir.

  • unmanagedDebugger - Yönetilmeyen bir yürütülebilir dosya hata ayıklayıcı altında başlatıldığında dolaylı olarak etkinleştirilmiş tüm MDA'leri açıkça etkinleştirir.

Çakışan ayarlar varsa, en son ayarlar önceki ayarları geçersiz kılar:

  • COMPLUS_MDA=0, dolaylı olarak bir hata ayıklayıcıda etkinleştirilmiş olanlar dahil olmak üzere tüm MDA'leri devre dışı bırakır.

  • COMPLUS_MDA=gcUnmanagedToManaged, bir hata ayıklayıcıda dolaylı olarak etkinleştirilen MDA'lere ek olarak gcUnmanagedToManaged öğesini etkinleştirir.

  • COMPLUS_MDA=0;gcUnmanagedToManaged, gcUnmanagedToManaged öğesini etkinleştirir, ancak aksi takdirde dolaylı olarak bir hata ayıklayıcıda etkinleştirilecek olan MDA'leri devre dışı bırakır.

Uygulamaya Özgü Yapılandırma Ayarları

Uygulamaya ait MDA yapılandırma dosyası içinde bazı yardımcıları etkinleştirebilir, devre dışı bırakabilir ve ayrı ayrı yapılandırabilirsiniz. MDA'ları yapılandırmak üzere bir uygulama yapılandırma dosyasının kullanımını etkinleştirmek için MDA kayıt defteri anahtarı veya COMPLUS_MDA ortam değişkeni ayarlanmalıdır. Uygulama yapılandırma dosyası, genellikle uygulamanın yürütülebilir (.exe) dosyası ile aynı dizinde bulunur. Dosya adı ApplicationName.mda.config biçimindedir; örneğin, notepad.exe.mda.config. Uygulama yapılandırma dosyasında etkinleştirilen yardımcıların, bu yardımcının davranışını denetlemek için tasarlanmış öznitelikleri veya öğeleri olabilir.

Aşağıdaki örnekte hazırlamayı etkinleştirme ve yapılandırma gösterilmektedir:

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

MDA, Marshaling uygulamadaki her yönetilenden yönetilmeyene geçiş için yönetilmeyen bir türe göre yapılandırılmış yönetilen tür hakkındaki bilgileri yayar. Marshaling MDA ayrıca methodFilter ve fieldFilter alt öğelerinde sağlanan yöntem ve yapı alanlarının adlarını sırasıyla filtreleyebilir.

Aşağıdaki örnekte, varsayılan ayarlarını kullanarak birden çok MDA'nın nasıl etkinleştirileceği gösterilmektedir:

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Önemli

Bir yapılandırma dosyasında birden fazla yardımcı belirttiğinizde, bunları alfabetik olarak listelemeniz gerekir. Örneğin, virtualCERCall ve invalidCERCall MDA'lerinin her ikisini de etkinleştirmek istiyorsanız <invalidCERCall /> girdisinden önce <virtualCERCall /> girdisini eklemeniz gerekir. Girdiler alfabetik sırada değilse, işlenmemiş bir geçersiz yapılandırma dosyası özel durum iletisi görüntülenir.

MDA özel durumları

MDA etkinleştirildiğinde, kodunuz bir hata ayıklayıcı altında yürütülmediğinde bile etkin olur. Bir hata ayıklayıcı olmadığında bir MDA olayı oluşturulursa, işlenmemiş özel bir durum olmasa bile olay iletisi, işlenmemiş özel durum iletişim kutusunda sunulur. İletişim kutusunu önlemek için kodunuz hata ayıklama ortamında çalışmıyorken MDA etkinleştirme ayarlarını kaldırın.

Kodunuz Visual Studio tümleşik geliştirme ortamında (IDE) yürütürken, belirli MDA olayları için görüntülenen özel durum iletişim kutusundan kaçınabilirsiniz. Bunu yapmak için Hata Ayıkla menüsünde Windows>Özel Durum Ayarları'nı seçin. Özel Durum Ayarları penceresinde, Yönetilen Hata Ayıklama Yardımcıları listesini genişletin ve ardından tek tek MDA için Oluşturulurken Kes onay kutusunu temizleyin. MDA özel durum iletişim kutularının görüntülenmesini etkinleştirmek için bu iletişim kutusunu da kullanabilirsiniz.

MDA Çıktısı

MDA çıktısı, MDA'dan alınan çıkışı gösteren aşağıdaki örneğe PInvokeStackImbalance benzer:

'MDATest! PInvoke işlevine çağrı MDATest.Program::StdCall' yığının dengesini kaldırmış. Bunun nedeni büyük olasılıkla yönetilen PInvoke imzasının yönetilmeyen hedef imzayla eşleşmemesidir. PInvoke imzasının çağrı kuralının ve parametrelerinin hedef yönetilmeyen imzayla eşleşip eşleşmediğini denetleyin.

Ayrıca bkz.