SORU
17 Mart 2014, PAZARTESİ


Neden yapar .NET StackOverflowException atıldığında çok kötü davranır?

Bu StackOverflowExceptions farkındayım .NET yakalanmış olamaz, süreci aşağı çekmek, ve yığın izleme yok. Bu resmen on MSDN belgelenmiştir. Ancak, (veya) diğer teknik nedenlerden davranışın arkasında ne olduğunu merak ediyorum. Tüm MSDN diyor

Bu önceki sürümlerinde .NET Çerçeve, uygulama yakalamak olabilir StackOverflowException bir nesne (örneğin, kurtarmak için sınırsız özyineleme). Ancak, bu uygulama şu anda önerilmez önemli ek kod güvenilir bir yakalamak için gereklidir çünkü yığın taşması özel durumu ve programın çalışması devam ediyor.

Nedir bu "önemli ek kod"? Bu davranış için diğer belgelenmiş sebep var mı? Eğer KİT yakalayabiliriz bile, neden en azından bir yığın izleme alabilir mi? Birçok ortak çalışanlar ve sadece birkaç saat bir yığın izleme ile birkaç dakika alırdı üretim StackOverflowException hata ayıklama içine battı, eğer benim acı için iyi bir nedeni varsa merak ediyorum.

CEVAP
17 Mart 2014, PAZARTESİ


Bir iş parçacığı yığın Windows tarafından oluşturulur. Sözde kullanırkoruma sayfalarıbir yığın taşması tespit edebilmek için. this MSDN Library article açıklandığı gibi genellikle kullanıcı modu kodu için kullanılabilir bir özellik. Temel fikir, son iki sayfa (2 x 4096 = 8192 bayt) yığınısaklıdırve onlara herhangi bir işlemci erişimi, STATUS_GUARD_PAGE_VİOLATİON SEH bir istisna oldu o sayfa bir hata tetikler.

Bu sayfa bir iş parçacığı yığınının ait olması durumunda, çekirdek tarafından engellenebilir. Bu 2 sayfa için koruma niteliklerini, böylece konu biraz acil uzay kaza ile başa çıkmak için yığın vererek değiştirir, sonra tekrar arttıran STATUS_STACK_OVERFLOW bir durum.

Bu durum da CLR tarafından engellenebilir. Bu noktada yığın boşluğu sol yaklaşık 7 kilobayt var. Bu ise, için, yeterli çalıştırmak için Just-in-time derleyici (Titreme) kodunu derlemek için olabilir anlaşma ile istisna programı, Jetta ihtiyacı çok fazla yer yok. CLR bu nedenle başka bir şey yapamaz ama terbiyesizce konu iptal. Ve tarafından .Ayrıca işlemi sona erdirir NET 2.0 politikası.

Bu yürütülebilir kullanıcı kodu çalıştırabilirsiniz bir garantisi yok o yüzden bu Java, JİTted henüz hazır değil bayt kodu yorumlayacak bir sorun olmadığını açıklıyor. Ya da olmayan yönetilen bir program C, C veya Delphi gibi dillerde yazılmış kod oluşturma zaman oluşturulur. Hala birçokaksilik uğraşmak zor, yığın acil alan iş parçacığı üzerinde kod çalıştırmak için sürekli güvenli olduğu senaryo yok bunu yapmak için üflenir. Bir program düzgün bir iş parçacığı tamamen rastgele bir yerde durduruldu ve bozuk devlet yerine birlikte çalışmaya devam olasılığını oldukça düşük bir olasılıktır.

Eğer orada herhangi bir çaba hiç dikkate alarak yetiştirmek bir olay hakkında başka bir iş parçacığı veya kaldırma kısıtlama içinde winapı (sayı görevlisi sayfaları değil ayarlanabilir) o zaman ya çok iyi korunan sırrı, ya da adil olmadığını kabul kullanışlı. Ben ikinci şüpheli, bunu bilmiyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • sWooZie

    sWooZie

    9 ŞUBAT 2006
  • ThePhestor

    ThePhestor

    22 Mart 2011
  • Viktorija A.

    Viktorija A.

    28 Mart 2009