Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 39. DebugDiag 1.1을 사용한 덤프 분석 [링크 복사], [링크+제목 복사],
조회: 45621
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 6개 있습니다.)
(시리즈 글이 3개 있습니다.)
디버깅 기술: 39. DebugDiag 1.1을 사용한 덤프 분석
; https://www.sysnet.pe.kr/2/0/1026

디버깅 기술: 65. 프로세스 비정상 종료 시 "Debug Diagnostic Tool"를 이용해 덤프를 남기는 방법
; https://www.sysnet.pe.kr/2/0/1786

디버깅 기술: 137. 실제 사례를 통해 Debug Diagnostics 도구가 생성한 닷넷 웹 응용 프로그램의 성능 장애 보고서 설명
; https://www.sysnet.pe.kr/2/0/12067




DebugDiag 1.1을 사용한 덤프 분석

.NET Profiler의 코드를 변경하고, w3wp.exe를 프로파일링하는데 aspx 페이지를 방문하자마자 예외가 발생하면서 프로세스가 죽었습니다. 이벤트 로그에 보니 다음과 같은 오류를 확인할 수 있었는데요.

Log Name:      Application
Source:        Application Error
Date:          4/21/2011 11:53:44 PM
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      MYPC.testad.com
Description:
Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0x0000000000000000
Faulting process id: 0x2d4
Faulting application start time: 0x01cc0033e50aebde
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: unknown
Report Id: 26e854a3-6c27-11e0-9940-00155d00c22a

Log Name:      Application
Source:        Windows Error Reporting
Date:          4/21/2011 11:53:47 PM
Event ID:      1001
Task Category: None
Level:         Information
Keywords:      Classic
User:          N/A
Computer:      MYPC.testad.com
Description:
Fault bucket , type 0
Event Name: BEX64
Response: Not available
Cab Id: 0

Problem signature:
P1: w3wp.exe
P2: 7.5.7601.17514
P3: 4ce7afa2
P4: StackHash_57bc
P5: 0.0.0.0
P6: 00000000
P7: 0000000000000000
P8: c0000005
P9: 0000000000000008
P10: 

Attached files:
C:\Windows\Temp\WER9269.tmp.appcompat.txt
C:\Windows\Temp\WER92C8.tmp.WERInternalMetadata.xml
C:\Windows\Temp\WER92E8.tmp.hdmp
C:\Windows\Temp\WER9B08.tmp.mdmp

...[생략]...

Watson Bucket 정보를 분석해 봐도, 모듈명이 "StackHash_57bc"라니... ^^; 뭔가 단단히 잘못된 모양입니다.

P1(AppName): w3wp.exe
P2(AppVer): 7.5.7601.17514
P3(AppStamp): 4ce7afa2
P4(AsmAndModName): StackHash_57bc
P5(AsmVer): 0.0.0.0
P6(ModStamp): 00000000
P7(MethodDef): 0000000000000000
P8(Offset): c0000005
P9(ExceptionType): 0000000000000008
P10: 

프로세스 덤프를 남길까 하다가, 이번에는 이벤트 로그에 기록되어 있던 C:\Windows\Temp\WER9B08.tmp.mdmp를 분석해 보기로 했습니다. (안 해보던 것을 해봐야죠! ^^)

분석도 windbg로 해볼까 하다가, 역시 예전부터 봐두기만 했던 DebugDiag의 자동 분석 도구를 이용하기로 마음먹었습니다.

우선, Debug Diagnostic Tool v2를 설치하고,

Debug Diagnostic Tool v2 Update 3.2
; https://www.microsoft.com/en-us/download/details.aspx?id=103453

"시작" / "Debug Diagnostics Tool 1.1" / "DebugDiag-AnalysisOnly 1.1" 도구를 실행합니다.

분석을 시작하기 전에, 2가지 설정을 해줍니다.

  1. 마이크로소프트 공용 심벌 서버 설정 (여러분들의 제품에 대한 심벌 서버 설정 포함)
  2. DebugDiag-AnalysisOnly 설정

