Mencoba membaca atau menulis memori yang dilindungi. Ini sering merupakan indikasi bahwa memori lain rusak

144

Saya berharap seseorang dapat memberi tahu saya apa yang mungkin menyebabkan kesalahan ini:

Mencoba membaca atau menulis memori yang dilindungi. Ini sering merupakan indikasi bahwa memori lain rusak.

Saya benar-benar tidak dapat memposting kode karena kesalahan ini tampaknya dilemparkan ke area acak aplikasi. Aplikasi akan berjalan di mana saja 12-48 jam sebelum melempar kesalahan. Kadang-kadang itu akan berhenti di tempat yang tampaknya acak dan melempar kesalahan di atas, di lain waktu seluruh aplikasi berhenti dan saya mendapatkan layar dengan kesalahan yang mengatakan sesuatu di sepanjang baris "Ada kesalahan fatal di ... Ini mungkin merupakan bug di CLR atau ... "sesuatu tentang PInvoke atau info tidak relevan lainnya. Ketika ini terjadi, semua utas ditampilkan dihentikan dan tidak ada informasi debug yang tersedia.

Singkatnya inilah yang dilakukan aplikasi:

Ini adalah aplikasi server multi-utas yang ditulis seluruhnya dalam C #. Klien terhubung ke server melalui soket. Server menjalankan "lingkungan" virtual untuk klien di mana mereka dapat berinteraksi satu sama lain dan lingkungan. Ini mengkonsumsi sedikit memori tetapi saya tidak melihatnya bocor. Biasanya mengkonsumsi sekitar 1,5GB. Saya tidak berpikir ini bocor karena penggunaan memori tetap relatif konstan sepanjang waktu aplikasi berjalan. Kode ini terus berjalan untuk menjaga lingkungan bahkan jika klien tidak melakukan apa pun. Tidak menggunakan perangkat lunak pihak ke-3 atau API lainnya. Satu-satunya sumber daya luar yang digunakan aplikasi ini adalah koneksi soket dan koneksi database SQL. Ini berjalan pada server 64bit. Saya telah mencoba men-debug ini di VS2008 & VS2010 menggunakan .net 2.0, 3.5, dan 4.

Saya sudah mencoba mematikan optimisasi kompiler dan beberapa hot-fix microsoft. Sepertinya tidak ada yang membuat masalah ini hilang. Akan dihargai jika ada yang tahu kemungkinan penyebabnya, atau semacam cara untuk mengidentifikasi apa yang menyebabkan masalah.

Orang lain
sumber
silakan kirim tumpukan panggilan lengkap ...
Mitch Wheat
kemungkinan duplikat dari Pemecahan Masalah. NET "Fatal Execution Engine Error"
Hans Passant
Sekitar separuh waktu saya tidak bisa mendapatkan tumpukan panggilan. Jika itu melempar kesalahan eksekusi fatal tidak ada informasi debugging sama sekali. Saat itu sebenarnya berhenti di suatu tempat dalam kode, tidak ada yang tampak abnormal. Saya bahkan telah melalui semua utas aktif dan belum melihat apa pun yang dapat menyebabkan konflik. Saya berasumsi kerusakan memori terjadi beberapa saat sebelum kesalahan terjadi.
Seseorang yang lain
Periksa komponen COM dan ActiveX jelek yang digunakan. Saya juga tahu SQLCE craps out seperti ini di lingkungan multithreaded.
leppie
Tidak ada komponen COM atau ActiveX.
Seseorang yang lain

Jawaban:

50

Saya baru saja menghadapi masalah ini di VS 2013 .NET 4.5 dengan DLL MapInfo. Ternyata, masalahnya adalah saya mengubah Platform untuk Build dari x86 ke CPU Apa pun dan itu cukup untuk memicu kesalahan ini. Mengubahnya kembali ke x86 berhasil. Bisa membantu seseorang.

Sergey
sumber
1
bagaimana Anda mengubahnya kembali dengan x86. Saya hanya menghadapi masalah yang sama dengan instruksi ini CSingleLock lock(&m_csMember, TRUE);. Untuk lebih jelasnya, inilah posting saya
ABCmo
Di VS 2012/2013, buka Project Properties-> Build dan ubah "Target Platform" menjadi apa pun yang Anda butuhkan. Meskipun saya pikir ada tempat lain di mana Anda dapat mengubah ini, tetapi saya tidak dapat menemukannya, saya pikir kedua cara tersebut harus mencapai hasil yang sama.
Sergey
Saya sebenarnya menggunakan VS 2013, dan dikonfigurasi sebagai x86: /
ABCmo
1
Masalah Anda dapat disebabkan oleh banyak hal, saya benar-benar terkejut bahwa saya memperbaiki masalah saya dengan mengubah platform build. Bisa dibilang pelarian yang beruntung.
Sergey
Solusi ini dikombinasikan dengan jawaban ini menyelesaikannya untuk saya.
Zach Posten
23

