Microsoft MVP성태의 닷넷 이야기
오류 유형: 421. System.Runtime.InteropServices.SEHException - 0x80004005 [링크 복사], [링크+제목 복사],
조회: 21899
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

System.Runtime.InteropServices.SEHException - 0x80004005

SEHException은 "unmanaged code" 영역에서 발생한 것으로 .NET 예외에는 매핑이 되지 않아 필요한 문맥 정보가 그다지 많지 않습니다.

(여러 가지 발생 상황이 있겠지만) 간단한 예로 다음의 코드로 재현하는 것이 가능합니다.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool CloseHandle(IntPtr hObject);

        static void Main(string[] args)
        {
            int pid = Process.GetCurrentProcess().Id;

            while (true)
            {
                
                try
                {
                    Process proc = Process.GetProcessById(pid);
                    Console.Write(".");
                    CloseHandle(proc.Handle); // 핸들을 닫음
                } catch { }

                // GC.Collect(2, GCCollectionMode.Forced);

                Thread.Sleep(1000);
            }
        }
    }
}

위의 코드를 F5 디버그 모드로 실행하면 어느 순간 다음과 같은 예외가 발생합니다. (또는, 위의 코드에서 주석 처리한 GC.Collect를 해제하면 곧바로 발생합니다.)

System.Runtime.InteropServices.SEHException occurred
  HResult=0x80004005
  Message=External component has thrown an exception.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

