Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 11개 있습니다.)
디버깅 기술: 6. .NET 예외 처리 정리
; https://www.sysnet.pe.kr/2/0/316

디버깅 기술: 15. First-Chance Exception
; https://www.sysnet.pe.kr/2/0/510

디버깅 기술: 16. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석
; https://www.sysnet.pe.kr/2/0/595

.NET Framework: 110. WPF - 전역 예외 처리
; https://www.sysnet.pe.kr/2/0/614

디버깅 기술: 31. Windbg - Visual Studio 디버그 상태에서 종료해 버리는 응용 프로그램
; https://www.sysnet.pe.kr/2/0/957

디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
; https://www.sysnet.pe.kr/2/0/1096

.NET Framework: 534. ASP.NET 응용 프로그램이 예외로 프로세스가 종료된다면?
; https://www.sysnet.pe.kr/2/0/10863

디버깅 기술: 110. 비동기 코드 실행 중 예외로 인한 ASP.NET 프로세스 비정상 종료 현상
; https://www.sysnet.pe.kr/2/0/11383

디버깅 기술: 119. windbg 분석 사례 - 종료자(Finalizer)에서 예외가 발생한 경우 비정상 종료(Crash) 발생
; https://www.sysnet.pe.kr/2/0/11732

닷넷: 2148. C# - async 유무에 따른 awaitable 메서드의 병렬 및 예외 처리
; https://www.sysnet.pe.kr/2/0/13422

닷넷: 2213. ASP.NET/Core 웹 응용 프로그램 - 2차 스레드의 예외로 인한 비정상 종료
; https://www.sysnet.pe.kr/2/0/13551




Windbg - Visual Studio 디버그 상태에서 종료해 버리는 응용 프로그램

개인적으로 Windbg는 여전히 낯설기만 합니다. 그만큼 Visual Studio의 편리한 디버깅에 익숙해져 있다는 것인데요. ^^ 그래도, 가끔은 어쩔 수 없이 사용하는 경우가 있는데, 이번 사례가 바로 그에 해당합니다.

오늘은 소스 코드 리팩토링과 함께 DLL 이름도 좀 정리를 했는데, 불행히도 Visual Studio IDE에서 'F5 디버깅'을 시작하고 aspx 웹 페이지가 실행되려는 부분 즈음, 곧바로 WebDev 프로세스가 다운되고 Visual Studio의 디버깅 상태가 해제되었습니다.

"Output" 창에는 아래와 같이 WebDev 종료만 기록될 뿐 이외의 도움이 될만한 아무런 정보를 찾을 수가 없었습니다.

...[생략: DLL 로딩]...
'WebDev.WebServer20.EXE' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_MSIL\MyTest\1.0.1.0__rhaasdf44088eb\MyTest.dll'
The program '[5240] WebDev.WebServer20.EXE: Managed (v2.0.50727)' has exited with code -532459699 (0xe0434f4d).

어디, 이벤트 로그를 한번 볼까요?

Fault bucket , type 0
Event Name: CLR20r3
Response: Not available
Cab Id: 0

Problem signature:
P1: webdev.webserver20.exe
P2: 10.0.0.0
P3: 4ba204ca
P4: WebDev.WebHost20
P5: 10.0.0.0
P6: 4ba204c2
P7: 56
P8: 51
P9: Exception
P10: 

Attached files:
...[생략]...

위의 Watson bucket들에 대한 해석은 다음을 참고하십시오.

Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석
; https://www.sysnet.pe.kr/2/0/595

예전에도 소개해 드렸던 아래의 글처럼, Watson bucket 정보가 도움이 안 되는 경우들이 있는데요.

System.MissingMethodException
; https://www.sysnet.pe.kr/2/0/909

이번에도 마찬가지입니다. "P1: webdev.webserver20.exe" 값만 보아도 우리가 만든 코드가 아닌 webdev 안에서 예외가 있다고 하니 그다지 도움되는 사항은 아닙니다.

이쯤 되면, Windbg는 더 이상 피하고 싶은 상대가 아니라, 이나마도 기댈 곳이 있다는 사실에 저절로 감사의 마음마저 생깁니다. ^^ 문제 해결의 난이도는 그 원인에 의존적인데, 다행히 제 경우에는 어렵지 않은 쪽이었습니다. 어디, 같이 한번 해볼까요? ^^

우선, WebDev 프로세스를 Windbg에서 디버깅하려면, "File" / "Open Executable" 메뉴에서 다음과 같이 실행 파일 환경 값을 입력해 주어야 합니다.

File name: "C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer20.exe"
Arguments: /port:[포트명] /path:[웹 사이트 폴더 경로] /vpath:"[프로젝트에 설정된 웹 루트 경로]" 

제 경우에는 다음과 같이 설정되었습니다.