Saya juga menghadapi masalah ini dengan Visual Studio (VS) 2010. Yang lebih menarik, saya memiliki beberapa proyek dalam solusi saya (aplikasi Konsol, aplikasi WPF, aplikasi Windows Forms) tetapi gagal hanya ketika, saya sedang mengatur tipe "Aplikasi Konsol" proyek sebagai memulai proyek dari solusi (Bahkan bagi mereka yang benar-benar tidak memiliki kode atau majelis tambahan yang dirujuk selain dari yang standar yang datang dengan templat proyek itu sendiri).

Perubahan berikut akhirnya membantu saya menyelesaikan masalah: Buka properti proyek dari proyek aplikasi konsol (Atau, pilih file proyek di penjelajah solusi dan tekan Alt+ Enterkombinasi tombol) -> Buka Debugtab -> Gulir ke Enable Debuggersbagian di panel kanan -> Periksa yang Enable unmanaged code debuggingkotak centang seperti yang ditunjukkan dalam snapshot di bawah ini -> Klik Floppytombol pada toolbar untuk menyimpan proyek properti. Akar penyebab mengapa hal itu terjadi masih belum diketahui oleh saya. Satu-satunya hal yang saya amati adalah bahwa ada banyak pembaruan windows yang telah diinstal pada komputer saya malam sebelumnya yang sebagian besar merupakan pembaruan kantor dan pembaruan OS (Lebih dari selusin artikel KB).

masukkan deskripsi gambar di sini

Pembaruan : VS 2017 dan seterusnya nama pengaturan telah berubah seperti yang ditunjukkan pada gambar di bawah:

masukkan deskripsi gambar di sini

RBT
sumber
1
Pada VS 2017 ini diubah namanya menjadi " Aktifkan debug kode asli "
Chiramisu
1
Terima kasih @Camisamisu karena memberikan informasi terkini dan membantu komunitas. Saya telah memperbarui jawaban untuk membuatnya cocok untuk versi yang lebih baru dari Visual Studio.
RBT
19

Akhirnya melacak ini dengan bantuan WinDBG dan SOS. Pelanggaran akses dilemparkan oleh beberapa DLL yang tidak diketahui. Ternyata sepotong perangkat lunak yang disebut "Nvidia Network Manager" menyebabkan masalah. Saya telah membaca berkali-kali bagaimana masalah ini dapat disebabkan oleh firewall atau antivirus, yang tidak saya gunakan sehingga saya menolak ide ini. Juga, saya dengan asumsi bahwa itu bukan lingkungan karena terjadi pada lebih dari 1 server menggunakan perangkat keras yang berbeda. Ternyata semua mesin yang saya uji ini menjalankan "NVidia Network Manager". Saya percaya itu menginstal dengan sisa driver motherboard.

Semoga ini membantu seseorang karena masalah ini mengganggu aplikasi saya untuk waktu yang sangat lama.

Orang lain
sumber
1
dalam kasus saya ketika saya sering membaca data dari perangkat kesalahan lemparnya, saya telah menghentikan utas untuk beberapa waktu menggunakan Thread.Sleep (1000) untuk pembacaan berikutnya. dan bekerja dengan sempurna.
JRB
6
Saya akan berasumsi obatnya adalah "uninstall NVidia Network Manager"
paulm
79
Sebagian besar memilih suara yang tidak menyediakan jawaban logis.
Teoman shipahi
Saya ragu saya memiliki sesuatu yang berhubungan dengan nvidia di motherboard saya atau perangkat lunak saya. Saya menggunakan Visual Studio 2010. Masalahnya hanya terjadi selama debugging proyek dari VS. Keluarannya dari folder debug berfungsi dengan sempurna.
RBT
1
Saya mengakses Thread dari proses saya sendiri yang menyebabkan masalah.
Muhammad Saqib
13

Masalahnya mungkin karena platform DLL bangunan campuran dalam proyek. yaitu Anda membangun proyek Anda ke CPU Apa pun tetapi memiliki beberapa DLL dalam proyek yang sudah dibangun untuk platform x86. Ini akan menyebabkan crash acak karena pemetaan memori yang berbeda dari arsitektur 32bit dan 64bit. Jika semua DLL dibangun untuk satu platform masalah dapat diselesaikan.

