Korumalı belleği okuma veya yazma girişimi. Bu genellikle diğer belleğin bozuk olduğunun bir göstergesidir


144

Birisi beni bu hata neden olabilir hakkında aydınlatabilir umuyoruz:

Korumalı belleği okuma veya yazma girişimi. Bu genellikle diğer belleğin bozuk olduğunun bir göstergesidir.

Gerçekten bu kodu uygulamanın herhangi bir rastgele atılmış gibi görünüyor çünkü kod gönderemiyorum. Uygulama, hata atmadan önce 12-48 saat arasında herhangi bir yerde çalışır. Bazen görünüşte rastgele bir noktada durur ve yukarıdaki hatayı atar, diğer zamanlarda tüm uygulama durur ve satırlarda bir şey söyleyen bir hata ile bir ekran alıyorum. CLR hata veya ... "PInvoke veya diğer ilgili olmayan bilgiler hakkında bir şey. Bu durumda, tüm iş parçacıkları sonlandırılmış gösterir ve hata ayıklama bilgisi yoktur.

Özetle, uygulamanın yaptığı budur:

Onun tamamen C # ile yazılmış bir çok iş parçacıklı sunucu uygulaması. İstemciler sunucuya soket üzerinden bağlanır. Sunucu, istemciler için birbirleriyle ve ortamla etkileşim kurabilecekleri bir sanal "ortam" çalıştırır. Biraz bellek tüketiyor ama sızdığını görmüyorum. Genellikle yaklaşık 1,5 GB tüketir. Sızıntı olduğunu sanmıyorum çünkü bellek kullanımı uygulamanın tüm süresi boyunca nispeten sabit kalıyor. Müşteriler hiçbir şey yapmasa bile çevreyi korumak için sürekli çalışan kodu. Hiçbir üçüncü taraf yazılımı veya başka API kullanmaz. Bu uygulamanın kullandığı tek dış kaynaklar soket bağlantıları ve SQL veritabanı bağlantılarıdır. 64bit sunucuda çalışıyor. .Net 2.0, 3.5 ve 4 kullanarak VS2008 ve VS2010 bu hata ayıklama denedim.

Derleyici optimizasyonlarını ve birkaç microsoft hot-fix'leri kapatmayı denedim. Hiçbir şey bu sorunu ortadan kaldırmaz gibi görünüyor. Herhangi birinin olası nedenleri veya soruna neden olan şeyi tanımlamanın bir tür yolunu bilmesi takdir edilecektir.


lütfen tam çağrı yığınını gönderin ...
Mitch Wheat


Yaklaşık yarısı çağrı yığınını alamıyorum. Önemli yürütme hatasını atarsa, hiçbir hata ayıklama bilgisi yoktur. Kodda bir yerde durduğu zamanlar, hiçbir şey anormal görünmüyor. Hatta tüm aktif iş parçacıklarından geçtim ve çatışmaya neden olabilecek herhangi bir şey görmedim. Bellek bozulmasının hata atmadan bir süre önce gerçekleştiğini varsayıyorum.
Başka Birisi

Kullanılan eski eski COM ve ActiveX bileşenlerini kontrol edin. Ayrıca SQLCE'nin çok iş parçacıklı bir ortamda bu şekilde çıktığını biliyorum.
leppie

COM veya ActiveX bileşeni yoktur.
Başka Birisi

Yanıtlar:


50

Ben sadece VS 2013 .NET 4.5'te bir MapInfo DLL ile bu sorunla karşı karşıya. Sorun şu ki, Platform için Derleme'yi x86'dan Herhangi Bir CPU'ya değiştirdim ve bu hatayı tetiklemek için yeterliydi. Geri x86 olarak değiştirmek hile yaptı. Birine yardım edebilir.


1
x86 ile nasıl değiştirdiniz? Ben sadece bu talimatla aynı problemle yüzleşiyorum CSingleLock lock(&m_csMember, TRUE);. Daha fazla detay için, işte benim
yazım

VS 2012/2013'te Proje Özellikleri-> Oluşturun ve "Platform Hedefi" ni istediğiniz gibi değiştirin. Bunu değiştirebileceğiniz başka bir yer olmasına rağmen, ama bulamıyorum gibi görünüyor, ancak her iki yolun da aynı sonucu elde etmesi gerektiğini düşünüyorum .
Sergey

Aslında VS 2013 kullanıyorum ve x86 olarak yapılandırıldı: /
ABCmo

