Спроба читати чи записувати захищену пам'ять. Це часто свідчить про те, що інша пам'ять пошкоджена


144

Я сподіваюся, що хтось може просвітити мене щодо того, що могло спричинити цю помилку:

Спроба читати чи записувати захищену пам'ять. Це часто свідчить про те, що інша пам'ять пошкоджена.

Я не можу реально поштовий індекс, оскільки ця помилка, здається, потрапляє в будь-яку випадкову область програми. Додаток запуститься десь 12-48 годин до викиду помилки. Іноді він зупиниться на, здавалося б, випадковому місці і викине вищезгадану помилку, в інший раз вся програма зупиняється, і я отримую екран із помилкою, яка щось говорить за рядком "У цій справі сталася фатальна помилка ... Це може бути помилка в CLR або ... "щось про PInvoke або іншу невідповідну інформацію. Коли це відбувається, усі потоки показуються припиненими, і немає інформації про налагодження.

Коротше кажучи, це робить програма:

Його багатопотокова серверна програма, повністю написана на C #. Клієнти підключаються до сервера через сокет. Сервер виконує віртуальне "середовище" для клієнтів, де вони можуть взаємодіяти між собою та оточенням. Це забирає зовсім небагато пам’яті, але я не бачу, щоб воно просочилося. Зазвичай споживає близько 1,5 ГБ. Я не думаю, що його витік, тому що використання пам'яті залишається відносно постійним весь час роботи програми. Його постійно працює код для підтримки середовища, навіть якщо клієнти нічого не роблять. Він не використовує стороннього програмного забезпечення або інших API. Єдині зовнішні ресурси, якими користується ця програма, - це з'єднання з сокетами та підключення до бази даних SQL. Його працює на 64-бітовому сервері. Я спробував налагодити це у VS2008 та VS2010, використовуючи .net 2.0, 3.5 та 4.

Я спробував вимкнути оптимізацію компілятора та кілька гарячих виправлень Microsoft. Здається, ніщо не змушує цю проблему згасати. Було б вдячно, якщо хтось знає якісь можливі причини чи якийсь спосіб визначити, що спричиняє проблему.


будь ласка, опублікуйте повний стек дзвінків ...
Mitch Wheat


Близько половини часу я не можу отримати стек викликів. Якщо вона видає фатальну помилку виконання, взагалі немає інформації про налагодження. Часи, які насправді зупиняються десь у коді, нічого не здається ненормальним. Я навіть пройшов усі активні теми і не бачив нічого, що може спричинити конфлікт. Я припускаю, що пошкодження пам’яті сталося за деякий час, перш ніж вона викинула помилку.
Хтось інший

Перевірте, чи не використовуються старі компоненти COM та ActiveX. Я також знаю, що SQLCE виконує такі виходи у багатопотоковому середовищі.
леппі

Немає COM або ActiveX компонентів.
Хтось інший

Відповіді:


50

Я щойно стикався з цією проблемою в VS 2013 .NET 4.5 з DLL MapInfo. Виявляється, проблема полягала в тому, що я змінив платформу для Build з x86 на будь-який процесор, і цього було достатньо, щоб викликати цю помилку. Повернення його до x86 зробило трюк. Може допомогти комусь.


1
як ти змінив його назад з x86. Я просто з такою ж проблемою з цією інструкцією CSingleLock lock(&m_csMember, TRUE);. Більш детально, ось мій пост
ABCmo

У VS 2012/2013 перейдіть у розділ Властивості проекту-> Складіть та змініть «Ціль платформи» на все, що вам потрібно. Хоча я думаю, що є ще одне місце, де ви можете це змінити, але я, здається, не можу його знайти, я думаю, що обидва способи повинні досягти одного результату.
Сергій

Я фактично використовую VS 2013, і він налаштований як x86: /
ABCmo

1
Ваша проблема може бути викликана багатьма речами, я був дуже здивований, що вирішив свою проблему, змінивши платформу зборки. Можна сказати щасливу втечу.
Сергій

Це рішення у поєднанні з цією відповіддю вирішило це для мене.
Zach Posten

23

Я також зіткнувся з цією проблемою з Visual Studio (VS) 2010. Що цікавіше, у мене було кілька проектів у моєму рішенні (консольна програма, програма WPF, програма Windows Forms), але вона вийшла з ладу лише тоді, коли я встановлював тип "консольна програма" проекту як початковий проект рішення (Навіть для тих, у яких буквально не було коду чи будь-яких додаткових збірок, зазначених крім типових, які поставляються із самим шаблоном проекту).