Muhammad Yousaf Sulahria
sumber
8

Kesalahan ini seharusnya tidak terjadi dalam kode yang dikelola. Ini mungkin memecahkan masalah:

Pergi ke Visual Studio Debugger untuk memotong pengecualian ini:

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

Semoga ini bisa membantu.

curiousBoy
sumber
3
Saya minta maaf karena itu tidak berhasil untuk Anda. Kesalahan ini muncul karena banyak alasan, saya pikir, solusi yang telah saya posting, dapat memecahkan masalah untuk orang lain jika alasannya adalah optimasi JIT.
curiousBoy
5

Bisa jadi perangkat keras. Ini bisa menjadi sesuatu yang rumit ... tapi saya coba menyarankan bahwa di suatu tempat kode threading Anda tidak melindungi beberapa koleksi (seperti kamus) dengan kunci yang sesuai.

OS dan paket layanan apa yang Anda jalankan?

Mitch Wheat
sumber
1
Menjalankan XP 64 SP2. Ini telah terjadi pada beberapa server. Saya telah melalui semuanya berkali-kali dan saya tidak melihat sesuatu yang tidak aman. Juga bukankah saya akan mendapatkan koleksi yang dimodifikasi kesalahan daripada akses viloation?
Seseorang yang lain
5

Saya punya masalah ini baru-baru ini ketika saya mengubah server pengembangan untuk sebuah proyek. Saya mendapatkan kesalahan ini pada baris kode di mana saya mendeklarasikan variabel OracleConnection baru.

Setelah mencoba banyak hal, termasuk menginstal perbaikan terbaru, saya mencoba mengubah referensi Oracle.DataAccess dan System.Data.OracleClient dalam proyek dan berhasil!

Ketika sebuah proyek dipindahkan ke mesin baru, saya sarankan Anda memperbarui semua referensi yang ditambahkan dalam proyek itu.

deepakg_rao
sumber
4

Apakah Anda mencoba mematikan DEP (Pencegahan Eksekusi Data) untuk aplikasi Anda?

Hadi
sumber
2
Saya tidak yakin itu ide yang bagus. Mungkin menunda kecelakaan tetapi dengan biaya lebih banyak kerusakan. Saya pikir ide terbaik, jika Anda akan crash, adalah untuk crash awal :-)
paxdiablo
1
Mematikan DEP tidak bijaksana tetapi merupakan latihan diagnostik yang bermanfaat.
vcsjones
4

Saya menghadapi masalah yang sama. Kode saya adalah .NET dll (ekstensi AutoCAD) berjalan di dalam AutoCAD 2012. Saya juga menggunakan Oracle.DataAccess dan kode saya melempar pengecualian yang sama selama ExecuteNonQuery (). Untungnya saya memecahkan masalah ini dengan mengubah. Net versi ODP yang saya gunakan (yaitu, 2.x dari Oracle.DataAccess)

kmxr
sumber
Saya menghadapi masalah yang sama - autocad .net dll - dapatkah Anda menguraikan masalah dan perbaikannya?
BKSpurgeon
3

Masalah ini hampir selalu merupakan masalah sederhana. Kodenya buruk. Jarang alat, hanya dari analisis statistik. Tak terhitung jutaan orang menggunakan Visual Studio setiap hari dan mungkin beberapa menggunakan kode Anda - kode mana yang mendapatkan pengujian yang lebih baik? Saya jamin, jika ini masalah dengan VS, kami mungkin sudah menemukannya.

Maksud pernyataan itu adalah bahwa, ketika Anda mencoba mengakses memori yang bukan milik Anda, biasanya karena Anda melakukannya dengan pointer yang rusak, yang datang dari tempat lain. Itu sebabnya itu menyatakan indikasi.

Dengan kerusakan memori, penangkapan kesalahan jarang di dekat akar penyebab kesalahan. Dan efeknya persis seperti yang Anda gambarkan, tampak acak. Anda hanya harus melihat penyebab biasanya, hal-hal seperti:

  • pointer tidak diinisialisasi atau nilai-nilai lainnya.
  • menulis lebih banyak ke buffer daripada ukurannya.
  • sumber daya dibagikan oleh utas yang tidak dilindungi oleh mutex.