File name: "C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer20.exe"
Arguments: /port:19448 /path:"D:\...[생략]...\WebSiteTest" /vpath:"/" 

확인하고 나면, 프로세스가 시작되자마자 멈추게 되고, "g" 키를 눌러서 예외가 발생할 때까지 실행되도록 진행시킵니다. 잠시 후, 다음과 같이 예외가 발생하게 되고 Windbg 환경이므로 디버기(WebDev)는 Visual Studio에서 그랬던 것과는 다르게, 종료 수순까지 가지 못하고 멈추게 됩니다. 바로 이 능력 때문에 Windbg를 사용해서 문제 해결이 가능하지요. ^^ (물론, Visual Studio 내에서도 'F10' 키를 이용해서 시작부터 디버깅을 건 다음 단계별로 추적해 나갈 수 있지만, 역시나 이런 상황에서는 'F5'와 동일한 'g' 키를 이용할 수 있다는 것이 Windbg의 장점이겠지요. ^^)

ModLoad: 53510000 53528000   MyTest.dll
ModLoad: 0cd00000 0cd18000   MyTest.dll
ModLoad: 53510000 53528000   C:\Windows\assembly\GAC_MSIL\MyTest\1.0.1.0__rhaasdf44088eb\MyTest.dll
(1b04.195c): C++ EH exception - code e06d7363 (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): C++ EH exception - code e06d7363 (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): C++ EH exception - code e06d7363 (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): C++ EH exception - code e06d7363 (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (first chance)
(1b04.195c): CLR exception - code e0434f4d (!!! second chance !!!)
eax=0807de48 ebx=e0434f4d ecx=00000001 edx=00000000 esi=0807ded0 edi=06c68a38
eip=7638b727 esp=0807de48 ebp=0807de98 iopl=0         nv up ei pl nz ac pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000216
KERNELBASE!RaiseException+0x58:
7638b727 c9              leave

닷넷 환경이므로, 다음의 명령어를 통해 SOS.dll을 로드시킵니다.

.loadby sos mscorwks

현재, 예외가 발생해서 멈춘 것이므로 "!printexception" 명령문으로 어떤 예외가 발생했는지 확인해 봅니다.

0:006> !printexception
Exception object: 02cc80ec
Exception type: System.TypeInitializationException
Message: The type initializer for 'MyTest.TestApp' threw an exception.
InnerException: System.IO.FileNotFoundException, use !PrintException 02cc83a4 to see more
StackTrace (generated):
    SP       IP       Function
    0807F6B0 08E61F2D WebDev_WebHost20!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(System.Object)+0x7d
    0807F6C4 077D2F0F mscorlib!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(System.Object)+0x2f
    0807F6CC 077D2DCA mscorlib!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)+0x5a
    0807F6E4 077D2D59 mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback)+0x51
    0807F6F8 077D2BF5 mscorlib!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object)+0x5d

StackTraceString: <none>
HResult: 80131534

그렇군요. .cctor에서 예외가 발생했는데, 간혹 이런 경우 강제 종료로까지 이어지기도 합니다. 개인적인 경험상, .cctor에 기능을 집어넣는 것이 여간 조심스럽지 않습니다. 왜냐하면, 문제가 발생했을 때 일반 메서드의 상황과 비교해서 추적이 어려워지기 때문입니다.

아무튼, 현재 보고 있는 예외 개체 타입은 "System.TypeInitializationException"이고, 그 인스턴스는 "02cc80ec" 값입니다. 다행히 InnerException을 가지고 있는데 그 값은 "02cc83a4"이고 친절하게도 Windbg에서 "use !PrintException 02cc83a4 to see more"라고 까지 메시지를 출력해 주고 있습니다. 이번 경우처럼 cctor에서 발생한 예외에서 InnerException은 실질적인 오류 상황을 보여주므로 파고들어가봐야 합니다.

0:006> !PrintException 02cc83a4
Exception object: 02cc83a4
Exception type: System.IO.FileNotFoundException
Message: Could not load file or assembly 'SecondLib, Version=1.0.1.0, Culture=neutral, PublicKeyToken=rhaasdf44088eb' or one of its dependencies. The system cannot find the file specified.
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80070002

아하, 답이 나왔군요. 리팩터링 과정에서 파일명을 바꿨는데, 참조한 측에서는 이름이 바뀐 것을 프로젝트 참조해서 빌드 시 오류가 발생하지 않았던 반면 실행 시에 GAC에 등록되어 있지 않아서 예외가 발생한 것이었습니다. SecondLib.dll 등록을 잊었던 것이지요. 하지만, Visual Studio의 디버거 창에서는 이와 관련된 어떠한 정보도 얻을 수 없었지만, Windbg로 하는 경우에는 이렇게 정상적으로 디버깅을 할 수 있어서 문제 해결이 쉬웠던 것입니다.

