Странная проблема с System.AccessViolationException - PullRequest
4 голосов
/ 18 марта 2011

У меня есть веб-приложение asp.net (3.5). На одной странице я использую неуправляемую библиотеку C (симулятор), которая выдает набор результатов, основанных на некотором входном сигнале.

Когда я установил debug="false" в web.config (режим выпуска), этот вызов приведет к System.AccessViolationException. Если я нахожусь в отладчике или хотя бы установил debug="true" в web.config, это исключение не будет никогда .

Из-за природы ошибки я поместил вызов внутри try-catch, чтобы зарегистрировать исключение, и тогда исключение не появляется!

Есть ли какая-то магическая работа с защищенным пространством памяти в режиме отладки и / или в режиме try-catch?

1 Ответ

3 голосов
/ 19 марта 2011

AccessViolationException в этом контексте, вероятно, означает, что ваш неуправляемый код C испорчен.Это перезаписывает кучу или что-то в этом роде.

Имейте в виду, что многие фрагменты кода никогда не были написаны для работы в многопоточной среде, подобной ASP.NET.Они даже никогда не тестировались в такой среде, или тестировались только с использованием «многопоточности» в виде «рабочего стола», которая не применима к ASP.NET.

Однажды у меня была такая проблема.Сторонняя DLL, которая утверждала, что является поточно-ориентированной, была очень небезопасной .Подключив неуправляемый отладчик к рабочему процессу ASP.NET, можно было увидеть, что приложение писало по всей куче библиотеки времени выполнения C, и куча жаловалась на это с горечью.И ничто не слушало жалобы.

Необходимо было обернуть вызовы этого кода в блок lock - чтобы гарантировать, что только один поток мог вызвать его одновременно.Этого было достаточно для предотвращения всех сбоев, даже под нагрузкой.

Этого все же может быть недостаточно для всего неуправляемого кода.Часть кода, которая предполагает, что все вызовы будут происходить в одном и том же потоке, или что все вызовы из одного и того же «сеанса» будут происходить в одном и том же потоке, будут разочарованы и вполне могут привести к сбою или сделать что-то еще хужеВ этом случае вам может понадобиться переместить этот код в отдельную службу Windows, которая позволяет только одному потоку обращаться к этой библиотеке, ever .

...