Microsoft MVP성태의 닷넷 이야기
오류 유형: 421. System.Runtime.InteropServices.SEHException - 0x80004005 [링크 복사], [링크+제목 복사],
조회: 15547
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
11898정성태5/16/201913999VC++: 130. C++ string의 c_str과 data 함수의 차이점 [3]
11897정성태5/16/201920666오류 유형: 536. Visual Studio - "Developer Pack"을 설치했는데도 "대상 프레임워크" 목록에 나오지 않는 경우 [2]
11896정성태5/15/201915376개발 환경 구성: 440. C#, C++ - double의 Infinity, NaN 표현 방식파일 다운로드1
11895정성태5/12/201913779.NET Framework: 832. ML.NET Model Builder - 회귀(Regression), 다중 분류(Multi-class classification) 예제파일 다운로드1
11894정성태5/10/201914923VS.NET IDE: 135. Visual Studio - ML.NET Model Builder 소개 [5]
11893정성태5/10/201912524오류 유형: 535. C# 6.0 이상의 문법을 컴파일 시 오류가 발생한다면?
11892정성태5/10/201912565웹: 38. HTTP Cookie의 expires 시간 형식(RFC7231)
11891정성태5/9/201915056.NET Framework: 831. (번역글) .NET Internals Cookbook Part 12 - Memory structure, attributes, handles
11890정성태5/8/201910791개발 환경 구성: 439. "Visual Studio Enterprise is required to execute the test." 메시지와 관련된 코드 기록
11889정성태5/8/201911652개발 환경 구성: 438. mstest, QTAgent의 로그 파일 설정 방법
11888정성태5/8/201926897.NET Framework: 830. C# - 비동기 호출을 취소하는 CancellationToken의 간단한 예제 코드 [1]파일 다운로드1
11887정성태5/8/201913382.NET Framework: 829. C# - yield 문을 사용할 수 있는 메서드의 조건
11886정성태5/7/201912436오류 유형: 534. mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류 [2]
11885정성태5/7/20199399오류 유형: 533. mstest.exe 실행 시 "File extension specified '.loadtest' is not a valid test extension." 오류 발생
11884정성태5/5/201913083.NET Framework: 828. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 두 번째 이야기
11883정성태5/3/201917406.NET Framework: 827. C# - 인터넷 시간 서버로부터 받은 시간을 윈도우에 적용하는 방법파일 다운로드1
11882정성태5/2/201914331.NET Framework: 826. (번역글) .NET Internals Cookbook Part 11 - Various C# riddles파일 다운로드1
11881정성태4/28/201914566오류 유형: 532. .NET Core 프로젝트로 마이그레이션 시 "CS0579 Duplicate 'System.Reflection.AssemblyCompanyAttribute' attribute" 오류 발생
11880정성태4/25/201911248오류 유형: 531. 이벤트 로그 오류 - Task Scheduling Error: m->NextScheduledSPRetry 1547, m->NextScheduledEvent 1547
11879정성태4/24/201916490.NET Framework: 825. (번역글) .NET Internals Cookbook Part 10 - Threads, Tasks, asynchronous code and others파일 다운로드2
11878정성태4/22/201914486.NET Framework: 824. (번역글) .NET Internals Cookbook Part 9 - Finalizers, queues, card tables and other GC stuff파일 다운로드1
11877정성태4/22/201914470.NET Framework: 823. (번역글) .NET Internals Cookbook Part 8 - C# gotchas파일 다운로드1
11876정성태4/21/201914272.NET Framework: 822. (번역글) .NET Internals Cookbook Part 7 - Word tearing, locking and others파일 다운로드1
11875정성태4/21/201914638오류 유형: 530. Visual Studo에서 .NET Core 프로젝트를 열 때 "One or more errors occurred." 오류 발생
11874정성태4/20/201914663.NET Framework: 821. (번역글) .NET Internals Cookbook Part 6 - Object internals파일 다운로드1
11873정성태4/19/201913602.NET Framework: 820. (번역글) .NET Internals Cookbook Part 5 - Methods, parameters, modifiers파일 다운로드1
... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...