-       $exception  {"External component has thrown an exception."} System.Runtime.InteropServices.SEHException
+       Data    {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
        ErrorCode   -2147467259 int
        HResult -2147467259 int
        HelpLink    null    string
+       IPForWatsonBuckets  0x0000000000000000  System.UIntPtr
+       InnerException  null    System.Exception
        IsTransient false   bool
        Message "External component has thrown an exception."   string
        RemoteStackTrace    null    string
        Source  "System"    string
        StackTrace  "   at Microsoft.Win32.SafeNativeMethods.CloseHandle(IntPtr handle)\r\n   at Microsoft.Win32.SafeHandles.SafeProcessHandle.ReleaseHandle()\r\n   at System.Runtime.InteropServices.SafeHandle.InternalFinalize()\r\n   at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)\r\n   at System.Runtime.InteropServices.SafeHandle.Finalize()"   string
+       TargetSite  {Boolean CloseHandle(IntPtr)}   System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
+       WatsonBuckets   {byte[5616]}    object {byte[]}
        _HResult    -2147467259 int
        _className  "System.Runtime.InteropServices.SEHException"   string
+       _data   {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
        _dynamicMethods null    object
+       _exceptionMethod    {Boolean CloseHandle(IntPtr)}   System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
        _exceptionMethodString  null    string
        _helpURL    null    string
+       _innerException null    System.Exception
+       _ipForWatsonBuckets 0x0000000000000000  System.UIntPtr
        _message    "External component has thrown an exception."   string
        _remoteStackIndex   0   int
        _remoteStackTraceString null    string
+       _safeSerializationManager   {System.Runtime.Serialization.SafeSerializationManager} System.Runtime.Serialization.SafeSerializationManager
        _source "System"    string
+       _stackTrace {sbyte[192]}    object {sbyte[]}
        _stackTraceString   null    string
+       _watsonBuckets  {byte[5616]}    object {byte[]}
        _xcode  -532462766  int
+       _xptrs  0x0000000000000000  System.IntPtr
+       Static members      

GC가 수행된 후 연결되는 Finalizer 실행에 의해 발생하는 것이므로 일반적인 call stack 정보를 알아낼 수는 없습니다. 게다가 Finalizer의 수행 시점이 불확실하기 때문에 실제 운영 상황에서는 프로세스가 어느 순간 아무 이유 없이 종료하는 현상처럼 보이게 됩니다.

다행히, 이번처럼 간단한 예제의 경우에는 콜 스택을 통해 Handle 관리가 잘못되었다는 것을 짐작할 수 있으므로 CloseHandle(proc.Handle) 코드를 삭제하는 것으로 해결할 수 있지만, 운이 나쁘면 디버깅에 장난 아닌 시간을 들여야 할지도 모릅니다.

참고로, 위의 코드를 디버거 없이 단독 실행하는 경우에는 SEHException 예외가 발생하지 않습니다. 이걸 다행이라고 해야 할지는 모르겠군요. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 9/14/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  [23]  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13365정성태6/8/202310225오류 유형: 863. MODIFY FILE encountered operating system error 112(failed to retrieve text for this error. Reason: 15105)
13364정성태6/8/202312450.NET Framework: 2127. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 [1]
13363정성태6/7/202312056스크립트: 49. 파이썬 - "Transformers (신경망 언어모델 라이브러리) 강좌" - 1장 2절 코드 실행 결과
13362정성태6/1/202311365.NET Framework: 2126. C# - 서버 측의 요청 제어 (Microsoft.AspNetCore.RateLimiting)파일 다운로드1
13361정성태5/31/202311918오류 유형: 862. Facebook - ASP.NET/WebClient 사용 시 graph.facebook.com/me 호출에 대해 403 Forbidden 오류
13360정성태5/31/202310904오류 유형: 861. WSL/docker - failed to start shim: start failed: io.containerd.runc.v2: create new shim socket
13359정성태5/19/202311483오류 유형: 860. Docker Desktop - k8s 초기화 무한 반복한다면?
13358정성태5/17/202311858.NET Framework: 2125. C# - Semantic Kernel의 Semantic Memory 사용 예제 [1]파일 다운로드1
13357정성태5/16/202311263.NET Framework: 2124. C# - Semantic Kernel의 Planner 사용 예제파일 다운로드1
13356정성태5/15/202312490DDK: 10. Device Driver 테스트 설치 관련 오류 (Code 37, Code 31) 및 인증서 관련 정리
13355정성태5/12/202311642.NET Framework: 2123. C# - Semantic Kernel의 ChatGPT 대화 구현 [1]파일 다운로드1
13354정성태5/12/202312799.NET Framework: 2122. C# - "Use Unicode UTF-8 for worldwide language support" 설정을 한 경우, 한글 입력이 '\0' 문자로 처리
13352정성태5/12/202312089.NET Framework: 2121. C# - Semantic Kernel의 대화 문맥 유지파일 다운로드1
13351정성태5/11/202312615VS.NET IDE: 185. Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅 [1]
13350정성태5/11/202311712오류 유형: 859. Windows Date and Time - Unable to continue. You do not have permission to perform this task
13349정성태5/11/202312119.NET Framework: 2120. C# - Semantic Kernel의 Skill과 Function 사용 예제 [1]파일 다운로드1
13348정성태5/10/202312846.NET Framework: 2119. C# - Semantic Kernel의 "Basic Loading of the Kernel" 예제
13347정성태5/10/202313278.NET Framework: 2118. C# - Semantic Kernel의 Prompt chaining 예제파일 다운로드1
13346정성태5/10/202312617오류 유형: 858. RDP 원격 환경과 로컬 PC 간의 Ctrl+C, Ctrl+V 복사가 안 되는 문제
13345정성태5/9/202314827.NET Framework: 2117. C# - (OpenAI 기반의) Microsoft Semantic Kernel을 이용한 자연어 처리 [1]파일 다운로드1
13344정성태5/9/202315544.NET Framework: 2116. C# - OpenAI API 사용 - 지원 모델 목록 [1]파일 다운로드1
13343정성태5/9/202313230디버깅 기술: 192. Windbg - Hyper-V VM으로 이더넷 원격 디버깅 연결하는 방법
13342정성태5/8/202311954.NET Framework: 2115. System.Text.Json의 역직렬화 시 필드/속성 주의
13341정성태5/8/202311773닷넷: 2114. C# 12 - 모든 형식의 별칭(Using aliases for any type)
13340정성태5/8/202312095오류 유형: 857. Microsoft.Data.SqlClient.SqlException - 0x80131904
13339정성태5/6/202313311닷넷: 2113. C# 12 - 기본 생성자(Primary Constructors)
... 16  17  18  19  20  21  22  [23]  24  25  26  27  28  29  30  ...