일단 1번은 DebugDiag-AnalysisOnly도구에서도 설정할 수 있지만 _NT_SYMBOL_PATH를 해두는 것이 편리하기 때문에 아예 환경 변수로 설정해 두는 것이 좋습니다.

Microsoft의 PDB 파일 관리
; https://www.sysnet.pe.kr/2/0/321

2번은, DebugDiag-AnalysisOnly 도구의 "Tools" / "Options & Settings" 메뉴를 선택한 후 "Preferences"에서 다음과 같이 "Include source and line information in analysis reports."를 선택해 줍니다.

debug_analysis_w3wp_1.png

이렇게 설정을 마무리 지은 후에 분석 단계로 넘어가면!

방법은 매우 간단합니다. 다음과 같이 "Crash/Hang Analyzers"를 선택하고, "Add Data Files" 버튼으로 덤프 파일을 지정한 후 "Start Anaylsis" 버튼을 선택해 주면 끝입니다.

debug_analysis_w3wp_2.png

아래는 제 경우에 분석된 결과입니다.

debug_analysis_w3wp_3.png

와~~~ PDB 파일의 도움으로 크래쉬가 발생한 소스 코드 라인 번호까지 보여줍니다. (실제로 제 경우에, 저 위치의 분석으로 문제를 해결할 수 있었습니다.)

아쉬운 점이 하나 있다면, 아직 .NET 응용 프로그램에 대한 분석은 지원되지 않는다는 점입니다. 아래의 글에서도 나오지만,

Debugging a .NET crash with rules in Debug Diag
; http://blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.aspx
; https://www.tessferrandez.com/blog/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.html

.NET 응용 프로그램의 경우에는 대강의 원인 파악만 DebugDiag-AnalysisOnly에서 할 수 있을 뿐, 결국 windbg + sos.dll을 이용하는 것을 볼 수 있습니다.



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/9/2025]

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

비밀번호

댓글 작성자
 



2011-04-25 11시06분
[lancers] 사실 .NET이야 런타임 내부 오류가 아닌 이상은 예외정보가 나오니깐..
DebugDiag가 편리하긴 하더라고요. Crash나 Hang 원인 파악을 하는데는 매우 유용하지요. ^^
(예전 모 사이트에서 이거 덕에 하나 건졌죠..)
[guest]
2011-04-25 04시32분
넵. DebugDiag 결과 보고 쩜 반했습니다. ^^
정성태
2011-04-26 12시41분
[[유수석]] DebugDiag 출력 결과가 WinDbg로 덤프 분석하는 것과 무슨 차이가 있는지 잘 모르겠네요.
WinDbg나 심지어 Visual Studio로도 저 정도의 호출 스택은 보이는데...
궁금해요~ 알려주삼~
[guest]
2011-04-27 10시02분
유수석 님 좋은 지적이십니다. ^^

저도 Visual Studio를 순간적으로 잊은 것 같습니다. VS가 dump 분석을 추가한 이후로 DebugDiag와 스택 덤프에 관해서는 유사한 기능을 가지지 않을까 싶습니다. 대신, windbg 같은 경우에는, 약간의 차이가 있다면 windbg 사용법 및 명령어를 전혀 몰라도 저런 결과를 얻을 수 있다는 점이 틀릴 것 같습니다.

그러고 보니, VS가 정말 좋은 디버거인 것 같습니다. ^^
정성태
2011-04-28 05시40분
참고로, (향후에는 바뀔지 모르지만) 현재 x64/x86 모두 설치하려면, 우선 x64 버전 설치 후 x86을 설치해야 합니다. x86 먼저 설치하면 x64 버전이 설치되지 않습니다.
정성태
2017-07-08 10시37분
정성태
2020-06-08 10시59분
정성태