1
Sorununuz birçok şeyden kaynaklanabilir, derleme platformunu değiştirerek sorunumu çözdüğüme gerçekten şaşırdım. Şanslı bir kaçış diyebilirsiniz.
Sergey

Bu çözümle birlikte bu çözüm benim için çözdü.
Zach Posten

23

Visual Studio (VS) 2010 ile de bu sorunla karşı karşıya kaldım. Daha ilginç bir şekilde, çözümümde birkaç konsol vardı (Konsol uygulaması, WPF uygulaması, Windows Forms uygulaması) ama sadece "Konsol Uygulaması" türünü ayarlıyordum çözümün başlangıç ​​projesi olarak projenin (Kelimenin tam anlamıyla kodu olmayanlar veya proje şablonunun kendisiyle gelen varsayılanlar dışında belirtilen ek meclisler için bile).

Sonunda yapılan değişiklik nihayet sorunu çözmeme yardımcı oldu: Konsol uygulama projesinin proje özelliklerine gidin (Alternatif olarak, çözüm gezgininde proje dosyasını seçin ve Alt + Entertuş bileşimine ) -> DebugSekmeye git -> Enable DebuggersSağ bölmedeki bölüme ilerleyin -> Kontrol et Enable unmanaged code debuggingaşağıda anlık gösterildiği gibi onay kutusu -> tıkla Floppyproje özelliklerini kaydetmek için araç çubuğundaki düğmesini. Bunun nedeninin temel nedeni hala bilinmiyor. Gözlemlediğim tek şey, daha önce ofis güncellemeleri ve işletim sistemi güncellemelerinden (bir düzineden fazla KB makalesi) oluşan bir önceki gece makineme yüklenmiş birçok windows güncellemesi olmasıydı.

resim açıklamasını buraya girin

Güncelleme : VS 2017'den itibaren ayar adı aşağıdaki ekran görüntüsünde gösterildiği gibi değişti:

resim açıklamasını buraya girin


1
VS 2017 tarihi itibariyle bu "olarak değiştirildi ayıklama yerel kod Enable "
Chiramisu

1
Güncel bilgiler sağladığınız ve topluluğa yardım ettiğiniz için @Chiramisu'ya teşekkürler. Cevabı, Visual Studio'nun yeni sürümleri için uygun hale getirmek üzere güncelledim.
RBT

19

Sonunda bunu WinDBG ve SOS yardımıyla takip ettim. Erişim ihlali, bilinmeyen bir DLL tarafından atıldı. Sorunlara "Nvidia Network Manager" adı verilen bir yazılım parçası çıkıyor. Ben bu sorunu güvenlik duvarları veya antivirüs nedeniyle neden olabilir sayısız kez okurdum, ne de kullanıyorum bu yüzden bu fikri reddetti. Ayrıca, farklı donanım kullanan 1'den fazla sunucuda gerçekleştiği için çevresel olmadığı varsayımı altındaydım. Bunu test ettiğim tüm makinelerin "NVidia Network Manager" çalıştırdığı anlaşılıyor. Anakart sürücülerinin geri kalanıyla birlikte kurulduğuna inanıyorum.

İnşallah bu sorun benim başvuru çok uzun bir süre rahatsız oldu gibi birine yardımcı olur.


1
benim durumumda sık sık veri atma hatası aygıttan okudum, bir sonraki okuma için Thread.Sleep (1000) kullanarak bir süre için iplik durdurmak vardı. ve mükemmel çalışıyor.
JRB


79
En çok oylanan cevap mantıklı bir cevap vermez.
Teoman shipahi

Anakartımda veya yazılımımda nvidia ile ilgili bir şeyim olduğundan şüpheliyim. Visual Studio 2010 kullanıyorum. Sorun yalnızca VS projede hata ayıklama sırasında oluşur. Hata ayıklama klasöründen çıkış exe mükemmel çalışıyor.
RBT

1
Soruna neden olan kendi sürecimin Konularına erişiyorum.
Muhammed Saqib

13

Sorun, projedeki karma derleme platformları DLL'lerinden kaynaklanıyor olabilir. yani herhangi bir CPU projenizi oluşturmak ama x86 platformu için zaten projede bazı DLL var. Bunlar, 32bit ve 64bit mimarinin farklı bellek eşlemesi nedeniyle rastgele çökmelere neden olur. Tüm DLL'ler tek bir platform için oluşturulmuşsa, sorun çözülebilir.



