2010-07-27 29 views
5

Visual Studio 2010 kullanıyorum ve C# kodlama yapıyorum. Projemde kullandığım üçüncü taraf bir dll var. Belirli bir yöntemi kullanmayı denediğimde, görünüşte rastgele durumlarda, program sadece bir istisna olmaksızın çöker. Seans sadece sona erer. Neler olup bittiğini takip etmenin bir yolu var mı?Üçüncü taraf dll, özel durumun olmadığı bir program çöküyor

+0

Bir programın arkasından çıkan en tipik neden, herhangi bir hata iletisi veya hiçbir şey yok, yığın taşmasıdır. Bu durumda, program hata mesajını sunmak için yeterli yığına sahip değildir ve Windows bunu sonlandırır. Bu olabilir mi? –

+0

VS'yi, dark_charlie'nin yorumuna göre StackOverflow ve AccessViolation istisnalarını atmasını sağlayacak şekilde ayarlıyorum.ama hiçbir şey olmuyor – sbenderli

cevap

19

Windows'da işlenen bir iş parçacığı yığınının yolu bu şekilde gider (kabaca; bu, devam eden her şeyin tam bir tanımı değildir, sadece size veri vermek için yeterlidir. Ve CLR'nin yığın sayfalarını işleme biçimi yönetilmeyen kodun da nasıl işlediğinden biraz farklıdır.)

Yığının üst kısmında, kullandığınız tüm sayfalar vardır. Sonra bir "koruma sayfası" var - eğer o sayfaya vurursanız, koruma sayfası yeni bir yığın sayfası haline gelir ve aşağıdaki sayfa yeni koruma sayfası olur. Ancak, yığınının son sayfa özeldir. Bir kez vurursanız, yığın taşması istisnası alırsınız. nu'a iki kez vurursanız, işlem 'u derhal olarak sonlandırır. "Hemen" ile "hemen" demek istiyorum - bir istisna yok, doğrudan hapishaneye git, gitme, 200 dolar toplama. İşletim sistemi, bu noktada işlemin derinden hastalığa neden olduğu ve muhtemelen kullanıcı için aktif olarak düşman haline gelmiştir. Yığın taşmış ve yığında taşan kod, belleğe keyfi olarak fazla çöp yazmaya çalışıyor olabilir. (*)

İşlem, kendisi ve başkaları için potansiyel bir tehlike oluşturduğundan, işletim sistemi daha fazla kodun çalışmasına izin vermeden onu kapatır.

Şüphelenmeniz, yönetilmeyen kodunuzdaki bir şeyin son yığın sayfasına iki kez çarpmasıdır. Hemen hemen her gördüğümde bir süreç aniden yok olur ya da başka bir açıklama ile kaybolur çünkü "benimle dalga geçme" yığını sayfası vuruldu.

(*) 1990'ların başında, NetWare adlı küçük bir işletim sistemi için veritabanı sürücüleri üzerinde çalıştım. Daha modern işletim sistemlerinin şu anda rutin olarak sahip olduğu bu tür korumalara sahip değildi. Çekirdek koruma seviyesinde çalışırken dinamik olarak "yığınları değiştirebilme" ihtiyacım vardı; Şoförün kazayla kazara üflediğini biliyordum çünkü sonunda ekran hafızasına yazıyordu ve daha sonra, sorunun hangi ekrana doğrudan yazıldığına bakarak hata ayıklayabiliyordum. Ah, o günlerdi.

3

Hata ayıklayıcısını, özellikle de İhlal İhlali ve Yığın Taşması gibi kötü durumları bile ele alan özel durumları yakalamak için zorlamaya çalışın. Bunu Debug -> İstisnalar bölümünde yapabilirsiniz. Üçüncü taraf DLL'nin tüm özel durumları yakalaması ve daha sonra tüm programdan çıkan exit() veya bazı benzer güzelliği çağırması mümkündür.

+0

Ben StackOverflow ve AccessViolation istisnalar hem atılır, ancak yine, hiçbir şey atılır ki ayarlayın. – sbenderli

+0

Bu dll için kullanılabilir hata ayıklama sembolleriniz var mı? Bu DLL hangi dilde yazılmıştır? Yönetilen veya yönetilmeyen bir DLL mi? Ayrıca istisnalar penceresindeki her şeyi kontrol etmeyi deneyebilir ve bekleyebilirsiniz :) –

+0

Bu bir interop dll'dir. .NET framework yüklü ise, Primary Interop Assembly de Global Assembly Cache (GAC) içine yüklenir diyor. Bu yönetilen anlamına mı geliyor? – sbenderli

2

Windows Olay Günlüğü'u kontrol ettiniz mi? Buna Yönetici Araçları menüsü> Etkinlik Görüntüleyici'den erişebilirsiniz. Özellikle Uygulama ve Sistem kayıtlarını kontrol edin.

+0

Günlüklerinde hiçbir şey yok :( – sbenderli

0

Üçüncü taraf dll'niz yönetiliyorsa, Runtime Flow (benim tarafımdan geliştirilmiştir) kullanarak, çökmeden önce içinde ne olduğunu görebilirsiniz - yığın taşması, zorlu çıkış veya istisna açıkça tanımlanabilir.

İlgili konular