Bekerja mundur dari masalah seperti ini untuk menemukan akar penyebabnya sangat sulit mengingat begitu banyak yang bisa terjadi antara penciptaan masalah dan deteksi masalah.

Sebagian besar saya merasa lebih mudah untuk melihat apa yang rusak (katakanlah, pointer spesifik) dan kemudian melakukan analisis statis manual dari kode untuk melihat apa yang bisa merusaknya, memeriksa penyebab biasanya seperti yang ditunjukkan di atas. Namun, bahkan ini tidak akan menangkap rantai panjang masalah.

Saya tidak cukup akrab dengan VS untuk mengetahui tetapi Anda juga mungkin ingin melihat kemungkinan menggunakan alat pelacakan memori (seperti valgrind untuk Linux) untuk melihat apakah ia dapat menemukan masalah yang jelas.

paxdiablo
sumber
3
Anda juga bisa mendapatkan pointer yang rusak dari memori buruk. Jika ini tidak terjadi pada server dengan memori ECC, coba utilitas tes memori yang telah berjalan lama untuk menghilangkan perangkat keras sebagai penyebabnya.
cdonner
12
Saya tahu ini bukan masalah perangkat keras yang menyebabkannya terjadi pada beberapa server. Terima kasih telah menunjukkan ada sesuatu yang buruk pada kode kapten. Saya tidak menyalahkan studio visual. Sebagaimana dinyatakan aplikasi berjalan dengan baik untuk periode waktu yang acak. Tidak mudah untuk mereproduksi dan saya sudah mencoba mengidentifikasi masalah selama berminggu-minggu sekarang.
Seseorang yang lain
5
@Orang Lain: Saya hampir tidak berpikir nama panggilan akan banyak membantu Anda.
Mitch Wheat
2
@ Seseorang, saya telah membantu sebanyak yang saya bisa berikan informasi terbatas yang Anda berikan. Bahkan dokter terbaik di dunia tidak dapat berbuat banyak dengan pasien yang hanya menyatakan "Aku sakit" :-) Jika Anda ingin memberikan informasi yang lebih spesifik, maka mungkin kita bisa membantu lebih banyak.
paxdiablo
5
Jawaban Buruk, tetapi pendekatan, spekulasi tak tahu malu, asumsi tidak bisa dibenarkan, tidak ada solusi yang diberikan ... Mengapa jawaban ini masih naik? Dan 3 orang apa yang mungkin telah mengangkat jawaban ini?
ThunderGr
3

Kode yang dapat diverifikasi seharusnya tidak dapat merusak memori, jadi ada sesuatu yang tidak aman terjadi. Apakah Anda menggunakan kode tidak aman di mana saja, seperti dalam pemrosesan buffer? Juga, hal-hal tentang PInvoke mungkin tidak relevan, karena PInvoke melibatkan transisi ke kode yang tidak dikelola dan marshaling terkait.

Rekomendasi terbaik saya adalah melampirkan contoh crash dan menggunakan WinDBG dan SOS untuk menggali lebih dalam apa yang terjadi pada saat crash. Ini bukan untuk pingsan hati, tetapi pada titik ini Anda mungkin perlu mengeluarkan alat yang lebih kuat untuk menentukan apa, tepatnya, yang salah.

Dan Bryant
sumber
Itu menyebutkan PInvoke sebagai kemungkinan penyebab dalam pesan kesalahan. Tidak ada kode yang tidak aman. Saya akan mencoba WinDBG. Terima kasih.
Seseorang yang lain
3

Ok, ini bisa sangat tidak berguna dan hanya anekdotal, tapi ...

Pengecualian ini dilemparkan secara konsisten oleh beberapa perpustakaan Twain32 yang kami gunakan dalam proyek saya, tetapi hanya akan terjadi di mesin saya.

Saya mencoba banyak solusi yang disarankan di seluruh internet, tidak berhasil ... Sampai saya mencabut ponsel saya (itu terhubung melalui USB).

Dan itu berhasil.

Ternyata pustaka Twain32 mencoba mendaftarkan ponsel saya sebagai perangkat yang kompatibel dengan Twain, dan sesuatu yang dilakukannya dalam proses tersebut menyebabkan pengecualian itu.

Go figure ...

almulo
sumber
3

Saya mendapatkan kesalahan ini ketika menggunakan pinvoke pada metode yang mengambil referensi ke a StringBuilder . Saya telah menggunakan konstruktor default yang ternyata hanya mengalokasikan 16 byte. Windows mencoba untuk menempatkan lebih dari 16 byte dalam buffer dan menyebabkan buffer overrun.