8

Bu hata yönetilen kodda olmamalıdır. Bu sorunu çözebilir:

Bu özel durumu atlamak için Visual Studio Hata Ayıklayıcı'ya gidin:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

Umarım yardımcı olur.


3
Senin için işe yaramadığı için özür dilerim. Bu hata birçok nedenden dolayı ortaya çıktı, diye düşündüm, yayınladığım çözüm, neden JIT optimizasyonu ise başka biri için sorunu çözebilir.
meraklıErkek

6

Bugün bu istisna ile karşılaştım ve bir çözüm buldum. Soyut bir sınıfta sanal yöntem olarak adlandırılan bir birim sınamasında (NUnit) hata ayıklamaya çalışırken oluyordu.

Sorun .NET 4.5.1 yüklemesiyle ilgili gibi görünüyor.

.NET 4.5.2'yi indirdim ve yükledim (projelerim hala .NET 4.5.1'e başvuruyor) ve sorun çözüldü.

Çözümün kaynağı:

https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception


5

Donanım olabilir. Karmaşık bir şey olabilir ... ama ben bir yerde iş parçacığı kodu uygun bir kilit ile bazı koleksiyonu (sözlük gibi) korumak olmadığını öneren bir bıçak alır.

Hangi işletim sistemi ve hizmet paketini kullanıyorsunuz?


1
XP 64 SP2 çalıştırılıyor. Bu birden çok sunucuda oldu. Her şeyden çok kez geçtim ve iş parçacığı güvenli olmayan bir şey görmüyorum. Ayrıca erişim viloation yerine bir koleksiyon değiştirilmiş hata alıyorum olmaz mı?
Başka Birisi

5

Bir proje için geliştirme sunucusunu değiştirdiğimde bu sorunu yaşadım. Yeni bir OracleConnection değişkeni bildirdiği kod satırında bu hatayı alıyordum.

Düzeltmeleri yüklemek de dahil olmak üzere birçok şeyi denedikten sonra, projede Oracle.DataAccess ve System.Data.OracleClient referanslarını değiştirmeyi denedim ve işe yaradı!

Bir proje yeni bir makineye taşındığında, o projeye eklenen tüm referansları yenilemenizi öneririm.



4

Aynı sorunla karşılaştım. Kodum AutoCAD 2012 içinde çalışan bir .NET dll (AutoCAD uzantısı) oldu. Ayrıca Oracle.DataAccess kullanıyorum ve kodum ExecuteNonQuery () sırasında aynı özel durum atıyordu. Neyse ki kullandığım ODP'nin .net sürümünü değiştirerek (Oracle.DataAccess'in 2.x'i) bu sorunu çözdüm.


Ben aynı sorunla karşılaşıyorum - autocad. Net dll - sorun ve düzeltme ne olduğunu ayrıntılı olarak açıklayabilir misiniz?
BKSpurgeon

3

Bu konu neredeyse her zaman basit bir konudur. Kod bozuk. Nadiren araçlar, sadece istatistiksel bir analizden. Anlatılmamış milyonlarca insan her gün Visual Studio kullanıyor ve belki de birkaçı kodunuzu kullanıyor - hangi kod daha iyi test alıyor? Bu VS ile ilgili bir sorun olsaydı, muhtemelen zaten bulurdum garanti.

İfadenin anlamı, size ait olmayan belleğe erişmeye çalıştığınızda, bunun nedeni genellikle başka bir yerden gelen bozuk bir işaretçiyle yaptığınızdır. Bu yüzden göstergeyi söylüyor.

Bellek bozulması ile, hatanın yakalanması nadiren hatanın temel nedenine yakındır. Ve efektler tam olarak tanımladığınız, görünüşte rastgele. Sadece her zamanki suçlulara bakmalısın, şuna benzer:

  • başlatılmamış işaretçiler veya diğer değerler.
  • bir arabellek boyutundan daha fazla yazma.
  • muteksler tarafından korunmayan konuların paylaştığı kaynaklar.

Temel nedeni bulmak için böyle bir problemden geriye doğru çalışmak inanılmaz derecede yaratılması ile sorunun tespiti arasında çok fazla şey olabileceği göz önüne alındığında, bunun zordur.

