Jak należy zdiagnozować błąd SEHException - składnik zewnętrzny zgłosił wyjątek

86

Zawsze, gdy użytkownik zgłosi błąd, taki jak

System.Runtime.InteropServices.SEHException - Składnik zewnętrzny zgłosił wyjątek?

czy jest coś, co ja jako programista mogę zrobić, aby ustalić przyczynę?

Scenariusz: jeden użytkownik (korzystający z programu napisanego przez moją firmę) zgłosił ten błąd. To mógł być jednorazowy błąd lub nie. Wspomnieli, że w ostatnim miesiącu komputer dwukrotnie „przestał działać”. Nauczyłem się z doświadczenia, aby nie brać tego opisu zbyt dosłownie, ponieważ zwykle oznacza to, że ktoś związany z komputerem nie działa zgodnie z oczekiwaniami. Nie mogli podać mi więcej szczegółów i nie mogłem znaleźć żadnych zarejestrowanych błędów. Dlatego mógł to być ten błąd lub nie.

Ze śledzenia stosu, rzeczywisty błąd wystąpił podczas konstruowania klasy, która nie wywołuje bezpośrednio żadnego kodu międzyoperacyjnego, ale może być skomplikowana przez fakt, że obiekt może być częścią listy, która jest powiązana z siecią DevExpress.

Błąd został „przechwycony” przez nieobsługiwaną procedurę wyjątku, która normalnie zamyka program, ale ma opcję zignorowania i kontynuowania. Jeśli zdecydowali się zignorować błąd, program nadal działał, ale błąd wystąpił ponownie po kolejnym uruchomieniu tej procedury. Jednak nie wystąpiło to ponownie po zamknięciu i ponownym uruchomieniu naszej aplikacji.

Omawiany komputer nie wydawał się zestresowany. Działa na systemie Vista Business, ma 2 GB pamięci i według Menedżera zadań zużywał tylko połowę tego z naszą aplikacją, czyli około 200 MB.

Jest jeszcze jedna informacja, która może być istotna lub nie. Inna sekcja tego samego programu wykorzystuje składnik innej firmy, który jest efektywnie opakowaniem dotnet wokół natywnej biblioteki dll i ten składnik ma znany problem, w którym bardzo rzadko pojawia się

Próbowano odczytać lub zapisać chronioną pamięć. Często wskazuje to na uszkodzenie innej pamięci

Twórcy komponentów twierdzą, że zostało to naprawione w najnowszej wersji ich komponentu, którego używamy na miejscu, ale nie zostało to jeszcze przekazane klientowi.

Biorąc pod uwagę, że konsekwencje błędu są niewielkie (żadna praca nie zostanie utracona, a ponowne uruchomienie programu i powrót do miejsca, w którym się znajdowały, zajmuje najwyżej minutę) oraz że klient wkrótce otrzyma nową wersję (ze zaktualizowaną trzecią party), oczywiście trzymam kciuki i mam nadzieję, że błąd się nie powtórzy.

Ale czy jest coś więcej, co mogę zrobić?

sgmoore
źródło

Odpowiedzi:

28

Tak. Ten błąd jest strukturalnym wyjątkiem, który nie został zamapowany na błąd .NET. Prawdopodobnie jest to mapowanie DataGrid, które zgłasza natywny wyjątek, który nie został przechwycony.

Możesz stwierdzić, który wyjątek występuje, patrząc na właściwość ExternalException.ErrorCode . Sprawdziłbym twój ślad stosu i jeśli jest powiązany z siatką DevExpress, zgłosiłbym problem.

Reed Copsey
źródło
1
StackTrace nigdzie nie wspomniał o DevExpress, ale tylko o mojej klasie. Będę musiał sprawdzić, jaki był kod błędu.
sgmoore
W takim przypadku spróbuj dowiedzieć się, co dokładnie spowodowało komunikat o błędzie.
Reed Copsey
4
„patrząc na właściwość ExternalException.ErrorCode” - czy masz jakieś wskazówki, jak dokładnie to zrobić? VS pokazuje mi „Nieobsłużony wyjątek typu„ System.Runtime.InteropServices.SEHException ”wystąpił w .... dll Dodatkowe informacje: Eine externe Komponente hat eine Ausnahme ausgelöst.”, Ale poza aplikacjami C # nie ma łącza aby w dowolnym miejscu spojrzeć na „Szczegóły” obiektu wyjątku.
LUB Mapper
Debugger VSCode pokazuje wystąpienie wyjątku $ w obszarze Locals - obejmuje to pole Message, które zawiera kod i czytelny dla człowieka komunikat o błędzie.
nightblade 9
8

Miałem podobny problem z SEHException, który został wyrzucony, gdy mój program po raz pierwszy użył natywnego opakowania dll. Okazało się, że brakuje natywnej biblioteki DLL dla tego opakowania. Wyjątek nie był w żaden sposób pomocny w rozwiązaniu tego problemu. Ostatecznie pomogło uruchomienie procmon w tle i sprawdzenie, czy podczas ładowania wszystkich niezbędnych bibliotek DLL wystąpiły jakieś błędy.

