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
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.
Nasıl ters çalışma hata ayıklama?...
Nasıl node.js uygulama hata ayıklama...
Nasıl hata ayıklama Firebug (veya benz...
Nasıl Google hata ayıklama iletileri y...
Nasıl PHP betikleri hata ayıklama musu...