Наступні зміни, нарешті, допомогли мені усунути проблему: Перейдіть до властивостей проекту проекту консольного додатка (або виберіть файл проекту в провіднику рішень та натисніть Alt+ Enterкомбінацію клавіш) -> Перейти до Debugвкладки -> Прокрутіть до Enable Debuggersрозділу на правій панелі -> Перевірити Enable unmanaged code debuggingпрапорець , як показано на малюнку нижче знімок -> Натисніть Floppyкнопку на панелі інструментів , щоб зберегти властивість проекту. Причина, чому це сталося, мені досі не відома. Єдине, що я зауважив, - це те, що минулого вечора на моїй машині було встановлено багато оновлень Windows, які в основному складалися з оновлень офісу та оновлень ОС (більше десятка статей КБ).

введіть тут опис зображення

Оновлення : VS 2017 і надалі назва параметра змінилася, як показано на знімку екрана нижче:

введіть тут опис зображення


1
Станом на VS 2017 це було перейменовано на " Увімкнути налагодження нативного коду "
Chiramisu

1
Дякуємо @Chiramisu за надану актуальну інформацію та допомогу громаді. Я оновив відповідь, щоб зробити її придатною для новіших версій Visual Studio.
RBT

19

Нарешті простежили це за допомогою WinDBG та SOS. Порушення доступу викидала якась невідома DLL. Виявляється, програмне забезпечення під назвою "Менеджер мережі Nvidia" спричиняло проблеми. Я незліченно читав, як ця проблема може бути викликана брандмауерами або антивірусом, жодного з яких я не використовую, тому я відкинув цю ідею. Крім того, я висловив припущення, що це не є екологічним, оскільки відбувається на більш ніж 1 сервері з використанням різного обладнання. Виявляється, всі машини, на яких я тестував це, працювали під керуванням "NVidia Network Manager". Я вважаю, що це встановлено разом з рештою драйверів материнської плати.

Сподіваємось, це допомагає комусь, оскільки ця проблема мучила мою заяву дуже довго.


1
у моєму випадку, коли я читаю дані часто з помилки кидка пристрою, у мене був деякий час зупинка потоку, використовуючи Thread.Sleep (1000) для наступного читання. і працює ідеально.
JRB

6
Я б припустив, що ліки було "видалити мережевий менеджер NVidia"
липня

79
Відповідь більшості голосів, яка не дає жодної логічної відповіді.
Теоман шипахі

Я сумніваюся, що у мене на материнській платі або в моєму програмному забезпеченні є щось, що стосується nvidia. Я використовую Visual Studio 2010. Проблема виникає лише під час налагодження проекту від VS. Його вихідний файл із папки налагодження працює ідеально.
RBT

1
Я переглядаю теми мого власного процесу, які викликають проблему.
Мухаммед Сакіб

13

Проблема може бути пов'язана зі змішаними DLL-платформами для змішаних платформ у проекті. тобто ви будуєте свій проект до будь-якого процесора, але маєте кілька DLL-файлів у проекті, вже створеному для платформи x86. Це спричинить випадкові збої через різні карти пам'яті 32-бітної та 64-бітної архітектури. Якщо всі DLL побудовані для однієї платформи, проблему можна вирішити.



8

Ця помилка не повинна статися в керованому коді. Це може вирішити проблему:

Перейдіть до налагоджувача Visual Studio, щоб обійти цей виняток:

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

Сподіваюся, це допоможе.


3
Вибачте, що це не працює для вас. Ця помилка виникає з багатьох причин, я вважав, що рішення, яке я опублікував, може вирішити проблему для когось іншого, якщо причиною є оптимізація JIT.
цікавоБой

6

Я сьогодні зіткнувся і знайшов рішення щодо цього винятку. Це відбувалося, коли я намагався налагодити тест одиниці (NUnit), який викликав віртуальний метод на абстрактному класі.

Здається, проблема пов’язана з встановленням .NET 4.5.1.

Я завантажив .NET 4.5.2 і встановив (у моїх проектах все ще посилається .NET 4.5.1), і проблема вирішена.

Джерело рішення:

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


5

Це може бути обладнання. Це може бути щось складне ... але я б вирішив зробити висновок про те, що десь ваш нарізний код не захищає якусь колекцію (наприклад, словник) з відповідним замком.

Яку ОС та пакет оновлень ви працюєте?


1
Запуск XP 64 SP2. Однак це трапляється на декількох серверах. Я пережив все так багато разів, і я не бачу нічого, що не є безпечним. Також я б не отримував модифіковану помилку колекції, а не відображення доступу?
Хтось інший

5

У мене ця проблема була нещодавно, коли я змінив сервер розробки для проекту. Я отримував цю помилку в рядку коду, де я оголосив нову змінну OracleConnection.