1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...
NoWriterDateCnt.TitleFile(s)
13566정성태2/27/20249556오류 유형: 897. Windows 7 SDK 설치 시 ".NET Development" 옵션이 비활성으로 선택이 안 되는 경우
13565정성태2/23/20248651닷넷: 2219. .NET CLR2 보안 모델에서의 개별 System.Security.Permissions 제어
13564정성태2/22/202410168Windows: 259. Hyper-V Generation 1 유형의 VM을 Generation 2 유형으로 바꾸는 방법
13563정성태2/21/20249650디버깅 기술: 196. windbg - async/await 비동기인 경우 메모리 덤프 분석의 어려움
13562정성태2/21/20249360오류 유형: 896. ASP.NET - .NET Framework 기본 예제에서 System.Web에 대한 System.IO.FileNotFoundException 예외 발생
13561정성태2/20/202410164닷넷: 2218. C# - (예를 들어, Socket) 비동기 I/O에 대한 await 호출 시 CancellationToken을 이용한 취소파일 다운로드1
13560정성태2/19/202410215디버깅 기술: 195. windbg 분석 사례 - Semaphore 잠금으로 인한 Hang 현상 (닷넷)
13559정성태2/19/202411041오류 유형: 895. ASP.NET - System.Security.SecurityException: 'Requested registry access is not allowed.'
13558정성태2/18/202410197닷넷: 2217. C# - 최댓값이 1인 SemaphoreSlim 보다 Mutex 또는 lock(obj)를 선택하는 것이 나은 이유
13557정성태2/18/20249077Windows: 258. Task Scheduler의 Author 속성 값을 변경하는 방법
13556정성태2/17/20249458Windows: 257. Windows - Symbolic (hard/soft) Link 및 Junction 차이점
13555정성태2/15/20249668닷넷: 2216. C# - SemaphoreSlim 사용 시 주의점
13554정성태2/15/20249091VS.NET IDE: 189. Visual Studio - 닷넷 소스코드 디컴파일 찾기가 안 될 때
13553정성태2/14/20248618닷넷: 2215. windbg - thin/fat lock 없이 동작하는 Monitor.Wait + Pulse
13552정성태2/13/20248743닷넷: 2214. windbg - Monitor.Enter의 thin lock과 fat lock
13551정성태2/12/20249841닷넷: 2213. ASP.NET/Core 웹 응용 프로그램 - 2차 스레드의 예외로 인한 비정상 종료
13550정성태2/11/202410295Windows: 256. C# - Server socket이 닫히면 Accept 시켰던 자식 소켓이 닫힐까요?
13549정성태2/3/202411257개발 환경 구성: 706. C# - 컨테이너에서 실행하기 위한 (소켓) 콘솔 프로젝트 구성
13548정성태2/1/202410819개발 환경 구성: 705. "Docker Desktop for Windows" - ASP.NET Core 응용 프로그램의 소켓 주소 바인딩(IPv4/IPv6 loopback, Any)
13547정성태1/31/202410493개발 환경 구성: 704. Visual Studio - .NET 8 프로젝트부터 dockerfile에 추가된 "USER app" 설정
13546정성태1/30/202410167Windows: 255. (디버거의 영향 등으로) 대상 프로세스가 멈추면 Socket KeepAlive로 연결이 끊길까요?
13545정성태1/30/20249719닷넷: 2212. ASP.NET Core - 우선순위에 따른 HTTP/HTTPS 호스트:포트 바인딩 방법
13544정성태1/30/20249354오류 유형: 894. Microsoft.Data.SqlClient - Could not load file or assembly 'System.Security.Permissions, ...'
13543정성태1/30/20249772Windows: 254. Windows - 기본 사용 중인 5357 포트 비활성화는 방법
13542정성태1/30/20248860오류 유형: 893. Visual Studio - Web Application을 실행하지 못하는 IISExpress - 두 번째 이야기
13541정성태1/29/20249625VS.NET IDE: 188. launchSettings.json의 useSSL 옵션
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...