SEHException 오류를 진단하는 방법-외부 구성 요소에서 예외가 발생했습니다.


88

사용자가 다음과 같은 오류를보고 할 때마다

System.Runtime.InteropServices.SEHException- 외부 구성 요소에서 예외가 발생 했습니까?

프로그래머로서 제가 원인을 파악하기 위해 할 수있는 일이 있습니까?

시나리오 : 한 사용자 (회사에서 작성한 프로그램 사용)가이 오류를보고했습니다. 이것은 일회성 오류 일 수도 있고 아닐 수도 있습니다. 그들은 지난 달에 컴퓨터가 두 번 '작동을 멈췄다'고 언급했습니다. 나는 경험을 통해 배웠습니다.이 설명을 너무 문자 그대로 받아들이지 않는 것은 일반적으로 컴퓨터와 관련된 누군가가 예상대로 작동하지 않음을 의미하기 때문입니다. 그들은 나에게 더 자세한 정보를 제공 할 수 없었고 기록 된 오류를 찾을 수 없었습니다. 따라서이 오류 일 수도 있고 아닐 수도 있습니다.

스택 추적에서 실제 오류는 interop 코드를 직접 호출하지 않는 클래스를 생성 할 때 발생했지만 개체가 DevExpress Grid에 데이터 바인딩 된 목록의 일부일 수 있다는 사실로 인해 복잡 할 수 있습니다.

일반적으로 프로그램을 종료하지만 무시하고 계속할 수있는 옵션이있는 처리되지 않은 예외 루틴에 의해 오류가 '발견'되었습니다. 오류를 무시하도록 선택한 경우 프로그램은 계속 작동하지만이 루틴이 다음에 실행될 때 오류가 다시 발생했습니다. 그러나 응용 프로그램을 닫고 다시 시작한 후에는 다시 발생하지 않았습니다.

문제의 컴퓨터는 스트레스를받지 않는 것 같았습니다. 그것은 비스타 비즈니스를 실행하고 있으며 2GB의 메모리를 가지고 있으며 작업 관리자에 따르면 약 200Mb에 불과한 우리 응용 프로그램에서 절반 정도만 사용했습니다.

관련성이있을 수도 있고 아닐 수도있는 다른 정보가 있습니다. 동일한 프로그램의 또 다른 섹션은 네이티브 dll 주변의 dotnet 래퍼 인 타사 구성 요소를 사용하며이 구성 요소에는 매우 가끔씩 발생하는 알려진 문제가 있습니다.

보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다.

부품 제조사들은 이것이 우리가 자체적으로 사용하는 최신 버전의 부품에서 수정되었다고 말했지만 아직 고객에게 제공되지 않았습니다.

오류의 결과가 낮고 (작업이 손실되지 않고 프로그램을 다시 시작하고 원래 위치로 돌아가는 데 최대 1 분 밖에 걸리지 않음) 고객이 곧 새 버전을받을 수 있다는 점을 감안할 때 (업데이트 된 세 번째- 파티 구성 요소), 분명히 내 손가락을 교차시킬 수 있으며 오류가 다시 발생하지 않기를 바랍니다.

하지만 내가 할 수있는 일이 더 있습니까?

답변:


28

예. 이 오류는 .NET 오류로 매핑되지 않은 구조화 된 예외입니다. 잡히지 않은 네이티브 예외를 던지는 DataGrid 매핑 일 것입니다.

ExternalException.ErrorCode 속성 을 보면 어떤 예외가 발생했는지 알 수 있습니다 . 스택 추적을 확인하고 DevExpress 그리드에 연결되어 있으면 문제를보고합니다.


1
StackTrace는 어디에서나 DevExpress를 언급하지 않았지만 내 수업 만 언급했습니다. ErrorCode가 무엇인지 확인해야합니다.
sgmoore 2009-08-21

이 경우 오류 메시지가 정확히 무엇이 발생했는지 알아 내십시오.
Reed Copsey

5
"ExternalException.ErrorCode 속성을 살펴보면"-정확히 수행하는 방법에 대한 힌트가 있습니까? VS는 ".... dll에서 'System.Runtime.InteropServices.SEHException'유형의 처리되지 않은 예외가 발생했습니다. 추가 정보 : Eine externe Komponente hat eine Ausnahme ausgelöst."를 표시하지만 예를 들어 C # 응용 프로그램 외에는 링크가 없습니다. 어디에서나 예외 개체의 "세부 정보"를 볼 수 있습니다.
OR Mapper

VSCode의 디버거는 지역 아래에 $ exception 인스턴스를 표시합니다. 여기에는 코드와 사람이 읽을 수있는 오류 메시지가 포함 된 메시지 필드가 포함됩니다.
nightblade9

8

내 프로그램이 처음 네이티브 dll 래퍼를 사용할 때 throw되는 SEHException과 비슷한 문제가 발생했습니다. 해당 래퍼에 대한 기본 DLL이 없음이 밝혀졌습니다. 예외는이 문제를 해결하는 데 전혀 도움이되지 않았습니다. 결국 도움이 된 것은 백그라운드에서 procmon을 실행하고 필요한 모든 DLL을로드 할 때 오류가 있는지 확인하는 것이 었습니다.