Dari pada

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

Gunakan kapasitas yang lebih besar:

StringBuilder windowText = new StringBuilder(3000);
Charlie
sumber
2

dalam kasus saya file dibuka dan karenanya dikunci.

Saya mendapatkannya ketika mencoba memuat file Excel menggunakan LinqToExcel yang juga dibuka di Excel.

ini semua saya akta

    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);
    }
Jiwa Sonic
sumber
2

Saya mendapat kesalahan yang sama dalam proyek yang saya kerjakan di VB.NET. Memeriksa "Aktifkan kerangka kerja aplikasi" pada halaman properti menyelesaikannya untuk saya.

Tony Raymond
sumber
1

Saya punya masalah ini juga. saya menjalankan solusi yang berbeda pada saat yang sama menggunakan visual studio, ketika menutup solusi lain dan hanya menjalankan solusi target, itu bekerja dengan baik tanpa kesalahan itu.

ako
sumber
1

Mendapat kesalahan ini secara acak di VS1017, ketika mencoba membangun sebuah proyek yang sedang dibangun dengan baik sehari sebelumnya. Restart PC memperbaiki masalah ini berhasil (Saya juga menjalankan perintah berikut sebelumnya, tidak yakin apakah itu diperlukan: netsh winsock reset)

Eternal21
sumber
1
Itulah tepatnya situasi saya dengan VS 2017 - System.AccessViolationException: Mencoba membaca atau menulis memori yang dilindungi. Ini sering merupakan indikasi bahwa memori lain rusak. Saya hanya me-restart PC untuk menyelesaikan masalah ini tanpa melakukan hal lain.
Hong
0

Jawaban saya sangat tergantung pada skenario Anda, tetapi kami mengalami masalah saat mencoba memutakhirkan aplikasi .NET untuk klien yang berusia> 10 tahun sehingga mereka dapat membuatnya berfungsi pada Windows 8.1. @Alhazen menjawab agak seperti di ballpark yang benar untuk saya. Aplikasi ini mengandalkan DLL pihak ketiga yang klien tidak ingin bayar untuk memperbarui (Pegasus / Accusoft ImagXpress). Kami menargetkan ulang aplikasi untuk .NET 4.5 tetapi setiap kali baris berikut dijalankan, kami menerima AccessViolationException was unhandledpesan:

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

Untuk memperbaikinya, kami harus menambahkan acara pasca-pembangunan berikut ke proyek:

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

Ini secara eksplisit menentukan yang dapat dieksekusi sebagai tidak kompatibel dengan Pencegahan Eksekusi Data. Untuk lebih jelasnya lihat di sini .

Barrie
sumber
0

Dalam beberapa kasus, ini mungkin terjadi ketika:

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

Dalam kasus saya, saya harus merujuk pustaka C / C ++ menggunakan P / Invoke, tetapi saya harus memastikan bahwa memori dialokasikan untuk array keluaran terlebih dahulu menggunakan 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;
    }

Untuk perinciannya, silakan lihat: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/

pengguna8128167
sumber
0

Ini terjadi pada saya ketika saya sedang debug aplikasi C # WinForms di Visual Studio. Aplikasi saya membuat panggilan ke hal-hal Win32 melalui DllImport, misalnya

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

Menjalankan Visual Studio "sebagai Administrator" memecahkan masalah bagi saya.

Netricity
sumber
0

Saya memiliki pesan kesalahan yang sama:

System.AccessViolationException: Mencoba membaca atau menulis memori yang dilindungi. Ini sering merupakan indikasi bahwa memori lain rusak.

Dalam kasus saya, kesalahan hilang setelah bersih dan membangun kembali solusinya.

Vivek Sharma
sumber
0

Dalam kasus saya, utilitas FTDI FT Prog melempar kesalahan saat memindai perangkat USB. Mencabut headphone Bluetooth saya dari PC memperbaiki masalah ini.

101
sumber
0

Saya mendapat pesan kesalahan ini pada ekspresi lambda yang menggunakan Linq untuk memfilter koleksi objek. Ketika saya memeriksa koleksi saya perhatikan bahwa anggotanya tidak dihuni - di Localsjendela, memperluas mereka hanya menunjukkan "...". Pada akhirnya masalahnya adalah dalam metode repositori yang awalnya mengisi koleksi - Dapper mencoba memetakan properti objek bersarang secara otomatis. Saya memperbaiki permintaan Dapper untuk menangani multi-pemetaan dan itu memperbaiki kesalahan memori.

melicent
sumber