Makale numarası: 173260 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 4.5

Hata ayıklaması eşitleme hatası

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Belirtiler

Windows NT altında bir uygulama hata ayıklaması yaptığınız sırada bir eşitleme nesnesi üzerinde bekleyen iş parçacığı (örneğin, PulseEvent() veya SetEvent()/ResetEvent() birlikte) serbest bırakılmayabilir.

Neden

Bu belirti, hata ayıklama ortamı Win32 altında ilgili bir anomaly ' dir. Yalnızca WinDBG ve Visual C++ hata ayıklayıcıyı herhangi bir sürümü de dahil olmak üzere, bir Win32 hata altında ortaya çıkar.

Çözüm

Sleep(0) PulseEvent() veya SetEvent()/ResetEvent() aramalar büyük olasılıkla bu sorunun oluşmaması için ancak bu da önce yerleştirme ya da garanti. Ne yazık ki, bu durum için garantili hiçbir geçici çözüm vardır.

Durum

Bu belirti yok, ancak hata yerine bir tarafı Windows NT altında hata ayıklama etkin olduğunu unutmayın. Bu davranışı değiştirmek için geçerli planlanmamaktadır vardır. Bu anomaly bir hata ayıklama ortamı dışında gerçekleşmeyecek dikkate almak önemlidir.

Daha fazla bilgi

Uygulama bir hata ayıklama ortamında çalışırken, bir olay nesnesi üzerinde bekleyen bir iş parçacığının serbest PulseEvent() başlatılamayabilir. Bu, kodu olup olmadığı ile hata ayıklama bilgilerini derlendi bakmaksızın geçerlidir. Bu da olup debuggee gönderilmekte "tek stepped." veya "git" komutu yürütülmeden bakılmaksızın

Sorun, birden fazla iş parçasının aynı olayı bekliyor ortaya olasılığı daha yüksektir. Bekleyen iş parçacığı yayımlamayı hatası, bu iş parçacığı tarafından OutputDebugString() neden olduğu gibi oluşan hata ayıklama olayı ise daha olası hala olur. OutputDebugString() PulseEvent() doğrudan bir ça?r? önce bir çağrı yerleştirmek hata ayıklama ortamında çıkarmasını değil, düzenli olarak bekleyen bir iş parçacığının neden etkili bir yoldur.

Win32 hata ayıklama ortamı, yaygın olarak iş parçacığı askıya aldığından olur. Bu durumda, geçerli durumu iş parçacığının çeker ve "askıya almak" bir olayda beklemeniz için neden olur. Bu tür askıda kalma, dahili olarak her hata ayıklama olayı oluşur. Iş parçacıkları, sürdürülüyor, önceki bekleme durumlarına geri yerleştirilir. Bir iş parçacığı bir hata ayıklama askıya alınmış durumdayken PulseEvent() oluşursa, bu iş parçacığı için darbeli kaybolur. Bu da bir iş parçacığının SuspendThread() kullanarak bir uygulama tarafından askıya geçerlidir.

Bu davranış, PulseEvent() için sınırlı değildir. Bekleyen iş parçacığı hızlı SetEvent()/ResetEvent() çifti de dahil olmak üzere diğer senaryolarda da, "hata ayıklama askıya için" açıktır.

Yukarıda belirtildiği gibi önce tüm PulseEvent() veya SetEvent() çağrı Sleep(0) arama bu sorunun olası bir geçici çözüm koymaktır. Bu iş parçacığı gönderilmekte fırsatı yeniden bekleyen başlatmaya devam verir, çünkü bu çoğu durumda, sorunu çözdü.

Bu anomaly bir hata ayıklama ortamı dışında gerçekleşmeyecek dikkate almak önemlidir.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows XP Professional Edition
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • Microsoft Windows Server 2003 Web Edition
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
    • Microsoft Windows Server 2003, Standard x64 Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003, Datacenter x64 Edition
    • Windows Vista Home Basic
    • Windows Vista Home Premium
    • Windows Vista Enterprise
    • Windows Vista Business
    • Windows Vista Ultimate
    • Windows Vista Starter
    • Windows Vista Business 64-bit edition
    • Windows Vista Home Premium 64-bit edition
    • Windows Vista Home Basic 64-bit edition
    • Windows Vista Ultimate 64-bit edition
    • Windows Vista Enterprise 64-bit edition
    • Windows Server 2008 Standard
    • Windows Server 2008 Enterprise
    • Windows Server 2008 Datacenter
    • Windows Server 2008 for Itanium-Based Systems
    • Windows Web Server 2008
Anahtar Kelimeler: 
kbmt kbapi kbbug kbdebug kbeventlog kbkernbase kbprb kbthreadsync KB173260 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:173260  (http://support.microsoft.com/kb/173260/en-us/ )