Çoğunlukla ne de bakabilirsiniz daha kolaydır bulmak olduğunu yozlaşmış (diyelim ki, belirli bir işaretçi) ve daha sonra yukarıda gösterildiği gibi olağan suçlular için kontrol, bunu bozuk ne olabilirdi görmek için kod elle statik analiz yapmak. Bununla birlikte, bu bile uzun problem zincirlerini yakalamayacaktır.

VS bilmek için yeterince tanıdık değilim ama aynı zamanda herhangi bir bariz sorunları tespit edip edemeyeceğini görmek için bir bellek izleme aracı (Linux için valgrind gibi) kullanma olasılığına bakmak isteyebilirsiniz.


3
Bozuk bir işaretçiyi bozuk bellekten de alabilirsiniz. ECC belleğe sahip bir sunucuda bu gerçekleşmiyorsa, donanımı neden olarak ortadan kaldırmak için uzun süredir çalışan bir bellek testi yardımcı programını deneyin.
cdonner

12
Bunun bir donanım sorunu olmadığını biliyorum çünkü birden fazla sunucuda oluyor. Kod kaptanında kötü bir şey olduğunu belirttiğiniz için teşekkürler. Görsel stüdyosu suçlamıyorum. Belirtildiği gibi, uygulama rastgele bir süre için iyi çalışır. Çoğaltmak kolay değil ve sorunu haftalardır tanımlamaya çalışıyorum.
Başka Birisi

5
@Başka Başka: İsim aramanın size çok yardım edeceğini düşünmüyorum.
Mitch Wheat

2
@Birisi Başka, verdiğiniz sınırlı bilgileri verebildiğim kadar yardımcı oldum. Dünyanın en iyi doktoru bile "incitiyorum" diyen bir hastayla pek bir şey yapamaz :-) Daha spesifik bilgi vermek isterseniz, belki daha fazla yardımcı olabiliriz.
paxdiablo

5
Kötü Cevap, ama yaklaşım, utanmaz spekülasyon, haksız varsayımlar, çözüm sağlanmadı ... Bu cevap neden hala devam ediyor? Ve bu cevabı hangi 3 kişi kaldırabilirdi?
ThunderGr

3

Doğrulanabilir kod belleği bozamaz, bu nedenle güvenli olmayan bir şey var. Tampon işlemede olduğu gibi herhangi bir yerde güvenli olmayan bir kod kullanıyor musunuz? Ayrıca, PInvoke ile ilgili şeyler ilgisiz olmayabilir, çünkü PInvoke yönetilmeyen koda ve ilişkili marshaling'e geçiş gerektirir.

En iyi tavsiyem, çökmüş bir örneğe eklemek ve çökme sırasında olanları daha derinlemesine incelemek için WinDBG ve SOS kullanmaktır . Bu kalbin zayıflığı için değildir, ancak bu noktada neyin yanlış gittiğini belirlemek için daha güçlü araçlar kırmanız gerekebilir.


Hata mesajında ​​olası bir neden olarak PInvoke'den bahseder. Güvenli olmayan bir kod yok. WinDBG'yi deneyeceğim. Teşekkürler.
Başka Birisi

3

Tamam, bu oldukça işe yaramaz ve basitçe anekdot olabilir, ama ...

Bu istisna, projemde kullandığımız bazı Twain32 kütüphaneleri tarafından tutarlı bir şekilde atıldı, ancak sadece makinemde olurdu.

Tüm internette birçok çözüm denedim, boşuna ... Cep telefonumu fişe takana kadar (USB ile bağlıydı).

Ve işe yaradı.

Twain32 kütüphanelerinin telefonumu Twain uyumlu bir cihaz olarak listelemeye çalıştığı ortaya çıktı ve bu süreçte yaptığı bir şey bu istisnaya neden oldu.

Şekle git ...


3

Ben bir başvuru alır bir yöntem pinvoke kullanırken bu hatayı aldım StringBuilder . Görünüşe göre sadece 16 bayt tahsis varsayılan yapıcı kullanmıştı. Windows ara belleğe 16 bayttan fazla koymaya çalıştı ve arabellek taşmasına neden oldu.

Onun yerine

StringBuilder windowText = new StringBuilder(); // Probable overflow of default capacity (16)

Daha büyük bir kapasite kullanın:

StringBuilder windowText = new StringBuilder(3000);

2

benim durumumda dosya açıktı ve bu nedenle kilitlendi.

Ayrıca Excel'de açılan LinqToExcel kullanarak bir Excel dosyasını yüklemeye çalışırken alıyordum.