3

부품 제조사들은 이것이 우리가 사내에서 사용하는 최신 버전의 부품에서 수정되었다고 말하지만 아직 고객에게 제공되었습니다.

고객에게 최신 버전을 배포하지 않고 또는 배포하기 전에 고객이 겪고있는 문제가 최신 버전에서 수정했다고 말하는 문제인지 여부를 구성 요소 제조업체에게 테스트하는 방법을 문의하십시오.


1

앱이 네트워크 공유에 있고 앱을 사용하는 동안 장치 (노트북, 태블릿 등)가 네트워크에서 연결이 끊어 질 때이 오류가 발생했습니다. 제 경우에는 Surface 태블릿이 무선 범위를 벗어 났기 때문이었습니다. 더 나은 WAP를 설치 한 후 문제가 없습니다.


1
내 코드와 타사 라이브러리에서 그리고 원격 위치의 라이브러리와 마찬가지로 하나의 고객 환경에서 다양한 종류의 리플렉션 (GetAssemblyName, GetProperty, Activator 등)에 액세스하는 동안 무작위로 가져 왔습니다. .net 프레임 워크 버그라는 증거가 많습니다.
Andriy K

Andriy K : 이것이 .NET 문제라고 생각하지 않습니다. 네트워크 공유에서 열린 파일에 대한 핸들이 어떻게 든 손실 / 삭제 된 것 같습니다. Windows의 버그 나 네트워크 문제 일 수 있습니다. 어셈블리는 메모리 매핑되고 요청시 디스크에서 페이징됩니다 (시한 폭탄). 메모리가 부족한 상황에서도 메모리를 삭제할 수 있습니다. 열린 파일 핸들이 안정적이지 않으면 연기가 날 수 있습니다. .NET이이 파일을 처리하고 파일을 다시 열 수 있었을 수도 있지만 (문제가 해결됨) 복잡 할 수 있습니다.
osexpert 2018

나도 같은 문제를 안고있어. 스택 추적없이 System.Runtime.InteropServices.SEHException (0x80004005)이 발생합니다. 이것은 TargetInvocationException의 InnerException입니다. TargetInvocationException에는 스택 추적이 있지만 main 또는 Application.Run에서 온 것처럼 보이므로 이해가되지 않았습니다. 주로 저녁 \ 밤에 매우 무작위로 발생합니다. 유일한 "솔루션"은 네트워크 드라이브에서 실행되지 않는 것 같습니다 :-| 이 시나리오를 차단할 수있는 검사를 추가 할 수 있습니다. stackoverflow.com/questions/8633680/…
osexpert

0

또 다른 정보 일뿐입니다. 응용 프로그램이 unc / network 경로에서 시작된 Windows 2012 R2 x64 TS 시스템에서 오늘 문제가 발생했습니다. 이 문제는 모든 터미널 서버 사용자에 대해 하나의 응용 프로그램에서 발생했습니다. 응용 프로그램을 로컬에서 실행하면 문제없이 작동했습니다. 재부팅 후 다시 작동하기 시작했습니다. SEHException이 throw 된 것은 Constructor init 및 TargetInvocationException이었습니다.


0

내 컴퓨터 구성 :

운영 체제 : Windows 10 버전 1703 (x64)

Visual Studio 2017 Community Edition에서 C # .Net 프로젝트를 디버깅하는 동안이 오류가 발생했습니다. 런타임에로드 된 C ++ 어셈블리에서 p / invoke를 수행하여 네이티브 메서드를 호출했습니다. OP에서보고 한 것과 동일한 오류가 발생했습니다.

Visual Studio가 컴퓨터의 관리자가 아닌 사용자 계정으로 시작되었음을 깨달았습니다. 그런 다음 컴퓨터의 관리자 인 다른 사용자 계정으로 Visual Studio를 다시 시작했습니다. 그게 다야. 내 문제가 해결되었고 다시 문제에 직면하지 않았습니다.

한 가지 주목할 점은 C ++ 어셈블리에서 호출되는 메서드가 레지스트리에 몇 가지 사항을 작성해야한다는 것입니다. 일부 RCA를 수행하기 위해 C ++ 코드를 디버깅하지 않았지만 Windows 10 운영 체제에서 레지스트리를 작성하려면 관리자 권한이 필요하기 때문에 모든 것이 실패 할 가능성이 있습니다. 따라서 이전에 Visual Studio가 컴퓨터에 대한 관리 권한이없는 사용자 계정으로 실행될 때 네이티브 호출이 실패했습니다.


0

설정 한 메모리 캐싱에서 단위 테스트를 실행하는 동안이 오류가 발생했습니다. 캐시가 넘쳤습니다. 캐시를 무효화하고 VM을 다시 시작한 후 정상적으로 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.