SORU
9 Ocak 2013, ÇARŞAMBA


Nasıl bir iç hata ayıklama yapabilirsiniz .NET çalışma Zamanı?

Büyük dosyaları işler bazı işler hata ayıklamak için çalışıyorum. Kod kendisiçalışırtek tük hatalar rapor var ama .NET kendisi Zamanı. Bağlam için işleme burada 1.5 GB bir dosya (bellek içine sadece bir kez yüklü) ve bir döngü içinde işlenen serbest bırakılması, kasten aksi takdirde öngörülemeyen bu hata yeniden deneyin.

Benim test parçası temelde

try {
    byte[] data =File.ReadAllBytes(path);
    for(int i = 0 ; i < 500 ; i  )
    {
        ProcessTheData(data); // deserialize and validate

        // force collection, for tidiness
        GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
        GC.WaitForPendingFinalizers();
    }
} catch(Exception ex) {
    Console.WriteLine(ex.Message);
    // some more logging; StackTrace, recursive InnerException, etc
}

zamanlama ve diğer bazı şeyler atılmış ()

Döngü yineleme belirli olmayan bir dizi için iyi işleyecektirtam olarak başarılı bir şekilde- sorun ne olursa olsun; bundan sonra süreci aniden sona erecektir. Özel durum işleyici vurmak değil. Testindeki dahil bir çok hafıza kullanır, ama testere dişi çok güzel esnasında her yineleme (yok bariz bir bellek sızıntısı, ve ben bir sürü baş - 14GB kullanılmayan birincil bellek dekötütestere diş noktası). İşlem 64-bit.

Windows hata günlüğü (çıkış kodu 80131506) Yürütme Motoru hata öneririm pis bir yaratık olan 3 yeni girdileri içerir. related answer, GC bir hata, "" eşzamanlı GC devre dışı bırakmak için; ancak "düzeltme" sorunu engellemez. bu düzeltmeyi öneriyor

Açıklama: Bu seviyesi düşük hata CurrentDomain.UnhandledException olay isabet etmez.

Açıklama: GC.Collect sadece izlemek testere diş donanımı, bellek, kontrol için bellek sızıntıları ve işleri devam öngörülebilir; kaldırma değil yapmak sorun git: sadece yapar onu tutmak için daha fazla bellek arasında yineleme ve yapar çap dosyaları daha büyük ;p

Daha fazla izleme konsolu ekleyerek, her sırasında hatalı olduğunu fark ettim:

  • seri kaldırma (ayırma sürü, vb) sırasında
  • GC sırasında (GC arasında "" ve bir GC "", GC kullanarak bildirim API) tamamlayın . yaklaşım
  • doğrulama (sadece bazı veriler üzerinde foreach) sırasında - çok ilginçsonra sadecebir GC "tam" doğrulama sırasında

Farklı senaryolar bir sürü.

Crash-dump (çap) dosyaları; nasıl bu derece başarısız olduğunda bu da, sistemin ne yaptığını görmek için araştırabilir miyim? edinebilirim

CEVAP
16 Ocak 2013, ÇARŞAMBA


Eğer bellek dökümleri varsa, onlara bakmak için WinDbg kullanarak, bunu zaten yapıyorsun varsayarak öneririm.

Açıklama !EEStack (ve yığın izleme yönetilen yerli karışık) çalışan çalışıyor, ve eğer yığın izleme dışarı atlamak diye bir şey olmadığını görüyor. Benim test programı, benim bir FEEE (kasten öbek bozulmasını ben) nerede yığın izleme gibi zamanın bu bir tane buldum:

0:000> !EEStack
---------------------------------------------
Thread   0
Current frame: ntdll!NtWaitForSingleObject 0xa
Child-SP         RetAddr          Caller, Callee
00000089879bd3d0 000007fc586610ea KERNELBASE!WaitForSingleObjectEx 0x92, calling ntdll!NtWaitForSingleObject
00000089879bd400 000007fc5869811c KERNELBASE!RaiseException 0x68, calling ntdll!RtlRaiseException
[...]
00000089879bec80 000007fc49109cf6 clr!WKS::gc_heap::gc1 0x96, calling clr!WKS::gc_heap::mark_phase
00000089879becd0 000007fc49109c21 clr!WKS::gc_heap::garbage_collect 0x222, calling clr!WKS::gc_heap::gc1
00000089879bed10 000007fc491092f1 clr!WKS::GCHeap::RestartEE 0xa2, calling clr!Thread::ResumeRuntime
00000089879bed60 000007fc4910998d clr!WKS::GCHeap::GarbageCollectGeneration 0xdd, calling clr!WKS::gc_heap::garbage_collect
00000089879bedb0 000007fc4910df9c clr!WKS::GCHeap::Alloc 0x31b, calling clr!WKS::GCHeap::GarbageCollectGeneration
00000089879bee00 000007fc48ff82e1 clr!JIT_NewArr1 0x481

Bu çöp toplayıcı yığın bozulması ile ilgili olabilir bu yana, !VerifyHeap komutunu deneyin. En azından öbek sağlam olduğundan emin olun (ve senin sorunun başka yerde yapın sorunu gerçekten GC ile olabilir keşfetmek olabilir veya bazı P rutinleri bozgunculuk Çağırmak/.

Eğer yığın bozuk olduğunu fark ederseniz, denemek ve !HeapStat) yapmak mümkün olabilir, bozuk, olduğunu nasıl keşfetmek olabilir. Bu sadece, tüm yığın bir yerden bozuk olsa da gösterebilir.

Zor kodunuzun ne yaptığını ya da yapısı nasıldır hakkında gerçek hiçbir fikrim yok bu yana herhangi bir diğer yöntemleri bu analiz için WinDbg üzerinden öneririz.

Eğer bu öbek ile ilgili bir sorun olduğunu fark ederseniz sanırım ve GC gariplik olabilir anlamı, İzleme için Windows Olay CLR GC events bakar böylece.


Alacağın döküm kesim değilveWindows 7/2008R2 kullanıyorsanız veya daha sonra, eğer WER bir bildirim alıyorsanız değil Küresel Bayrakları (gflags.exe süreç istisnasız sonlandırıldığında hata ayıklayıcı eklemek için kullanabilirsiniz.

Silent Process Exit sekmesinde, programın ismini girindeğilbunun tam yolunu (örn. * *10). Aşağıdaki ayarları kullanın:

  • Sessiz Etkinleştirmek İşlem Çıkış İzleme Kontrol Edin
  • Fırlatma Monitör Proses Kontrol Edin
  • İzleme İşlemi için, {path to debugging tools}\cdb.exe -server tcp:port=5005 -g -G -p %e kullanın.

Ve bu Ayarları Uygula.

Test programı çöküyor, KT ve sizin için bağlanmak için takın bekleyin. WinDbg, Ctrl R başlatın ve bağlantı dizesi kullanın: tcp:port=5005,server=localhost.

Uzaktan hata ayıklama kullanarak atlayın ve bunun yerine {path to debugging tools}\windbg.exe %e kullanmak mümkün olabilir. Ancak, neden uzak yerine önerdim, kayıt defterini okur nedir ve izleme süreci başlattı inandığım WerFault.exe,, Oturum 0 hata ayıklayıcı başlar çünkü.

Oturum 0 etkileşimli ve pencere istasyonu bağlanmak, ama bunun nasıl yapıldığını hatırlamıyorum. Eğer açık vardı mevcut herhangi bir windows erişmek gerekirse geri oturumlar arasında geçiş yapmak istediğin için de rahatsız edici değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Bach Vlogs

    Bach Vlogs

    18 HAZİRAN 2011
  • RocketJump

    RocketJump

    22 ŞUBAT 2006