Maurice Gilden
źródło
3

Twórcy komponentów twierdzą, że zostało to naprawione w najnowszej wersji ich komponentu, którego używamy na miejscu, ale klient już to przekazał.

Zapytaj producenta komponentów, jak sprawdzić, czy problem napotykany przez klienta jest problemem, który, jak twierdzi, naprawił w swojej najnowszej wersji, bez / przed wdrożeniem najnowszej wersji u klienta.

ChrisW
źródło
1

Natknąłem się na ten błąd, gdy aplikacja znajduje się w udziale sieciowym, a urządzenie (laptop, tablet, ...) zostaje odłączone od sieci, gdy aplikacja jest używana. W moim przypadku było to spowodowane wyjściem tabletu Surface z zasięgu bezprzewodowego. Żadnych problemów po zainstalowaniu lepszego WAP.

Conrad
źródło
1
Otrzymywałem to losowo podczas uzyskiwania dostępu do różnych rodzajów odbić (GetAssemblyName, GetProperty, Activator itp.), Zarówno w moim kodzie, jak i bibliotekach stron trzecich, i tylko w jednym środowisku klienta, podobnie z bibliotekami w lokalizacji zdalnej. Wiele dowodów to błąd frameworka .net.
Andriy K,
Andriy K: Nie sądzę, żeby to był problem .NET, myślę, że uchwyty otwieranych plików w udziale sieciowym są w jakiś sposób tracone \ upuszczane, może błąd w systemie Windows lub problem z siecią. Zespoły są mapowane w pamięci i będą stronicowane z dysku na żądanie (bomba zegarowa), prawdopodobnie pamięć może zostać odrzucona również w sytuacjach braku pamięci. Jeśli uchwyty otwartych plików nie są stabilne, prawdopodobnie wybuchnie to z dymem. Być może .NET mógł sobie z tym poradzić i ponownie otworzyć plik (załagodzić problem), ale może to być skomplikowane.
osexpert
Mam ten sam problem. Otrzymuję System.Runtime.InteropServices.SEHException (0x80004005) bez śladu stosu. To jest wyjątek InnerException z TargetInvocationException. TargetInvocationException ma śledzenie stosu, ale nie miało to dla mnie sensu, ponieważ wydawało się, że pochodzi z main lub Application.Run. Dzieje się to bardzo przypadkowo, głównie wieczorami. Chyba jedynym "rozwiązaniem" jest nie uruchamianie z dysku sieciowego: - | Może dodam czek, który może zablokować ten scenariusz: stackoverflow.com/questions/8633680/ ...
osexpert
0

Jeszcze jedna informacja ... Miałem ten problem dzisiaj w systemie Windows 2012 R2 x64 TS, w którym aplikacja została uruchomiona ze ścieżki UNC / sieci. Wystąpił problem dla jednej aplikacji dla wszystkich użytkowników serwera terminali. Lokalne uruchomienie aplikacji przebiegło bez problemów. Po ponownym uruchomieniu ponownie zaczął działać - wyrzucony został SEHException Constructor init i TargetInvocationException


źródło
0

Moje konfiguracje maszyn:

System operacyjny: Windows 10 wersja 1703 (x64)

Napotkałem ten błąd podczas debugowania mojego projektu C # .Net w Visual Studio 2017 Community Edition. Wywoływałem metodę natywną, wykonując p / invoke na zestawie C ++ załadowanym w czasie wykonywania. Napotkałem ten sam błąd zgłoszony przez OP.

Zdałem sobie sprawę, że Visual Studio zostało uruchomione z kontem użytkownika, który nie był administratorem na komputerze. Następnie ponownie uruchomiłem Visual Studio na innym koncie użytkownika, który był administratorem na komputerze. To wszystko. Mój problem został rozwiązany i nie napotkałem go ponownie.

Należy zauważyć, że metoda, która była wywoływana w asemblerze C ++, miała zapisywać kilka rzeczy w rejestrze. Nie poszedłem debugować kodu C ++, aby wykonać RCA, ale widzę możliwość, że wszystko zawodziło, ponieważ uprawnienia administratora są wymagane do napisania rejestru w systemie operacyjnym Windows 10. Tak więc wcześniej, gdy program Visual Studio działał na koncie użytkownika, które nie miało uprawnień administracyjnych na komputerze, wywołania natywne kończyły się niepowodzeniem.

RBT
źródło
0

Wystąpił ten błąd podczas uruchamiania testów jednostkowych dotyczących buforowania pamięci, które konfigurowałem. Zalała pamięć podręczną. Po unieważnieniu pamięci podręcznej i ponownym uruchomieniu maszyny wirtualnej działało dobrze.

atreyHazelHispanic
źródło