Спробувавши багато речей, включаючи встановлення виправлень, я спробував змінити посилання Oracle.DataAccess і System.Data.OracleClient у проекті, і це спрацювало!

Коли проект переміщується на нову машину, я пропоную вам відновити всі посилання, додані в цьому проекті.


4

Ви намагалися вимкнути DEP (запобігання виконанню даних) для вашої програми?


2
Я не впевнений, що це гарна ідея. Це може затримати аварію, але ціною зробити більше шкоди. Я думаю, що найкраща ідея, якщо ви збираєтеся врізатись,
зірватися

1
Відключення DEP - нерозумно, але корисна діагностична вправа.
vcsjones

4

Я зіткнувся з тим же питанням. Мій код був .NET dll (розширення AutoCAD), що працює в AutoCAD 2012. Я також використовую Oracle.DataAccess, і мій код кидав той самий виняток під час ExecuteNonQuery (). На щастя, я вирішив цю проблему, змінивши .net версію ODP, яку я використовував (тобто 2.x Oracle.DataAccess)


Я зіткнувся з тією ж проблемою - autocad .net DLL - чи можете ви детальніше розглянути, у чому проблема та виправлення?
BKSpurgeon

3

Це питання майже незмінно просте. Код поганий. Це рідко інструменти, лише зі статистичного аналізу. Невизначені мільйони людей користуються Visual Studio щодня, і, можливо, мало хто використовує ваш код - який біт коду покращує тестування? Я гарантую, що якби це була проблема з VS, ми, мабуть, її вже знайшли.

Це твердження означає, що, коли ви намагаєтеся отримати доступ до пам'яті, яка не є вашою, це зазвичай тому, що ви робите це з пошкодженим вказівником, який прийшов з іншого місця. Ось чому він вказує вказівку.

При пошкодженні пам’яті виявлення помилки рідко є близькою до першопричини помилки. А ефекти - це саме те, що ви описуєте, здавалося б випадкові. Вам просто доведеться подивитися на звичних винуватців, такі речі:

  • неініціалізовані покажчики чи інші значення.
  • запис більше в буфер, ніж його розмір.
  • ресурси, що поділяються потоками, не захищеними мютексами.

Працювати назад від такої проблеми, щоб знайти першопричину, неймовірно складно, враховуючи, що стільки могло статися між створенням проблеми та виявленням проблеми.

Здебільшого мені здається, що легше подивитися на те, що є пошкодженим (скажімо, конкретний вказівник), а потім зробити вручну статичний аналіз коду, щоб побачити, що може його пошкодити, перевіряючи на звичних винуватців, як показано вище. Однак навіть це не наздожене довгих ланцюгів проблем.

Я недостатньо знайомий з VS, щоб знати, але ви, можливо, також захочете вивчити можливість використання інструмента відстеження пам'яті (наприклад, valgrind для Linux), щоб побачити, чи може він виявити якісь очевидні проблеми.


3
Ви можете отримати зіпсований покажчик і від поганої пам'яті. Якщо цього не відбувається на сервері з пам’яттю ECC, спробуйте тривалу утиліту тестування пам’яті, щоб усунути обладнання як причину.
cdonner

12
Я знаю, що це не технічна проблема, тому що це відбувається на декількох серверах. Дякуємо, що вказали на те, що в капітані коду очевидно. Я не звинувачую візуальну студію. Як зазначено, додаток працює штрафом за випадковий проміжок часу. Відтворити його непросто, і я вже кілька тижнів намагаюся визначити проблему.
Хтось інший

5
@Someone Else: Навряд чи я думаю, що виклик імені допоможе вам допомогти.
Мітч Пшеничний

2
@Someone Else, я допоміг, наскільки я можу дати обмежену інформацію, яку ви надали. Навіть найкращий лікар у світі не може багато чого зробити з пацієнтом, який просто заявляє "я болю" :-) Якщо ви хочете надати більш конкретну інформацію, то, можливо, ми можемо допомогти більше.
paxdiablo

5
Погана відповідь, але підхід, безсоромна спекуляція, невиправдані припущення, рішення не надано ... Чому ця відповідь все ще триває? І що, можливо, могли б відповісти 3 людини?
ThunderGr

3

Перевіряється код не повинен пошкоджувати пам’ять, тому відбувається щось небезпечне. Чи використовуєте ви будь-який небезпечний код де-небудь, наприклад, при обробці буфера? Крім того, дані про PInvoke можуть не мати ніякого значення, оскільки PInvoke передбачає перехід до некерованого коду та пов'язаного з ним маршалінгу.

