2012-08-23 9 views
5

Bir kod profiler'inin (bu durumda Drone Profiler) bir .NET uygulamasını nasıl çalıştırdığını doğrudan anlamaya çalıştığımı anlamaya çalışıyorum. Benim dev bilgisayarın .NET ile çok garip bir sorun/yolsuzluk çok garip değil içeride profilcisine dışında kendini gösterir ama hangi yüklemek ve muhtemelen Bilgisayarımın sorunu çözebilirsiniz anlayabiliyorum eğer var çünkü bu bilmemiz gerekir nedeni budur.Bir kod profilerinin içinde C# uygulamasının çalıştırılması bir dış kod profilerinin çalıştırılmasından nasıl farklıdır?

SADECE sorun, System.Net.NetworkInformation yöntemlerine yapılan çağrıları etkiliyor gibi görünüyor (ve 4'e karşı bir şey inşa edersem, yalnızca .NET 3.5 - 2.0 içinde). Sadece bir şey yapan küçük bir test uygulaması oluşturdum, System.Net.NetworkInformation.IsNetworkAvailable() işlevini çağırıyor. Profiler dışında System.dll'de "Fatal Execution Engine Error" oluştu ve bu bana verdiği tüm bilgiler. Bu hatayı anladığımdan, genellikle System.dll bazı yerel DLL'nin IsNetworkAvailable() mantığını gerçekleştirmesine izin verdiğinde gerçekleşen yerel yöntem çağrılarından kaynaklanır.

  • Ben iki durumda olayları kayıt ve bunları karşılaştırarak, içini ve Process Monitor kullanarak profil farkı dışında anlamaya çalıştı. Her iki günlükler iphlpapi.dll ve winnsi.dll sonra sadece bir an kadar dnsapi.dll ve profiler kod çalıştırmak için ilgili raporları kazasında raporlama yüklenmeye başladı profesör çalışma kodu önce çağrılana kadar aynı idi. O anda yanlış gitmiş gibi görünüyordu profiler-run kodu 4-6 yeni iş parçacığı ve non-profiler (çökmesini) kodu sadece 1 veya 2 yarattı. Ben bir şey varsa, bunun ne anlama geldiğini bilmiyorum.

benim sabit disk bazı yolsuzluk acı ve checkdisk kötü kümeleri bulma başlayana kadar iyi çalışıyordu Benim Windows 7 .NET yüklemesini (2,0 3.5) dahil arkaplan

Muhtemelen gereksiz. Sürücüyü yeni bir görüntüde görüntüledim ve her şey .NET ile bu sorun dışında iyi çalışıyor.

Windows'u yeniden yüklemeyle veya görüntü yedeklerine geri dönerek bu sorunu çözmem gerekiyor.

  • Dosyaları diffed var/en (Windows ve Program Files altında .NET şeyler) İlgili öncesi ve sonrası diski gibiydi dizinleri: Burada

    Ben içine baktım şeylerden bazılarıdır sorun ve beklemediğim hiçbir değişiklik göremedim (hiçbir belirgin dosya bozulması yok).
  • Yazılımın ve sistem kayıt defterinin disk öncesi ve sonrası sorunları giderdiği ve ilgili görünen hiçbir değişiklik görmedim.
  • Ben yeni bir kullanıcı hesabı oluşturulur ve ilişkili vaka ortamında herhangi ortam değişkenleri temizlemiş. Değişiklik yok.
  • ben "sfc/scannow" yaptım ve hiçbir bütünlük sorun bulunamadı.
  • Hasarlı olabilecek ve hiçbir şey değiştirilemeyen bir şeyi kaçırmam durumunda ön derlenmiş kodu yeniden oluşturmak için "ngen güncelleme" denedim.
  • Ben, hiçbir fark müdahale edildi olmadığını görmek için benim virüs tarayıcı kaldırıldı.
  • Ben Güvenli Mod, aynı çarpışma sayısında test kodu çalıştıran çalıştı. 2.0 sadece bunu tekrar yapmam için bir .NET yükleyici yeniden koşamam -

benim .NET yüklemesini onarmak gerekir ancak Windows 7 .NET 3.5 dahil çünkü varsayalım.Windows diske kendi kendine yeniden yüklemeyi denemek için Windows disklerine erişimim yok (bilgisayarın bir kurtarma bölümü var ama kullanılamaz); Ayrıca sürücü bir tam disk şifreleme çözümü kullanır ve yeniden yükleme zor olurdu.

Kesinlikle sıfırdan başlamak istemiyorum ve yeni bir Windows kurun, düzinelerce yazılım paketini yeniden yükleyin, düzinelerce geliştirme ile ilgili özelleştirmeleri/vb.

Bütün bunlar göz önüne alındığında ... herhangi bir yararlı tavsiyede bulunan var mı? Bir geliştirici olduğum için .NET 3.5 - 2.0 çalışmasına ihtiyacım var.

Teşekkürler!

Quinxy

cevap

1

Kısa yanıt, System.ni.dll dosyam bozuk olduğundan ben onu değiştirdim ve her şey yolunda. Net ile ilgili uzun yanıtı çözümü konusundaki yaklaşımına yoluyla başkası yardımcı olabilir

...

Sorunum uygulamalar bir profil aracılığıyla hariç aday olmayacağını şekilde hasar görmesini. Yerel olarak oluşturulmuş SlimTune open source profiler için kaynağı indirdim ve Process.Start() çağrısından hemen önce bir kesme noktası belirledim. Daha sonra, uygulamayı başarılı bir şekilde başlatmaya dahil olan tüm parametreleri elle karşılaştırarak karşılaştırdım.

  • cor_enable_profiling = 1
  • cor_profiler = {38A7EA35-B221-425a-AD07-D058C581611D}
: bulunan tek anlamlı bir fark ortam değişkenlerine ilave .NET parametreleri üzerinde ek oldu

Daha sonra bunları kendi kullanıcı ortamımda ayarlamayı denedim ve voila! Şimdi manuel olarak çalıştırdığım herhangi bir uygulama işe yarayacaktı. (Aslında aynı şeyi birkaç saat önce yapmayı denedim ama bir örnekte yer alan ve gerçek bir profilleyiciye işaret etmeyen bir GUID kullandım ve görünüşe göre .NET bunu sahte bir GUID verdiğimi biliyordu ve profilleme modunda çalıştırın.)

Şimdi geri döndüm ve uygulamanın benim profilin etkinleştirilmiş olarak çalıştırılmasının neden önemli olduğunu anlamak için CLR tarafından nasıl bir PE dosyasının yürütüldüğünü okumaya başladım.Çok şey öğrendim ama uygulanacak bir şey yoktu.

Ben ancak ben disk arızası hasar gördü dosyaları listeleme tuttu chkdsk günlüğünü yeniden kontrol gerektiğini unutmayın etmedi. başarısızlık sonra dosya yolları/isimlerin içine listelenen tüm dosya kimlikleri dönmüştü ve ben şimdi geri gitti ve ben veya 4 yerini almıştı ederken bir not bulundu görünüyordu yedekleme ama yeterince emin ne bulabildiysem 100+ dosyaları yerini aldı 5 .NET ile ilgili dosyalar başarıyla "kullanımda" olduğu için değiştiremediğim bir dosya vardı. Bu dosya mı? System.ni.dll !!! Şimdi bu dosyayı yedeklemeden değiştirebiliyordum ve benim .NET kurulumum otomatik olarak normale döndü, uygulamalar profilli olsun ya da olmasın.

sinir bozucu şey, bu olayın ilk gerçekleştiğinde ben tam hasarlı dosyaya ilgilidir ve özellikle başarısız yöntemler yer System.dll adlı bir dosyaya sorunu bekleniyor olmasıdır. Ve böylece System.dll adlı tüm dosyaları dağıttım ve reddettim. Ama o zaman System.ni.dll System.dll (veya somesuch) bir yerel derlenmiş tezahürü olduğunu fark etmedi. Ve .NET ile ilgili dizinleri çözdüm ve reddettiğimi ve bunu fark etmediğim için (bunu nasıl kaçırdığımı bilmiyorum) bu yaklaşımdan vazgeçtim.

Her neyse ... uzun hikaye kısa, benim sorunları neden olan bir System.ni.dll zarar görmüştü, içinde bir veya daha fazla küme onların içeriği 0x0 ile değiştirildi ve sadece bu yüzden tek sorun olarak tezahür oldu gözlemledi.

0

Bu bir zamanlama sorunu gibi geliyor, bu da sadece biraz daha yavaş yaparak profilci "sabit".

Birçok profil kullanıcısı, uygulamayı yavaşlatan enstrümantasyonu kullanır (more info here). Görünüşe göre, başka bir iş parçacığının biraz daha fazla iş yapabilmesi için bir iş parçacığı aşağı doğru yavaşlatır ve bu kilitlenmeyi engeller. Bu gibi hatalar genellikle kendilerini doğrudan geliştirici makinesinde göstermezler, ancak daha fazla çekirdek veya hiper iş parçacığı olan bir işlemcinin üzerinde çalıştığı anda yüzeyler. Bazen sadece serbest bırakma yapılarında (veya hata ayıklama yapılarında tersi) meydana gelirler. Aynı kodun farklı koşullarda (profiler veya debugger'da) farklı sonuçlar verebilmesi nedeniyle zamanlama sorunlarının izini bulmak zor olabilir. anlattıklarına bakılırsa

onu düzelttirmek edilebileceği konusunda bir tahminde yapmak deneriz:

deneyin yeni ipler başlatılır kaynakta bulmak için. Daha sonra yumurtladıktan sonra ana ipliği duraklatmak ve yeni konuları başlatmak için bir süre vermek için bir System.Threading.Thread.Sleep(500); hattını ekleyin.

Kaynak kod ve çakışmaların birkaç yığın izi olmadan, bu oldukça tahmin edilebilir.

+0

Gerçekten düşünce ve yorum için teşekkür ederiz. Bu çok ilginç bir hipotez. Ben bu durumda geçerli olamaz söylediklerine parçası, Ping() işlevini çağırarak bu sorunu tezahür benim demo programı (Windows proje formunu Forms varsayılan) bir hat anlamıyla olduğu göz önüne alındığında, ve her şey daha önce mükemmel çalıştı inanıyoruz disk sorunu vardı. Ama çalışma ve çalışma dışı durumlar arasında kayıt karşılaştırmak ne zaman ben vb performans monitörleri/ilgili bazı değişiklikler fark çünkü enstrümantasyon bahsetmek kısmı özellikle çok önemli olabilir. –

+0

Bu yüzden, performans sayaçlarıyla ilgili kayıt defteri değişikliklerine bir göz atmalı ve bunların herhangi bir şeyi değiştirip değiştirmediğine bakmalıyım. –