Як слід діагностувати помилку SEHException - Зовнішній компонент створив виняток


86

Щоразу, коли користувач повідомляє про помилку, таку як

System.Runtime.InteropServices.SEHException - Зовнішній компонент видав виняток?

чи є щось, що я як програміст можу зробити для з’ясування причини?

Сценарій: Один користувач (використовуючи програму, яку написала моя компанія) повідомив про цю помилку. Це може бути або не бути одноразовою помилкою. Вони згадали, що за останній місяць комп’ютер двічі «перестав працювати». Я дізнався з досвіду, щоб не сприймати цей опис занадто буквально, оскільки зазвичай це означає, що хтось, що має відношення до комп’ютера, працює не так, як очікувалося. Вони не змогли повідомити мені більше деталей, і я не зміг знайти жодної помилки. Отже, ця помилка могла бути або не бути.

Зі стеку-трасування фактична помилка була при побудові класу, який безпосередньо не викликає жодного коду взаємодії, але, можливо, ускладнюється тим фактом, що об'єкт може бути частиною списку, прив'язаного до сітки DevExpress.

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

Здається, комп’ютер, про який йде мова, не зазнав напруги. Він працює під управлінням Vista Business, має 2 Гб пам’яті, і, за даними диспетчера завдань, він використовував лише половину, а наш додаток - близько 200 Мб.

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

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

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

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

Але чи можу я щось більше зробити?

Відповіді:


28

Так. Ця помилка є структурованим винятком, який не був відображений у помилці .NET. Це, мабуть, ваше відображення DataGrid, яке створює власний виняток, який не вдалося вловити.

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


1
StackTrace ніде не згадував DevExpress, а лише мій клас. Доведеться перевірити, що таке ErrorCode.
sgmoore

У такому випадку спробуйте з’ясувати, що саме викинуло повідомлення про помилку.
Рід Копсі,

4
"переглянувши властивість ExternalException.ErrorCode" - чи є у вас підказки щодо того, як саме це зробити? VS показує мені "Необроблений виняток типу 'System.Runtime.InteropServices.SEHException' стався в .... dll. переглядати "Деталі" об'єкта виключення де завгодно.
АБО Mapper

8

У мене була подібна проблема з SEHException, яка виникла, коли моя програма вперше використовувала власну обгортку dll. Виявилося, що рідна DLL для цієї обгортки відсутня. Виняток жодним чином не допоміг у вирішенні цієї проблеми. Зрештою допомогло запуск procmon у фоновому режимі та перевірка наявності помилок під час завантаження всіх необхідних бібліотек DLL.


5

якщо у вас виникли проблеми, як описано в цій публікації:

asp.net mvc налагоджувач кидає SEHException

тоді рішення:

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

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


3

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

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


1

Я зіткнувся з цією помилкою, коли програма перебуває на спільній мережі, а пристрій (ноутбук, планшет ...) відключається від мережі, поки програма використовується. У моєму випадку це було пов’язано з тим, що планшет Surface вийшов за межі бездротового зв'язку. Немає проблем після встановлення кращого WAP.


1
Я отримував його випадковим чином під час доступу до різних видів відображення (GetAssemblyName, GetProperty, Activator тощо) як у своєму коді, так і в сторонніх бібліотеках, і просто в одному клієнтському середовищі, подібно до бібліотек у віддаленому розташуванні. Безліч доказів - це помилка .net framework.
Andriy K

Андрій К: Я не думаю, що це проблема .NET, я думаю, що дескриптори відкритих файлів на спільній мережі втрачаються \ втрачаються, можливо, помилка в Windows або проблема з мережею. Збірки відображаються на карті пам'яті, і вони будуть переміщуватися з диска на вимогу (бомба із затримкою), можливо, пам'ять може бути відкинута і в ситуаціях, коли мало пам'яті. Якщо дескриптори відкритого файлу не стабільні, це, ймовірно, задимає. .NET, можливо, міг би це обробити і знову відкрити файл (згладити проблему), але це може бути складно.
osexpert

У мене така сама проблема. Я отримую System.Runtime.InteropServices.SEHException (0x80004005) без трасування стека. Це InnerException цільовогоInvocationException. У TargetInvocationException справді є трасування стека, але для мене це не мало сенсу, оскільки, здавалося, воно походить від main або Application.Run. Це трапляється дуже випадково, переважно вечорами \ вночі. Я думаю, єдине "рішення" - це не запускати з мережевого диска: - | Може бути , я додати чек , який може блокувати цей сценарій: stackoverflow.com/questions/8633680 / ...
osexpert

0

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


0

Конфігурації моєї машини:

Операційна система: Windows 10 версії 1703 (x64)

Я зіткнувся з цією помилкою під час налагодження мого проекту C # .Net у версії спільноти Visual Studio 2017. Я викликав власний метод, виконуючи p / invoke на збірці C ++, завантаженій під час виконання. Я зіткнувся з тією ж помилкою, про яку повідомляє OP.

Я зрозумів, що Visual Studio було запущено з обліковим записом користувача, який не був адміністратором машини. Потім я перезапустив Visual Studio під іншим обліковим записом користувача, який був адміністратором машини. Це все. Мою проблему вирішено, і я більше не стикався з проблемою.

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


0

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

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