Как следует диагностировать ошибку SEHException - внешний компонент выдал исключение - PullRequest
75 голосов
/ 21 августа 2009

Каждый раз, когда пользователь сообщает об ошибке, такой как

System.Runtime.InteropServices.SEHException - Внешний компонент выдал исключение?

Есть ли что-то, что я, программист, могу сделать, чтобы определить причину?

Сценарий: один пользователь (используя программу, написанную моей компанией) сообщил об этой ошибке. Это может быть или не быть единовременной ошибкой. Они упомянули, что за последний месяц компьютер дважды «перестал работать». Из своего опыта я научился не воспринимать это описание слишком буквально, поскольку обычно это означает, что кто-то, имеющий отношение к компьютеру, работает не так, как ожидалось. Они не смогли дать мне больше деталей, и я не смог найти ни одной зарегистрированной ошибки. Следовательно, это может быть или не быть этой ошибкой.

Из трассировки стека действительная ошибка была при создании класса, который напрямую не вызывает код взаимодействия, но, возможно, усложняется тем фактом, что объект может быть частью списка, который связан с сетью DevExpress.

Ошибка была «поймана» подпрограммой необработанного исключения, которая обычно закрывает программу, но имеет возможность игнорировать и продолжить. Если они решили игнорировать ошибку, то программа продолжала работать, но ошибка снова возникла при следующем запуске этой процедуры. Однако это не произошло снова после закрытия и перезапуска нашего приложения.

Похоже, рассматриваемый компьютер не был перегружен. Он работает под управлением Vista Business, имеет 2 ГБ памяти и, по словам диспетчера задач, использует только половину этого, а наше приложение - около 200 МБ.

Существует еще одна информация, которая может иметь или не иметь отношение к делу. Другой раздел этой же программы использует сторонний компонент, который фактически является оболочкой dotnet вокруг нативной библиотеки DLL, и у этого компонента есть известная проблема, в которой очень редко вы получаете

Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена

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

Учитывая, что последствия ошибки невелики (работа не теряется, перезапуск программы и возврат туда, где они были, занимает максимум минуту) и учитывая, что клиент вскоре получит новую версию (с обновленный сторонний компонент), я, очевидно, могу скрестить пальцы и надеяться, что ошибка не повторится.

Но могу ли я что-нибудь еще сделать?

Ответы [ 7 ]

26 голосов
/ 21 августа 2009

Да. Эта ошибка является структурированным исключением, которое не было отображено в .NET-ошибке. Вероятно, это ваше отображение DataGrid, генерирующее необработанное исключение.

Вы можете узнать, какое исключение происходит, посмотрев на свойство ExternalException.ErrorCode . Я бы проверил трассировку вашего стека, и, если она связана с сеткой DevExpress, сообщите о проблеме им.

6 голосов
/ 11 июля 2013

У меня была похожая проблема с исключением SEHException, которое возникло, когда моя программа впервые использовала встроенную оболочку dll Оказалось, что родная DLL для этой обертки отсутствует. Исключение никоим образом не помогло в решении этого. Что помогло в итоге, так это запуск procmon в фоновом режиме и проверка наличия ошибок при загрузке всех необходимых DLL.

5 голосов
/ 02 августа 2011

если у вас возникла проблема, как описано в этом посте:

Отладчик asp.net MVC, выбрасывающий SEHException

тогда решение:

если у вас есть какое-либо приложение от Trusteer (например, rapport или что-то еще), просто удалите и перезагрузите систему, она будет работать нормально ... нашел это решение здесь:

http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+thrown+when+I+run+the+application

3 голосов
/ 21 августа 2009

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

Спросите производителя компонентов, как проверить, является ли проблема, возникшая у клиента, проблемой, которую, по их словам, они исправили в своей последней версии, без / до развертывания своей последней версии для клиента.

1 голос
/ 04 марта 2017

Я сталкивался с этой ошибкой, когда приложение находится в общей сетевой папке, и устройство (ноутбук, планшет и т. Д.) Отключается от сети во время использования приложения. В моем случае это произошло из-за выхода планшета Surface за пределы беспроводной связи. Никаких проблем после установки лучшего WAP.

0 голосов
/ 21 февраля 2018

Конфигурации моей машины:

Операционная система: Windows 10 Версия 1703 (x64)

Я столкнулся с этой ошибкой при отладке своего проекта C # .Net в выпуске Visual Studio 2017 Community. Я вызывал нативный метод, выполняя p / invoke для сборки C ++, загруженной во время выполнения. Я обнаружил ту же ошибку, о которой сообщает OP.

Я понял, что Visual Studio был запущен с учетной записью пользователя, который не был администратором на машине. Затем я перезапустил Visual Studio под другой учетной записью пользователя, который был администратором на машине. Это все. Моя проблема была решена, и я больше не сталкивался с этой проблемой.

Стоит отметить, что метод, который вызывался на ассемблере C ++, должен был записать несколько вещей в реестре. Я не стал отлаживать код C ++ для выполнения некоторых RCA, но я вижу вероятность того, что все это не сработало, поскольку для записи реестра в операционной системе Windows 10 требуются права администратора. Так что раньше, когда Visual Studio работал под учетной записью пользователя, у которого не было административных привилегий на компьютере, собственные вызовы не выполнялись.

0 голосов
/ 23 октября 2017

Просто еще одна информация ... Эта проблема возникала сегодня в системе Windows 2012 R2 x64 TS, где приложение запускалось по пути unc / network. Проблема возникла для одного приложения для всех пользователей терминального сервера. Выполнение приложения локально работало без проблем. После перезагрузки он снова начал работать - в SEHException были выбраны Конструктор init и TargetInvocationException

...