tüm yaptığım bu

    var maps = from f in book.Worksheet<NavMapping>()
                select f;
    try {
        foreach (var m in maps)
            if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID))
                _mappings.Add(m.SSS_ID, m.CDS_ID);
    } catch (AccessViolationException ex) {
        _logger.Error("mapping file error. most likely this file is locked or open. " + ex);
    }

2

VB.NET'te çalıştığım bir projede de aynı hatayı aldım. Özellikler sayfasındaki "Uygulama çerçevesini etkinleştir" seçeneğini işaretlemek benim için çözdü.


1

Ben de bu sorunu vardı. Visual Studio kullanarak aynı anda farklı çözümler çalışıyordum, diğer çözümleri kapatırken ve sadece hedef çözümü çalıştırırken, bu hata olmadan iyi çalıştı.


1

Bu hatayı VS1017'de, bir gün önce mükemmel bir şekilde iyi bir bina inşa etmeye çalışırken rastgele aldım. Bilgisayarı yeniden başlatmak sorunu çözdü (ayrıca aşağıdaki komutu da önceden çalıştırdım, gerekli olup olmadığından emin değilim: netsh winsock reset)


1
VS 2017 - System.AccessViolationException ile tam olarak bu benim durumum: Korumalı belleği okuma veya yazma girişimi. Bu genellikle diğer belleğin bozuk olduğunun bir göstergesidir. Başka bir şey yapmadan bu sorunu çözmek için PC'yi yeniden başlattım.
Hong

0

Cevabım senaryolarınıza bağlı, ancak Windows 8.1'de çalışmasını sağlamak için 10 yaşından büyük bir istemci için bir .NET uygulamasını yükseltmeye çalışırken bir sorun yaşadık. @ alhazen'in cevabı benim için doğru basketbol sahasındaydı. Uygulama, istemcinin güncellemek için ödemek istemediği bir üçüncü taraf DLL'ye dayanıyordu (Pegasus / Accusoft ImagXpress). Uygulamayı .NET 4.5 için yeniden hedefledik, ancak aşağıdaki satır her çalıştırıldığında AccessViolationException was unhandlediletiyi aldık :

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447);

Düzeltmek için projeye aşağıdaki post-build etkinliğini eklememiz gerekiyordu:

call "$(DevEnvDir)..\tools\vsvars32.bat"
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

Bu, yürütülebilir dosyayı Veri Yürütme Engellemesi ile uyumsuz olarak açıkça belirtir. Daha fazla ayrıntı için buraya bakın .


0

Bazı durumlarda, bu şu durumlarda olabilir:

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...

0

Benim durumumda P / Invoke kullanarak bir C / C ++ kütüphanesine başvurmak zorunda kaldım, ancak hafızayı ilk önce çıkış dizisi için tahsis edildiğinden emin olmak zorundaydım fixed:

[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

Ayrıntılar için lütfen bakınız: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/


0

Visual Studio'da C # WinForms uygulamamda hata ayıklarken bu bana oldu. Uygulamam DllImport, örn.

[DllImport("Secur32.dll", SetLastError = false)]
private static extern uint LsaEnumerateLogonSessions(out UInt64 LogonSessionCount, out IntPtr LogonSessionList);

Visual Studio "Yönetici" olarak çalıştırmak benim için sorunu çözdü.


0

Aynı hata mesajını aldım:

System.AccessViolationException: Korumalı belleği okuma veya yazma girişimi. Bu genellikle diğer belleğin bozuk olduğunun bir göstergesidir.

Benim durumumda, hata temizlendikten ve çözümü yeniden oluşturduktan sonra kayboldu.


0

Benim durumumda FTDI yardımcı programı FT Prog USB aygıtlarını tararken hatayı atıyordu. Bluetooth kulaklıklarımı bilgisayardan çıkarmak sorunu çözdü.


0

Bu hata iletisini nesnelerin bir koleksiyonunu filtrelemek için Linq kullanarak lambda ifade aldım. Koleksiyonu incelediğimde, üyelerinin nüfuslu olmadığını fark ettim - Localspencerede, onları genişletmek sadece "..." gösterdi. Sonuçta sorun, başlangıçta koleksiyonu dolduran depo yöntemindeydi - Dapper, iç içe geçmiş bir nesnenin bir özelliğini otomatik olarak eşlemeye çalışıyordu. Çoklu eşlemeyi işlemek için Dapper sorgusunu düzelttim ve bellek hatasını düzelttim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.