음... 디바이스 드라이버 개발자가 아니더라도, Windbg는 분명 닷넷 개발자에게도 친해져야 할 대상입니다. ^^



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







[최초 등록일: ]
[최종 수정일: 6/27/2021]

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

비밀번호

댓글 작성자
 



2010-12-06 11시59분
[땡초] 친해지고 시퍼영~~~~~~~~~~~~~~~~
[guest]
2019-01-24 04시25분
정성태
2020-06-25 09시32분
Time Travel Debugging을 사용한 윈도우즈 리버스 엔지니어링 1
; https://learn.darungrim.com/contents/time-travel-debugging-01.html#disqus_thread

------------------------------------

Using GDB to time travel
; https://developers.redhat.com/articles/2024/08/08/using-gdb-time-travel
정성태

... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12587정성태4/6/202121081개발 환경 구성: 564. Windows 10 - ClickOnce 배포처럼 사용할 수 있는 MSIX 설치 파일 [1]
12586정성태4/5/202117947오류 유형: 710. Windows - Restart-Computer / shutdown 명령어 수행 시 Access is denied(E_ACCESSDENIED)
12585정성태4/5/202116903개발 환경 구성: 563. 기본 생성된 kubeconfig 파일의 내용을 새롭게 생성한 인증서로 구성하는 방법
12584정성태4/1/202118077개발 환경 구성: 562. kubeconfig 파일 없이 kubectl 옵션만으로 실행하는 방법
12583정성태3/29/202119002개발 환경 구성: 561. kubectl 수행 시 다른 k8s 클러스터로 접속하는 방법
12582정성태3/29/202118393오류 유형: 709. Visual C++ - 컴파일 에러 error C2059: syntax error: '__stdcall'
12581정성태3/28/202118370.NET Framework: 1031. WinForm/WPF에서 Console 창을 띄워 출력하는 방법 (2) - Output 디버깅 출력을 AllocConsole로 우회 [2]
12580정성태3/28/202116209오류 유형: 708. SQL Server Management Studio - Execution Timeout Expired.
12579정성태3/28/202116797오류 유형: 707. 중첩 가상화(Nested Virtualization) - The virtual machine could not be started because this platform does not support nested virtualization.
12578정성태3/27/202117235개발 환경 구성: 560. Docker Desktop for Windows 기반의 Kubernetes 구성 (2) - WSL 2 인스턴스에 kind가 구성한 k8s 서비스 위치
12577정성태3/26/202118896개발 환경 구성: 559. Docker Desktop for Windows 기반의 Kubernetes 구성 - WSL 2 인스턴스에 kind 도구로 k8s 클러스터 구성
12576정성태3/25/202116923개발 환경 구성: 558. Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성 (2) - k8s 서비스 위치
12575정성태3/24/202115498개발 환경 구성: 557. Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성 [1]
12574정성태3/23/202121008.NET Framework: 1030. C# Socket의 Close/Shutdown 동작 (동기 모드)
12573정성태3/22/202118411개발 환경 구성: 556. WSL 인스턴스 초기 설정 명령어 [1]
12572정성태3/22/202117738.NET Framework: 1029. C# - GC 호출로 인한 메모리 압축(Compaction)을 확인하는 방법파일 다운로드1
12571정성태3/21/202115783오류 유형: 706. WSL 2 기반으로 "Enable Kubernetes" 활성화 시 초기화 실패 [1]
12570정성태3/19/202121093개발 환경 구성: 555. openssl - CA로부터 인증받은 새로운 인증서를 생성하는 방법
12569정성태3/18/202121462개발 환경 구성: 554. WSL 인스턴스 export/import 방법 및 단축 아이콘 설정 방법
12568정성태3/18/202114798오류 유형: 705. C# 빌드 - Couldn't process file ... due to its being in the Internet or Restricted zone or having the mark of the web on the file.
12567정성태3/17/202116859개발 환경 구성: 553. Docker Desktop for Windows를 위한 k8s 대시보드 활성화 [1]
12566정성태3/17/202116669개발 환경 구성: 552. Kubernetes - kube-apiserver와 REST API 통신하는 방법 (Docker Desktop for Windows 환경)
12565정성태3/17/202113428오류 유형: 704. curl.exe 실행 시 dll not found 오류
12564정성태3/16/202114289VS.NET IDE: 160. 새 프로젝트 창에 C++/CLI 프로젝트 템플릿이 없는 경우
12563정성태3/16/202117164개발 환경 구성: 551. C# - JIRA REST API 사용 정리 (3) jira-oauth-cli 도구를 이용한 키 관리
12562정성태3/15/202117935개발 환경 구성: 550. C# - JIRA REST API 사용 정리 (2) JIRA OAuth 토큰으로 API 사용하는 방법파일 다운로드1
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...