Моя найкраща рекомендація - приєднатися до збійного екземпляра та використовувати WinDBG та SOS, щоб глибше заглибитись у те, що відбувається в момент аварії. Це не для слабкого серця, але в цей момент вам може знадобитися розробити більш потужні інструменти, щоб визначити, що саме йде не так.


У якості повідомлення про помилку він згадує PInvoke. Немає небезпечного коду. Я спробую WinDBG. Дякую.
Хтось інший

3

Гаразд, це може бути досить марним і просто анекдотичним, але ...

Цей виняток послідовно кидали деякі бібліотеки Twain32, які ми використовували в моєму проекті, але траплялися б лише в моїй машині.

Я спробував багато запропонованих рішень в Інтернеті, безрезультатно ... Поки я не відключив свій мобільний телефон (він був підключений через USB).

І це спрацювало.

Виявляється, бібліотеки Twain32 намагалися перелічити мій телефон як пристрій, сумісний з Twain, і щось, що було зроблено в цьому процесі, спричинило цей виняток.

Піди розберися...


3

Я отримав цю помилку під час використання pinvoke в методі, який посилається на a StringBuilder. Я використовував конструктор за замовчуванням, який, мабуть, виділяє лише 16 байт. Windows намагалася помістити більше 16 байт у буфер і викликала перевищення буфера.

Замість

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

Використовуйте більшу ємність:

StringBuilder windowText = new StringBuilder(3000);

2

у моєму випадку файл був відкритим і тому заблокований.

Я отримував це при спробі завантажити файл Excel за допомогою LinqToExcel, який також був відкритий в Excel.

це все, що я зробив

    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. Перевірка "Включити рамку програми" на сторінці властивостей вирішила це для мене.


1

У мене теж була ця проблема. я працював з різними рішеннями одночасно з використанням візуальної студії, коли закриваючи інші рішення та працював лише з цільовим рішенням, він працював чудово без цієї помилки.


1

Отримав цю помилку випадковим чином у VS1017 під час спроби створити проект, який будувався ідеально добре напередодні. Перезапуск ПК вирішив проблему (я також заздалегідь запустив таку команду, не впевнений, чи потрібно: netsh winsock reset)


1
Саме такою є моя ситуація з VS 2017 - System.AccessViolationException: Спроба читати чи записувати захищену пам'ять. Це часто свідчить про те, що інша пам'ять пошкоджена. Я просто перезапустив ПК, щоб вирішити цю проблему, не роблячи нічого іншого.
Гонг

0

Моя відповідь дуже залежить від вашого сценарію, але у нас виникла проблема, яка намагалася оновити додаток .NET для клієнта, якому було більше 10 років, щоб вони могли змусити його працювати в Windows 8.1. @ відповідь alhazen була якось правильною для мене. Додаток покладався на сторонні DLL, які клієнт не бажав платити за оновлення (Pegasus / Accusoft ImagXpress). Ми повторно націлили додаток на .NET 4.5, але кожен раз, коли виконується наступний рядок, ми отримували AccessViolationException was unhandledповідомлення:

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

Щоб виправити це, нам довелося додати до проекту наступну подію після збирання:

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

Це явно визначає виконуваний файл як несумісний із запобіганням виконанню даних. Детальніше дивіться тут .


0

У деяких випадках це може статися, коли:

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

0

У моєму випадку мені довелося посилатись на бібліотеку C / C ++ за допомогою P / Invoke, але я повинен був переконатися, що пам'ять була виділена для вихідного масиву, використовуючи 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;
    }

Докладніше див: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/


0

Це сталося зі мною, коли я налагоджував свій додаток C # WinForms у Visual Studio. Моя програма здійснює дзвінки до матеріалів Win32 через DllImport, наприклад

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

Запуск Visual Studio «як адміністратор» вирішив проблему для мене.


0

У мене було те саме повідомлення про помилку:

System.AccessViolationException: Спроба читати або записувати захищену пам'ять. Це часто свідчить про те, що інша пам'ять пошкоджена.

У моєму випадку помилка усунулася після очищення та відновлення рішення.


0

У моєму випадку утиліта FTDI FT Prog видала помилку під час сканування USB-пристроїв. Відключення моїх навушників Bluetooth від ПК вирішило проблему.


0

Я отримав це повідомлення про помилку в виразі лямбда, який використовував Linq для фільтрації колекції об'єктів. Коли я оглянув колекцію, то помітив, що її члени не заселені - у Localsвікні, розширюючи їх, просто показали "...". Зрештою, проблема полягала в методі сховища, який спочатку заповнював колекцію - Dapper намагався автоматично відобразити властивість вкладеного об'єкта. Я виправив запит Dapper для обробки мульти-картування, і це виправило помилку пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.